본문 바로가기

SpringBoot

IoC, DI, 컨테이너

1. 제어의 역전(IoC)

- 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버구현 객체를 생성하고 연결하고 실행하였다. 한마디로 구현 객체가 프로그램의 제어흐름을 스스로 조종하였음.

- AppConfig등장 이후, 구현객체는 자신의 로직을 실행하는 역할만을 담당함.

- 프로그램 제어에 대한 권한은 AppConfig에 위임.

- 프로그램의 제어 흐름은 클라이언트코드가 아닌 AppConfig(외부)에 의해 결정되는 것.

 

*프레임워크 vs 라이브러리 : 프레임워크는 실행 및 제어 권한을 가진다. 반면, 코드에서 제어의 흐름을 담당한다면 라이브러리에 해당.

 

2. 의존관계 주입 (DI)

- 의존관계는 "정적인 클래스 의존관계와 실행시점에 동적인 객체 의존관계"를 분리하여 생각하여야 한다.

 

* 정적인 클래스 의존관계

- import 코드만보아도 의존관계를 쉽게 판단할 수 있음.

- 애플리케이션을 실행하지 않고도 분석할 수 있는 의존관계를 지니고 있음.

 

* 동적인 객체 의존관계(실행시점에 결정)

- 어떤객체가 주입될지 실행이전까지는 알 수 없음

- AppConfig에서 객체주입을 결정하기때문.

- 객체인스턴스를 생성하고 그 참조값을 전달하여 연결됨.

 

 

* DI의 이점

- 의존관계 주입을 사용하면 클라이언트코드 변경 없이 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.

- 정적클래스의존관계를 변경하지 않고 동적인 객체간의 의존관계를 쉽게 변경할 수 있다.

 

3. IoC 컨테이너, DI컨테이너

- AppConfig처럼 객체를 생성하고 관리하며 의존관계를 연결해주는 것.

- 의존관계 주입에 초점을 맞추어 DI컨테이너라고도 불림

- > AppConfig에 해당.

 

github.com/woqls22/core

의존성 주입은 AppConfig에 의해 행해짐.