제어의 역전 IOC (Inversion of Control)
- 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 구현 객체로 생성하고, 연결하고, 실행했다. 한마디로 구현객체가 프로그램의 제어 흐름을 통제했다.
- 반면에 AppConfig가 등장한 이후로 구현 객체는 오직 구현 하나의 기능에만 집중할 수 있게 되었다. 프로그램의 제어의 흐름은 이제 AppConfig가 가져간다 예를 들어서
orderServieImpl
은 필요한 인터페이스들을 호출하지만 어떤 구현 객체가 실행되는지 모른다.
- 프로그램에 대한 제어흐름에 대한 권한은 모두
AppConfig
가 가지고 있다. 심지어 OrderServiceImpl
도 AppConfig
가 생성한다. 그리고 AppConfig
는 OrderServiceImpl
이 아닌 OrderService
인터페이스의 다른 구현객체로 생성하고 실행할 수 있다. 그런 사실을 모른체 OrderServiceImpl
은 묵묵히 자신의 기능을 실행한다.
- 이렇듯 프로그램의 제어흐름을 그 클래스 내에서 직접 설정하는 것이 아닌
AppConfig
라는 (외부)에서 관리를 하는데 이를 제어의 역정(IOC)라고 한다.
프레임워크 vs 라이브러리
- 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크가 맞다
- 반면에 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 라이브러리이다
의존관계 주입