SPRING 핵심 원리 [ 기본편 ]

[스프링 핵심 원리] 섹션 3.8 객체 지향 원리 적용 (IoC, DI, 그리고 컨테이너)

wlalsu_u 2023. 1. 31. 14:20

3.8.1  IoC (Inversion of Control) 란?

 

 

 

기존의 코드에서는 클라이언트 구현 객체가 필요한 서버 구현 객체를 생성, 연결, 실행하였다.

 

 

 

 

하지만, 프로그램의 제어 흐름을 결정하는 AppConfig 를 사용하여, 

 

구현 객체는 자신의 로직만 실행하도록 변경하였다.

 

 

 

따라서, OrderServiceImpl 클래스의 경우 필요한 인터페이스를 호출하여도,

 

어떤 구현 객체가 실행될지는 알지 못한다.

 

 

 

 

여기서, 프로그램에 대한 제어 흐름 권한을 AppConfig 가 가지고 있는 것을 볼 수 있다.

 

 

 

 

AppConfig 는 OrderServiceImpl 또는 다른 객체를 생성하고 실행하지만,

 

OrderServiceImpl 은 이를 알지 못한 채, 자신의 로직만을 수행한다.

 

 

 

 

즉, 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전 (IoC) 라고 한다.

 

 

 

+ 추가 ) 프레임워크 vs 라이브러리

프레임 워크 : 프레임워크가 작성한 코드를 제어하고 실행 (JUnit)
라이브러리 : 내가 작성한 코드가 제어를 담당

 

 

 

 


 

 

3.8.2  DI(Dependency Injection) 란?

 

 

 

앞서, OrderServiceImpl 클래스의 경우 필요한 인터페이스를 호출하여도,

 

어떤 구현 객체가 실행될지는 알지 못한다는 것을 알 수 있었다.

 

 

 

이처럼, 의존관계는 정적인 클래스 의존 관계와,
실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계로 분리된다.

 

 

 

 

정적인 클래스 의존관계

 

 

 

: import 코드만으로 의존관계를 파악할 수 있다.

 

: 따라서 어플리케이션을 실행하지 않아도 의존관계 분석이 가능하다.

 

 

 

정적 클래스 의존관계는 다음과 같다.

 

 

 

출처 : 김영한 - spring 핵심 원리 - 기본편

 

 

 

 

OrderServiceImpl 클래스는 MemberRepository 인터페이스와 DiscountPolicy 인터페이스에 의존한다.

 

 

(단, 이러한 의존관계만으로는 어떤 객체가 OrderServiceImpl 에 주입되는지 알 수 없다.)

 

 

 

 

 

 

동적인 객체 인스턴스 의존 관계

 

 

 

: 어플리케이션 런타임에, AppConfig 에서 실제 구현 객체를 생성하고, 클라이언트에 주입하여

 

클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계주입이라고 한다.

 

 

 

동적 클래스 의존관계는 다음과 같다.

 

 

 

출처 : 김영한 - spring 핵심 원리 - 기본편

 

 

 

주문 서비스 구현체로 메모리 회원 저장소와 정액할인 정책이 사용되는 것을 알 수 있다.

 

 

 

 

이렇듯, 의존관계주입을 사용하면,

 

클라이언트 코드 변경 없이, 클라이언트에 주입되는 인스턴스를 변경할 수 있다.

 

 

 

즉, 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스를 변경할 수 있다.

 

 

 

 


 

 

3.8.3  IoC / DI 컨테이너

 

 

 

AppConfig 와 같이 객체를 생성 / 관리 하고, 의존관계를 연결해 주는 것을

 

IoC 컨테이너, DI 컨테이너라고 한다.

 

 

 

 

 

(최근에는 의존관계 주입에 초점을 맞춰 DI 컨테이너라고 주로 이야기한다고 한다.)

 

 

이는 어셈블러, 오브젝트 팩토리 등으로 불리기도 한다.

 

 

 

 

 

 

 

 

 

 

 

 

김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8