Kim Hyeong
지금까지 배운 DI 와 IoC 정리 본문
지금까지 배운 DI 와 IoC 정리
- 하나의 객체가 다른 객체를 코드상에서 명시적으로 생성하지 않게 하려고 XML 파일내에 써서 작업을 수행한다.
- 즉 객체를 Composition 방식으로 사용하면 객체간의 관계가 서로 밀접해진다.(tightly coupled) -> 클래스 간의 친밀도가 높아져 재사용하기가 힘들어짐.
- 이를 해결하기위해 객체의 사용을 Aggregation 방식을 사용해야 한다.
- 객체를 서로 조립을 하려면 조립자가 있어야한다. 이 조립자 역할을 Spring이 한다. -> IoC Container 라고 불린다.
- IoC 라는것을 하기 위해서 즉 다시말해서 의존성이 있는 객체를 다른 객체에 넣어주기 위한 작업을 해야하는데 이를 Injection 이라고 한다.
- 이 Injection은 또 Setter Injection과 Constructor Injection 방법으로 나뉜다.
XML 파일로 DTO , ArrayList, HashMap을 만들어 보자 .
- 간단한 예제를 통해 XML 문서를 작성해서 DI와 IoC하는 작업을 수행 해보자.
//Main
package exam_02_04_BookShelf;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
String config = "classpath:applicationCtx.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(config);
//Bookshelf 클래스 타입인 shelf 객체를 끄집어냄
BookShelf shelf = ctx.getBean("shelf",BookShelf.class);
System.out.println("책장 title : " + shelf.getTitle());
System.out.println("책장 price : " + shelf.getPrice());
//shelf에서 getList를 통해 ArrayList를 뽑아내고 그 ArrayList 안에서 인덱스 1인 BookDTO를 뽑아내서
//title값을 알아낸다.
System.out.println(shelf.getList().get(1).getBtitle());
//shelf에서 getMap을 통해 HashMap을 뽑아내고 그 HashMap 안에서
//key 값이 2인 BookDTO를 찿아서 책의 제목을 출력
System.out.println(shelf.getMap().get(2).getBtitle());
}
}
package exam_02_04_BookShelf;
import java.util.ArrayList;
import java.util.HashMap;
import exam_02_04_BookShelf.dto.BookDTO;
public class BookShelf {
private String title; //책장명
private int price; //책장가격
private ArrayList<BookDTO> list;
private HashMap<Integer,BookDTO> map;
//생성자 injtection 방식으로 2개의 필드 설정
public BookShelf(String title, ArrayList<BookDTO> list)
{
this.title = title;
this.list = list;
}
public void setPrice(int price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ArrayList<BookDTO> getList() {
return list;
}
public void setList(ArrayList<BookDTO> list) {
this.list = list;
}
public int getPrice() {
return price;
}
public HashMap<Integer, BookDTO> getMap() {
return map;
}
public void setMap(HashMap<Integer, BookDTO> map) {
this.map = map;
}
}
//DTO
package exam_02_04_BookShelf.dto;
public class BookDTO {
//필드는 특별한 이유가 있지 않는한 information hiding때문에
//private으로 설정한다.
private String btitle;
private String bauthor;
//기본 constructor는 사용하던 사용하지 않던간에 반드시 명시를 해 주세요!!
public BookDTO()
{
}
//private 필드에 대한 getter/setter
public String getBtitle() {
return btitle;
}
public void setBtitle(String btitle) {
this.btitle = btitle;
}
public String getBauthor() {
return bauthor;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- Spring 컨테이너에 의해 3개의 책 DTO가 생성. -->
<bean id = "book1"
class = "exam_02_04_BookShelf.dto.BookDTO">
<property name ="btitle">
<value> 젊은 베르테르의 슬픔</value>
</property>
<property name="bauthor">
<value>괴테</value>
</property>
</bean>
<bean id = "book2"
class = "exam_02_04_BookShelf.dto.BookDTO">
<property name ="btitle">
<value>개미</value>
</property>
<property name="bauthor">
<value>베르나르 베르베르</value>
</property>
</bean>
<bean id = "book3"
class = "exam_02_04_BookShelf.dto.BookDTO">
<property name ="btitle">
<value> 레미제라블</value>
</property>
<property name="bauthor">
<value>빅토르 위고</value>
</property>
</bean>
<!-- XML로 ArrayList , HashMap 만들기 -->
<!-- NamesSpace 에서 util 체크 필요함 -->
<!-- ArrayList 안에 BookDTo를 넣음 -->
<util:list id = "bookList" value-type="exam_02_04_BookShelf.dto.BookDTO">
<ref bean = "book1"></ref>
<ref bean = "book2"></ref>
<ref bean = "book3"></ref>
</util:list>
<util:map id ="bookMap" map-class="java.util.HashMap"
key-type="java.lang.Integer"
value-type="exam_02_04_BookShelf.dto.BookDTO">
<entry key="1" value-ref="book1"></entry>
<entry key="2" value-ref="book2"></entry>
<entry key="3" value-ref="book3"></entry>
</util:map>
<bean id ="shelf"
class="exam_02_04_BookShelf.BookShelf">
<constructor-arg value="만화책장" />
<constructor-arg ref="bookList" />
<!-- setter로 injection 하기 -->
<property name="price" value = "10000"> </property>
<property name="map">
<ref bean="bookMap"/>
</property>
</bean>
</beans>
Bean 객체는 도대체 무엇인가?
- bean 객체는 도대체 그럼 무엇인가?
- bean 객체는 일반객체가 아니다. 스프링에 의해 제어가되는 객체이다.
- 아래 코드를 보자, xml 파일에 기입되어있는 bean 객체를 getBean() 메서드를 이용해 끄집어내 사용한다.
- xml에 기입되어있는 scope에 따라 객체의 생성 방식이 약간씩 다르다.
- scope=singleton 이면 객체가 딱 하나만 존재, scope=prototype이면 getBean() 할때마다 새로운 객체 생성
String config = "classpath:applicationCtx.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(config);
//BookDTO 클래스 타입인 book1 빈 객체를 끄집어 냄
//xml에 scope가 singleton으로 지정되있으면 두 객체 dto1과 dto2는 같다.
//xml에 scope가 prototype으로 지정되어있으면 getBean() 할때마다 새로운 객체를 생성한다.
//따라서 dto1과 dto2는 다른 객체이다. -> scope에 따라 객체가 같냐 다르냐가 결정됨
BookDTO dto1 = ctx.getBean("book1",BookDTO.class);
BookDTO dto2 = ctx.getBean("book1",BookDTO.class);
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- Spring 컨테이너에 book1 bean 객체 생성 -->
<!-- scope는 디폴트로 singleton, 싱글톤이란 객체가 딱 하나만 존재하는것 getBean()을 여러번해도 동일한 객체 -->
<!-- scope="prototype" 으로 하면 메인에서 getBean()을 호출할떄마다 새로운 객체를 생성-->
<bean id = "book1"
class = "exam_02_04_BookShelf.dto.BookDTO"
scope="singleton">
<property name ="btitle">
<value> 젊은 베르테르의 슬픔</value>
</property>
<property name="bauthor">
<value>괴테</value>
</property>
</bean>
</beans>
'Spring' 카테고리의 다른 글
스프링 MVC 흐름과 주요 구성 컴포넌트 (0) | 2018.08.16 |
---|---|
Spring Framework의 기본적인 개념 (0) | 2018.08.10 |
DI의 Life Cycle (0) | 2018.08.10 |
Spring Framework 실습 - Java Class를 이용한 방식 (0) | 2018.08.10 |
Spring Framework 실습 - XML을 이용한 방식 (1) | 2018.08.10 |
Comments