2012. 2. 22.

IoC (Inversion of Control) & Spring IoC

* 본 포스트의 내용은 [토비의 스프링3] 내용에서 발췌된 것이다.

What is IoC (Inversion of Control)?

프로그램의 제어 흐름 구조가 뒤바뀌는 .
일반적으로, main() 같은 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정하고생성하고만들어진 오브젝트내의 메소드를 호출하고 하는 작업이 반복된다이런 프로그램 구조에서  오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다.

제어의 역전(IoC)이란제어 흐름의 개념을 거꾸로 뒤집는 것이다오브젝트는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않는다또한 자신도 어떻게 만들어지고 어디서 사용되는지 알수 없다모든 제어 권한을 자신이 아닌 다른 대상에게 위임한다프로그램의 시작을 담당하는 main()같은 엔트리 포인트를 제외하면 모든 오브젝트는 이렇게 위임받은 제어 권한을 갖는특별한 오브젝트에 의해 결정되고 만들어 진다단지 스프링에서 사용되는 개념이 아니고매우 폭넓게 사용되는 프로그래밍모델이다.

- 작업을 수행하는 쪽에서 Object 를 생성하는 제어 흐름의 개념을 거꾸로 뒤집는다.
- IoC 에서는 Object  가 자신이 사용할 Object 를 생성하거나 선택하지 않는다.
- 또한 Object 는 자신이 어떻게 생성되고 어떻게 사용되는지 알 수 없다.
- 모든 Object  는 제어 권한을 위임받는 특별한  Object 에 의해서 만들어 지고 사용된다. 



IoC 개념이 녹아 있는 Example
 

1.  servlet 과 container.
 : 서블릿에 대한 제어권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 오브젝트를 만들고 그 안의 메소드를 호출한다. 


2. Template Method Pattern (Design Pattern)
: 역시 제어권을 상위 템플릿 메소드에 넘기고 서브 클래스는 필요할 때 호출되어 사용되는 개념.


3. Framework
 : 라이브러리를 사용하는 어플리케이션은 어플리케이션의 흐름을 직접 제어하지만,  프레임워크는 애플리케이션 코드가 프레임워크에 의해서 사용된다. 보통 프레임워크 위에 개발한 클래스를 등록해 두고, 프레임워크가 흐름을 주도하는 중에 개발자의 어플리케이션 코드를 사용하도록 만드는 방식이다. 즉, 제어의 역전 개념이 적용되어 있어야 한다.


스프링 IoC 용어 정리

* bean
스프링에서 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 bean 이라 부른다자바빈, EJB 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트를 말한다하지만 스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 빈은아니다스프링의 빈은 스프링 컨테이너가 생성과 관계설정사용등을 제어해주는 오브젝트를 가리킨다.

* bean factory
스프링의 IoC 담당하는 핵심 컨테이너를 가리킨다빈을 등록/생성/조회/반환/관리한다보통은 bean factory  바로 사용하지 않고 이를 확장한 application context  이용한다. BeanFactory  bean factory  구현하는 interface 이다. (getBean()등의 메소드가 정의되어 있음)

* application context
bean factory 확장한 IoC 컨테이너이다빈의 등록/생성/조회/반환/관리의 기능은 bean factory  같지만여기에 spring 각종 부가 서비스를 추가로 제공한다. ApplicationContext application context 구현해야 하는 interface이여, BeanFactory  상속한다.
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,
       MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...

설정정보/설정 메타정보 configuration metadata
application context 혹은  bean factory  IoC 적용하기 위해 사용하는 메타정보이다스프링의 설정정보는 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만 주로 bean  생성/구성하는 용도로 사용된다.

* container (IoC container)
IoC 방식으로 bean 관리한다는 의미에서 bean factory  application context  가리킨다. (spring container = application context) application context  자체로 ApplicationContext 인터페이스를 구현한 오브젝트를 가리키기도 하는데하나의 애플리케이션에 보통 여러개의 ApplicationContext Object 만들어진다이를 통칭해서 strping container라고 부를  있다.

* spring framework
spring framework  IoC container, application context  포함해서 spring 제공하는 모든 기능을 통칭할때 주로 사용된다




Sample Code 가정













What is DI (Dependency Injection) ?

- Spring이 지원하는 IoC방식을 좀더 명확히 설명.
- dependent object(의존 오브젝트) : 사용 대상이 되는 오브젝트
- 의존 오브젝트와 그것을 사용할 주체, 보통 클라이언트라고 부르는 오브젝트를 런타임시에 연결해 주는 작업.

의존관계주입의 조건
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. (즉, 인터페이스에만 의존)
- 런타임 시점의 의존관계는 컨테이너나 팩토리같은 제 3의 존재가 결정한다.
- 의존관계는 의존 오브젝트 레퍼런스를 외부에서 제공(주입)해줌으로 만들어진다.
sample code
의존관계 주입을 위한 코드
public class UserDao {
  private ConnectionMaker connectionMaker;
   
  public UserDao(ConnectionMaker connectionMaker) { // 외부에서 dependent object 주입
    this.connectionMaker = connectionMaker;
  }
}


What is DL (Dependency lookup) ?

- 스프링이 제공하는 IoC 방식중 하나
- 의존관계를 맺는 부분이 외부로부터의 주입이 아닌, 스스로의 검색을 이용함
- 런타임시 의존관계를 맺을 오브젝트 결정과 생성은 외부 컨테이너에게 IoC 맡기는것은 DI 동일
오브젝트를 가져올 때는 메소드나 생성자를 통한 주입대신 스스로 컨테이너에 요청한다.
sample code
의존관계 검색(Factory이용)
public UserDao() {
  DaoFactory daoFactory = new DaoFactory();
  this.connectionMaker = daoFactory.connectionMaker();
}
의존관계 검색(application context이용)
public UserDao() {
  AnnotationConfigApplicationContext context =
    new AnnotationConfigApplicationContext(DaoFactory.class);
  this.connectionMaker = context.getBean("connectionMaker", ConnectionMaker.class);
}


DI(Dependency Injection) vs. DL(Dependency Lookup)

- DI 코드상에 오브젝트팩토리나 스프링 API 보이지 않으므로 깔끔하다.
- Dependency Lookup 에서 검색하는 오브젝트는 spring bean 필요가 없다.
- Dependency Injection에서 주입받는 오브젝트도 bean 이어야 한다.
  컨테이너가 UserDao ConnectionMaker 주입해 주려면, UserDao 대한 생성과 초기화 권한을 같고 있어야 하므로.

- 언제 Dependency Lookup 사용하는가?
  애플리케이션 기동시점이 되는 method에서 DI 통해서 오브젝트를 주입받을 없으므로 lookup사용




댓글 없음:

댓글 쓰기