IoC(Inversion of Control)

  • 제어의 역전. 프로그램의 제어 흐름 구조가 뒤바뀐 것.

  • 일반적 으로 오브젝트는 능동적으로 자신이 사용할 클래스를 결정하고, 언제 어떻게 그 오브젝트를 만들 지 스스로가 정한다. 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조다.

  • 제어의역전 개념이 적용된 오브젝트는 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 당연히 생성하지도 않는다. 자신 또한 어떻게 만들어지고 어디서 사용되는지 알 수 없다. 모든 제어권한은 자신이 아니라 다른 대상에 있기 때문.

    • 제어의 역전이 적용된 예.
      1. 템플릿메서드패턴. - 제어권을 상위 템플릿메서드에 넘기고, 자신은 필요할 때 호출되어 사용된다. ex ) UserDao를 상속받은 서브클래스는 추상메서드 getConnection()을 구현한다. 슈퍼클래스인 UserDao의 템플릿메소드인 add(), get() 등에서 필요할 때 getConnection()을 호출해 사용한다. 즉! 제어권을 상위 템플릿 메서드에 넘기고 자신은 필요할 때 호출되어 사용한다.
      2. 프레임워크 - 애플리케이션코드가 프레임워크에 의해 사용된다. 프레임워크가 흐름을 주도하는 중에 개발자가 만든 코드를 사용한다.

        반면 라이브러리는 애플리케이션코드가 애플리케이션 흐름을 직접 제어한다. 동작하는 중에 필요한 기능이 있을 때 능동적으로 라이브러리를 사용한다.

DI(Dependency Injection)

  • 오브젝트 레퍼런스를 외부로부터 제공(주입)받고 이를 통해 여타 오브젝트와 다이내믹하게 의존관계가 만들어지는 것이 핵심이다.
  • 단지 외부에서 파라미터로 오브젝트의 레퍼런스를 넘겨줬다고 해서 다 DI가 아니다. DI에서 말하는 주입은 다이내믹하게 구현 클래스를 결정해서 제공받을 수 있도록 인터페이스타입의 파라미터를 통해 이뤄져야한다.