Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

DI(Dependency Injection)

OpenSource/Spring 2012.08.09 17:06
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



출처 : 토비의 스프링 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으로 시작) 등으로도 구현이 가능.

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • 초보 2013.01.24 03:08 신고 답글 | 수정/삭제 | ADDR

    아래의 의존관계 주입과 검색의 차이점이 잘 이해가 안됩니다.

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

    검색하는 오브젝트는 UserDao이며 UserDao는 빈으로 등록되어야 한다는 뜻인가요?

    답변 부탁드립니다.

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2013.01.24 16:27 신고 수정/삭제

      네 안녕하세요^^
      문의 하신 "의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다는 점이다" 이 문구만으로는 조금 이해하시기 어려우실꺼라 생각이 드네요^^;; 제가 더 자세하게 기술을 했어야 했는데 너무 포인트만 적어놨네요;

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

      3가지 내용은 토비1권을 보시면 됩니다.
      또한 지금 위의 3가지는 의존관계에 대해서 강조 하고 있습니다.
      다시 말씀 드리면 DI / DL의 큰 차이는 "의존관계"가
      가장 큰 차이라고 할 수 있겠네요
      DI는 서로 의존 관계가 있죠! 어떤걸로? interface로요~ 1)번 사항 참고
      즉 userDao 쓸려면 connection이 되어야 하죠^^ (의존관계가 서로 있다는 뜻, 즉 둘 다 bean이 등록이 되어야 함.) 외부주입은 setter나 생성자로 보통 하죠~

      DL은 getBean()을 통해서 해당 connectionMaker을 가져올 지라도 usrDao는 빈으로 등록 할 필요가 없다는 뜻이에요 new해서 객체 생성 해도 무관하다는 것이죠

      문의 하신 "검색하는 오브젝트는 UserDao이며 UserDao는 빈으로 등록되어야 한다는 뜻인가요?" 에서 반대로 UserDao가 빈으로 등록되지 않아도 된다는 뜻이라고 생각하시면 됩니다. DL에서요^^

      음..설명을 잘못해서..더 헷깔리실 수 있겠지만..토비 1권을 조금 참조 하시면서 보시면 이해가 가실꺼라 생각합니다^^;

      참고사항으로
      http://acet.pe.kr/220과 http://acet.pe.kr/183 을 보시면 좋을 것 같네요

      열공하세요~~~

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바