반응형

Spring - Dependency Injection


(원문 위치 : http://www.tutorialspoint.com/spring/spring_dependency_injection.htm )

모든 java기반 프로그램은 최종사용자에게 어떻게 동작하는 프로그램인지 보여주기 위해 함께 동작하는 객체를 가지고 있다. 복잡한 java프로그램을 작성할 때, class는 재사용의 가능성을 증가시키는 다른 class에 대하여 그리고 unit test동안 다른 class에 대햐여 독립적으로 테스트하기 위하여 가능한 독립적이어야 한다. DI(Dependency Injection - 또는 때로는 wiring으로 불리기도 함.)은 class를 묶고 동시에 독립성을 유지하는 것에 도움을 준다.

Text editor component를 가지고 있고 spell checking 기능이 추가되어야 하는 프로그램을 생각해보자. 보통 아래와 같은 코드로 표현될 것이다.
public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}
여기서 수행한 것은 TextEditor와 SpellChecker사이에 의존성을 생성한 것이다. IoC(Inversion of Control)의 흐름에서도 정말 아래와같이 한다.
public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}
TextEditor는 SpellChecker의 구현에 대해 신경쓰지 않을 것이다. SpellChecker는 독립적으로 구현되어질 것이고 TextEditor가 인스턴스화 될때 TextEditor로 제공되어 질 것이다. 그리고 이러한 전체 절차는 Spring Framework에 의해 제어된다.

여기서 TextEditor로부터 전체 흐름을 제거하고 이것을 다른곳에 저장한다.(즉 XML 설정파일에 저장한다.) 그리고 의존관계(즉, SpellChecker class)는 Class 생성자를 통해 TextEditor class로 삽입된다. 따라서 외부시스템에 효과적으로 의존관계를 위임하였기 때문에 제어의 흐름이 DI에 의해 역전(inverted)되었다.
(--> 원래대로면 위와 같은 형태의 코드가 나오겠지만, 설정파일등을 이용해서 Spring Framework가 최종적으로 저 형태를 구성하도록 만들었다는 내용으로 이해해도 무방할 듯 싶음.)

두번째 방법은 SpellChecker instance를 생성할 TextEditor class의 Setter를 통한 것이다. 그러면 SpellChecker instance는 TextEditor의 속성을 초기화하기 위한 setter 함수를 호출하기 위해 사용되어 진다.

따라서 DI에는 주요한 두가지 다양성(방법)이 있고 이후 강좌에서 예제를 통해 알아볼 것이다.
S.N.Dependency Injection Type & Description
1

Constructor-based dependency injection

(생성자 기반)

생성자 기반 DI는 container가 다른 class에서 의존성을 나타내는 인자를 가지고 class생성자를 호출할때 이루어진다. 

이후 강좌에서 예제를 통해 알아볼 예정이다.

2

Setter-based dependency injection
(Setter 기반)

Settet 기반 DI는 인자가 없는 생성자 또는 인자가 없는 정적 factory 함수(static factory method)가 bean을 생성하기 위해 호출된 후 bean의 setter함수를 호출하는 container에 의해 이루어진다.


위 두가지를 혼합할 수 있지만 경험상 척도는 필수적인 의존관계에 대해서는 생성자기반 DI를 선택적 의존관계에 대해서는 setter를 사용하는 것이 좋다.

DI이론을 적용한 코드는 더 깔끔하고 객체가 의존성을 가지고 제공되어질때 분리(decoupling)이 더욱 효과적이다. 객체는 의존성을 찾지 않는다. 따라서 의존관계의 class 또는 위치를 모른다. 오히려 모든것은 Spring Framework에의해 관리되어진다.
 




반응형

+ Recent posts