Hyokyun Yim bio photo

Hyokyun Yim

Koreatech Computer Science Engineering undergraduate 4 grade.

Facebook Github

간단한 예제를 통해 XML 문서를 작성해서 DI와 IoC하는 작업을 수행 해보자.

Overview

지금까지 배운 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>