제어의 역전 즉, IoC는 내가 무언가 코드를 호출하는게 아닌 프레임워크가 내 코드를 대신 호출해 주는 것이다.
즉, 말 그대로 제어권이 내가 아닌 프레임워크에게로 넘어가면서 나타나는 뜻이다.
예를 들어 기존의 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성, 연결, 실행까지 했었다.
즉, 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다.
다만 이제 객체지향 설계 5원칙을 따르며 개발을 하다보니 AppConfig라는 개념이 불가피해졌고
이로인해 구현객체는 자신의 로직을 실행하는 역할만 담당하게 되었다. 즉, 프로그램의 제어 흐름은 이제 AppConfig가 가져간다.
위에서 프레임워크에서 제어를 한다고 했지만 조금 더 정확하게 말하면 프로그램 자체(~~Impl
)에서 제어를 하는 것이 아닌 제어 흐름을 외부(AppConfig
)에서 관리하는 것이 바로 제어의 역전이다.
제어의 역전으로 대표적인 예가 jUnit 이라는 프레임웤인데 내가 작성만 한 코드에 대한 실행과 제어권을 jUnit과 test framework이 이걸대신 실행한다.
뭐 본인만의 라이프 사이클이 있어 예를들어 @beforeEach
를 먼저 실행하고 다음 각각의 테스트를 실행한다. 라는 것이다. 즉, 호출하는 제어권을 넘기는 것이다.
~~Impl
)는 실제로 어떤 구현 객체가 사용될지 모른다.그래서 우리는 "정적인 클래스 의존 관계와 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계"를 분리해서 생각해야안다.
opt + shift + cmd + U
애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 (AppConfig
)연결된 의존 관계이다.
애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존 관계가 연결 되는 것을 의존관계 주입(DI
)이라 한다.
DI를 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
DI를 사용하면 정적인 클래스 의존 관계
를 변경하지 않고, 동적인 객체 인스턴스 의존관계
를 쉽게 변경할 수 있다.
AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC Container 혹은 DI Container이라 한다.
의존관계 주입에 초점을 맞추어 최근에는 주로
DI Container
(assembler
, Object Factory
)이라 한다.