Java2EE Framework/Spring 2.0

스프링 IoC방식인 DI 적용 방법

본클라쓰 2010. 6. 3. 08:54

■ Setter Injection


 Setter Injection은 클래스 사이의 의존관계를 연결시키기 위해 setter 메소드를 이용하는 방법이다.

 

public class SimpleMovieListener {
 
    // SimpleMovieLister 클래스는 MovieFinder 클래스에 의존적이다.
    private MovieFinder movieFinder;
 
    // setter method Inject를 통해 MovieFinder 삽입
    public void setMoiveFinder ( MovieFinder movieFinder ){
        this.movieFinder = movieFinder;
    }
    // 비즈니스 로직 작성
}

 

 SimpleMovieListener 클래스는 has-a 관계로 MovieFinder 클래스를 가지고 있다. 하지만 위 코드어디에도 객체 생성을 위한 코드는 보이지 않는다. 이제 설정 데이터로 객체간의 의존성을 정의해 보겠다.

 

<bean id="movieFinder" class="example.MovieFinder"/>
<bean id="simpleMovieLister" class="example.SimpleMovieLister" >
    <property name="movieFinder" ref="movieFinder" />
</bean>

 

 이 때 의존관계를 설정하는  <property name="movieFinder" ref="movieFinder" /> 이 부분은 <property name="movieFinder"><ref bean="movieFinder"/></property> 사용해도 된다. 위와 같이 설정을 통해 객체를 전달한다. setMoiveFinder() 메소드와 <property name="movieFinder" ref="movieFinder" /> 이 부분이 객체의 의존관계를 연결시키는 부분이다. 즉, setter 메소드를 통해 객체를 전달한다.

 

 

■ Constructor Injection


이 방법은 생성자를 통해 객체를 연결시키는 방법이다.

 

public class SimpleMovieLister {
 
    // SimpleMovieLister 는 MovieFinder 와 의존관계를 가지고 있다.
    private MovieFinder movieFinder;

 

    // 생성자를 통한 Inject
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
 
    // 비즈니스 로직 작성

}

 

Constructor Injection 은 다음과 같이 설정한다.

 

<bean id="movieFinder" class="example.MovieFinder"/>
<bean id="simpleMovieLister" class="example.SimpleMovieLister">
    <constructor-arg><ref bean="movieFinder" /></contructor-arg>
</bean>


 의존관계를 설정하는 <constructor-arg><ref bean="movieFinder" /></contructor-arg> 부분은 <constructor-arg ref="movieFinder"/> 해도 된다. 이 때, 의존관계를 정의하는 <ref> 태그는 두 종류가 있고 각 특성은 다음과 같다.

 

<ref bean="someBean"/> : 같은 컨테이너에 있는 어떤 빈이라도 연결
<ref local="someBean"/> : 같은 xml 설정 데이터에 있는 빈을 연결


 

■ method Injection

 

 method Injection 은 setter Injection 과 constructor Injection 이 가지고 있는 한계점을 극복하기 위해 스프링 프레임워크 1.1 버전부터 새롭게 지원하고 있는 DI의 한 종류이다.

 

 스프링 프레임워크는 애플리케이션이 시작될 때 빈 설정 파일에 저장되어 있는 정보를 읽어 초기화하는 과정을 한 번 실행하게 된다. 그런데 스프링 프레임워크가 기본적으로 빈의 인스턴스를 관리하는 방식은 싱글턴(Singleton)이다. 싱글턴으로 객체의 인스턴스를 한번 생성하면 이 객체는 인스턴스 재생성 없이 계속해서 재사용된다.

 

 만약 이 상태에서 싱글턴 인스턴스와 Non 싱글턴 인스턴스의 의존관계를 연결할 필요성이 생긴다면 어떻게 될까? 싱글턴 인스턴스와 Non 싱글턴 인스턴스가 의존관계로 엮인다고 하더라도 Non 싱글턴 인스턴스는 항상 싱글턴 인스턴스처럼 사용되는 문제점을 가지게 된다. 이와 같은 문제점을 해결하기 위한 방법으로 method Injection 이 탄생하게 되었다. method Injection은 싱글턴 인스턴스와 Non 싱글턴 인스턴스의 의존관계를 연결시킬 필요가 있을 때 사용할 수 있는 DI의 한 종류이다.