쌓고 쌓다

IoC, DI, 컨테이너 본문

프로그래밍/spring

IoC, DI, 컨테이너

승민아 2023. 7. 7. 21:15

IoC (Inversion of Control) - 제어의 역전

관심사의 분리 전

기존 학습시 MemberRepository 인터페이스에

구현체로 MemoryMemberRepository가 올 수 있고 다른 DB Repository를 연결할 수 있었다.

이때 클라이언트 구현 객체인 Service에서 직접 구현 객체를 생성하고, 연결, 실행을 다 했다...

즉, 구현 객체가 프로그램의 제어 흐름을 스스로 직접 조종했다.

private final MemberRepository memberRepository = new MemoryMemberRepository();

 

관심사의 분리 후

AppConfig를 통해 이제 구현 객체들인 MemberService, OrderService는

필요한 인터페이스들을 호출하지만 실제 어떤 구현 객체들이 들어가 실행될지 모른다.

구현 객체들이 뭐가 올지 모른체 자기 로직을 실행한다. 심지어 Service 또한 AppConfig가 생성한다.

즉, 프로그램에 대한 제어 흐름은 모두 AppConfig에 있다.

 

=> 관심사의 분리 후처럼 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 IoC라고 한다.

 

DI(Denpendency Injection) - 의존관계 주입

클래스 다이어그램 - 출처: 인프런 김영한

OrderServiceImpl는 DiscountPolicy 인터페이스에 의존한다.

클래스 의존관계만으로 애플리케이션 실행시 DiscountPolicy의 구현 객체로 어떤것이 올지 모른다.

Fix가 올 수도, Rate가 올 수도 있다.

실제 애플리케이션 실행시 연결되는 의존 관계는 아래와 같다.

출처: 인프런 - 김영한

=> 애플리케이션 실행 시점(런타임)에 실제 객체를 생성하고 의존 관계가 연결되는 것을 의존관계 주입이라고 한다.

의존관계 주입으로 클라이언트 코드(Service)를 변경하지 않고 호출하는 대상의 인스턴스(Fix, Rate)를 변경할 수 있다.

 

 

IoC 컨테이너, DI 컨테이너

IoC 컨테이너나 DI 컨테이너나 같은 용어다. (확실치 않지만 ... 배운 기준으로..ㅎㅎ)

AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해주는 것을 DI 컨테이너(IoC컨테이너)라고 한다.

 

 

 

 

Comments