IoC and DI | "제어의 역전"과 "의존성 삽입" - Spring



-Inversion of Control 이란?

  • 의미 그대로 제어의 흐름을 바꾸는것
  • 범위 자체가 굉장히 광범위 하여 딱 집어 설명하기가 어렵다(고 한다)
  • IoC의 예로, GUI를 언급할 수 있다.
    • 옛날 학생 관리 프로그램의 경우, 다음과 같이 전단계를 거쳐야만 다음 단계가 입력이 가능, 즉 사용자의 사용(제어)를 프로그램 측에서 제어한다. 

ex) 

print "이름을 입력해주세요"

read name

print "주소를 입력해주세요"

read address

etc...

store in database (DB에 저장)

    • GUI 또는 그와 비슷한 인터페이스로 전환되면서 위의 제한적인 프로세스가 동적으로 변경이 된다.

when the user types in field a, store it in NAME ( a필드에 값을 입력하면, NAME에 저장됩니다,)

when the user types in field b, store it in ADDRESS (b필드에 값을 입력하면, ADDRESS에 저장됩니다.)

when the user clicks the save button, call StoreInDatabase (save버튼을 누르면,StoreInDatabase를 호출(저장)합니다.)

 

바로 앞의 예와 다르게, GUI에서는 사용자가 a,b,save클릭의 입력순서(제어)를 컨트롤이 가능하다. 

  • 즉, event loop, callbacks, or execute triggers 등 어떤 것이든 위와 같은 카테고리로 구분 가능하다.
    (IoC를 이름에 얽매이거나, 프로세스에 얽매이지 말고 포괄적 의미로 이해해야 한다.

  • IoC를 이행 하는 방법은 다음과 같다.
    • What-to-do part를 When-to-do part와 분리시킨다.
    • When part가 What part에 대해 가능한 알지 못하도록(관련시키지 않도록) 보장(처리)한다.
      (그 반대의 경우도 마찬가지)
    • 예를 다음과 같다.
      1. Event Handling. Event Handlers (what-to-do part) -- Raising Events (when-to-do part)
      2. Interfaces. Component client (when-to-do part) -- Component Interface implementation (what-to-do part)
      3. xUnit fixure. Setup and TearDown (what-to-do part) -- xUnit frameworks calls to Setup at the beginning and TearDown at the end (when-to-do part)
      4. Template method design pattern. template method when-to-do part -- primitive subclass implementation what-to-do part
      5. DLL container methods in COM. DllMain, DllCanUnload, etc (what-to-do part) -- COM/OS (when-to-do part)

- Dependency Injection (의존성 삽입) 이란?

  • IoC의 방법 중 하나. 
  • 예를 들어, Text Editor가 있는 어플리케이션에서 스펠링 체크 기능을 넣고 싶을 때 일반적인 코드는 다음과 같다. 

public class TextEditor{

private SpellChecker checker;

public TextEditor(){

checker = new SpellChecker();

}

}

스펠링 체크 메서드를 호출하는 시점에 이미 SpellChecker 를 쓸 것임을 명시하고 있다. 

  • 위의 예제에서 의존성을 넣어 바꾸면 다음과 같다.

public class TextEditor{

private ISpellChecker checker;

public TextEditor(ISpellChecker checker){

this.checker = checker;

}

}

위의 예제와 다르게, TextEditor 생성자를 호출하는 부분에서 어떠한 checker를 

쓸 지를 확정한다.

(일반적으로 IPellChecker를 인터페이스로 만들고 의를 구현화 시키도록 하여 

TextEditor를 호출하는 시점에 업캐스팅을 되게끔 처리한다.)

  • 이로서 TextEditor에 의존성을 넣었으며, TextEditor 생성자 호출 시점에 호출하는 대상이 제어하게끔 하는 것.

출처 ]





AD_1