Dependency Injection - 1

Design Patterns 2011. 8. 23. 17:10
반응형
원문: http://greatkim91.tistory.com/41
http://greatkim91.tistory.com/entry/Dependency-Injection-1

사전적의미
Dependency: 의존, 종속
Injection:  주사, 주입 

String프레임워크나 Struts2, Hibernate등과 같은 프레임웍들도 기본으로 D.I를 지원하는 추세이다.
D.I의 정확한 의미가 무엇인가?

Wiring (와이어링)
객체의 힘 - 추상화, 다형성
OOP의 위대함은 추상화에 있다.객체를 사용하는 클라이언트(Caller)를 실제 사용하는 객체가 뭔지 몰라도 객체의 인터페이스만 알면 일을 시킬수있다.
여기에서 클라이언트가 잡고있는 객체를 클라이언트 모르게 바꾸어도 그 코드는 잘 동작 하고 동일한 인터페이스라도 실제 객체(concrete class)가 어떤 것인지에 따라 그 동작 방법을 바꿀수 있다.
이게 OOP에서 잘 알려진 다형석(polymorphism)이다.
 
Wiring
객체는 보통 홀로 동작하지 않는다. 쓸만한 객체가 작성되었다면 최소한 그것을 사용하는 클라이언트(컨테이너)는 있어야할 것이다.  이와 같이 객체들은 서로 협력하여 목적을 달성하기 위해 다른 객체의 참조르 가지고 이를통해 객체간의 체인이 형성된다 이를 wiring이라 한다. 

 추상화의 힘을 사용하기 위해 보통 인터페이스나 추상(abstract또는 virtual)클래스를 이용하여 객체간 참조 한다.

의도하지 않은 커플링(coupling)
이런 추상화의 힘을 이용하기 위해 객체를 사용하는 클라이언트(caller)는 객체의 인터페이스만을 잡고있지만 사용할 객체를 생성하기 위해 new 연산자를 사용하게 된다.
이렇게 되면 new 연산자에 의해 원하지 않게 구체화된 클래스는 의존관계를 형성하게 된다.


위 그림의 예를 들면 Main클래스는 다음과 같은 코드를 가질 수 있다.

이렇게 의도하지 않은 의존관계를 해결하기 위해 주로 생성과 관련된 패턴을 사용하여 객체 생성을 클라이언트(Caller)로부터 분리 하기도 한다. 

디자인패턴의 종류와 관련은 아래 블로그를 참고: 
http://masamune.tistory.com/84

순진한 코더의 예제
다음에 설명할 DI의 개념 이해를 위해 굉장히 간단한 예제로 이야기 할것이다.
예제는 다음 그림과 같이 임의의 저장소에서 영화 목록을 읽고 특정 감독의 영화 목록을 추출하는 프로그램이다.
저장소는 CSV(Comma Separated Volume)파일이 될 수도 있고, DB나 다른 형태가 될수도 있다.
임의 저장소에서 찾는 동작을 MovieFinder 인터페이스로 정의하고 이것을 구현한다. 

IFinder를 적절히 추상화 했지만 위에서 보듯 MovieList는 의도하지 않게 CSVMovieFinder와 강한 커플링을 형성하고 있다.











 
반응형

'Design Patterns ' 카테고리의 다른 글

as3 design patterns  (0) 2011.09.14
Dependency Injection - 2  (0) 2011.08.23
Dependency Injection PDF  (0) 2011.08.23
classic mvc pattern  (0) 2011.08.12
Pattern Craft - Proxy Pattern  (0) 2011.07.29
: