DI(Dependency Injection)

2012. 8. 9. 17:06OpenSource/Spring

반응형



출처 : 토비의 스프링 3
DI(Dependency Injection) : 의존관계 주입!

배경 : IoC의 너무 넓은 의미=> Spring의 기능, 특징을 한마디로 표현 X => DI 라는 용어를 만듬.

DI는 외부로부터 레퍼런스를 제공받고, 이를 통해 여타 오브젝트와 다이나믹하게 의존관계가 만들어지는 것이 핵심이다.

의존관계 주입은 다음과 같은 세가지 조건을 충족하는 작업을 말한다.
1) 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
2) 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
3) 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입) 해줌으로써 만들어진다.

다시 또 말해보면 DI는 자신이 사용할 오브젝트에 대한 선택과 생성 제어권을 외부로 넘기고 자신은 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC의 개념에 잘 들어맞는다.

스프링이 제공하는 IoC방법은 의존관계주입(DI)만 있는 것이 아니다.
코드에서는 구체적인 클래스에 의존하지 않고, 런타임 시에 의존관계를 결정한다는 점에서 의존관계 주입과 비슷하지만, 의존관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용하기 때문에 의존관계 검색(dependeny lookup)이라고 불리는 것도 있다. 의존관계 검색은 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾는다. 물론 자신이 어떤 클래스의 오브젝트를 이용할지 결정하지는 않는다. 그러면 IoC라고 할 수는 없을 것이다. 의존관계 검색은 런타임 시 의존관계를 맺을 오브젝트를 결정하는 것과 오브젝트의 생성작업은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올 때는 메소드나 생성자를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.

스프링의 IoC컨테이너인 애플리케이션 컨텍스트는 getBean()이라는 메소드를 제공한다. 바로 이 메소드가 의존관계 검색에 사용 된다.

ex)

public UserDao(){
  AnnotationConfigApplicationContext context =
                                       new AnnotationConfigApplicationContext(DaoFactory.class);

   this.connectionMaker = context.getBean("connectionMaker", ConnectionMaker.class);
}

※ DI를 원하는 오브젝트는 먼저 자기자신이 컨테이너가 관리하는 빈이 돼야 한다는 사실을 잊지 말자.
    스프링의 핵심인 IoC와 DI는 오브젝트의 설계와 생성, 관계 사용에 관한 기술 이다.

의존관계 검색과 의존관계 주입에서의 차이는
   의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다는 점이다.

스프링은 DI를 편하게 사용 할 수 있도록 도와주는 도구이면서 그 자체로 DI를 적극 활용한 프레임워크 이기도 하다. 그래서 스프링을 공부하는 건 DI를 어떻게 활용해야 할지를 공부하는 것이기도 하다.

DI는 생성자 뿐만 아니라 수정자 메소드(setter), 일반메소드(set으로 시작) 등으로도 구현이 가능.
반응형