Spring/스프링 핵심 원리 - 기본편

[이해2 - 객체 지향 원리 적용] IoC, DI, 그리고 컨테이너

alsruds 2023. 11. 16. 17:40
🧐강의🧐
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/dashboard

 

제어의 역전 IoC (Inversion of Control)

프로그램의 제어 흐름을 직접 제어하는 것이 아닌 외부에서 관리하는 것

 

· 기존 프로그램 : 클라이언트 구현 객체가 스스로 필요한 구현 객체를 생성 & 연결 & 실행

· AppConfig 등장 이후 : 클라이언트 구현 객체는 실행 역할만 담당

          》ex. OrderServiceImpl : 필요한 인터페이스들을 호출하지만, 어떤 구현 객체가 실행될지 모름

          》프로그램의 제어 흐름 → AppConfig 담당 

 

· AppConfig

          》프로그램 제어 흐름에 대한 권한

          》OrderServiceImpl 생성

          》OrderService 인터페이스의 다른 구현 객체 생성 및 실행

 

· 프레임워크 vs. 라이브러리

          》프레임워크 : 내가 작성한 코드를 제어하고 대신 실행 (ex. JUnit)

          》라이브러리 : 내가 작성한 코드가 직접 제어의 흐름을 담당

 

의존 관계 주입 DI (Dependency Injection)  

· 의존 관계 : 정적인 클래스 의존 관계 or 동적인 객체 의존 관계

· OrderServiceImpl : DiscountPolicy 인터페이스에 의존, 어떤 구현 객체가 사용될지는 모름

 

· 정적인 클래스 의존 관계

➡️ 클래스가 사용하는 import 코드만으로 의존 관계 파악 용이 (애플리케이션을 실행하지 않아도 분석 가능)

➡️ OrderServiceImpl →(의존)→ MemberRepository, DiscountPolicy

 

· 동적인 클래스 의존 관계

➡️ 애플리케이션 실행 시점에서 실제 생성된 객체 인스턴스의 참조가 연결되는 의존 관계

➡️ 객체 인스턴스 생성 후, 그 참조값을 전달해서 연결

➡️ 의존 관계 주입 사용 시

          - 클라이언트 코드 변경 X : 클라이언트가 호출하는 대상의 타입 인스턴스 변경

          - ⭐ 정적인 클래스 의존 관계 변경 X : 동적인 객체 인스턴스 의존 관계 쉽게 변경

 

IoC 컨테이너, DI 컨테이너

· 객체 생성 & 관리 → 의존 관계 연결 (ex. AppConfig)

· 의존 관계 주입에 초점을 맞춰, 최근에는 주로 DI 컨테이너라 함 (or 어셈블러, 오브젝트 팩토리)