스프링/Core

객체 지향 원리 적용_IoC, DI, 컨테이너

maeng0830 2023. 1. 16. 21:44

IoC, DI, 컨테이너

Ioc(Inversion of Control)

AppConfig를 사용하기 전에는 클라이언트 구현체(OrderServiceImpl, MemberServiceImpl)가 스스로 필요한 서버 구현체(FixDiscountPolicy, MemoryMemberRepository 등)을 생성하고, 연결했다.

 

그러나 AppConfig를 사용하게 되면서, 클라이언트 구현체는 자신의 로직에만 집중하며 서버 구현체의 생성, 연결은 책임지지 않는다.

 

즉, 프로그램의 제어 흐름을 AppConfig가 담당하게 된다.

이처럼 프로그램의 제어 흐름을 클라이언트가 아닌 외부(AppConfig)에서 관리하는 것을 제어의 역전(Inversion of Control: IoC)이라고 한다.


DI(Dependency Injection)

의존관계는 정적 클래스 의존관계, 동적 객체 의존관계로 구분하여 생각할 수 있다.

 

정적 클래스 의존관계

정적 클래스 의존관계는 어플리케이션 구동 전에 설정되는 의존관계를 의미한다.

클라이언트의 import를 통해 클라이언트의 정적 클래스 의존관계를 파악할 수 있다.

 

예를 들어, OrderServiceImplMemberRepository, DiscountPolicy와 정적 클래스 의존관계를 맺고 있다.

 

그러나 이러한 정적 클래스 의존관계로는 역할에 대한 의존관계만 파악할 수 있으며, 실제로 주입될 구현체가 무엇인지는 알 수 없다.

 

동적 객체 의존관계

동적 객체 의존관계는 어플리케이션이 구동될 때 실제 구현체가 연결된 의존관계를 말한다.

 

그리고 어플리케이션이 구동될 때 외부(AppConfig)에서 실제 구현체를 생성하고 클라이언트에 구현체를 전달하여, 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계 주입(Dependency Injection: DI)이라고 한다.

 

DI를 통해 클라이언트의 코드를 변경하지 않고 서버 구현체를 변경할 수 있다.

즉 DI를 통해 정적 클래스 의존관계를 변경하지 않고, 동적 객체 의존관계를 변경할 수 있는 것이다.


컨테이너

AppConfig처럼 객체를 생성 및 관리하고, 의존관계를 연결해주는 것을 IoC 컨테이너 또는 DI 컨테이너라고 부른다. 


출처: 스프링 핵심 원리 - 기본편 - 인프런 | 강의 (inflearn.com)