제어의 역전(Inversion of Control)
개발자가 직접 객체를 관리(제어)하는 것이 아니라 프레임워크(또는 컨테이너)에서 객체를 관리하는 행위
- 객체에 대한 관리 권한이 프레임워크(또는 컨테이너)로 역전
- 의존성 주입(DI)의 상위 개념
프레임워크 vs 라이브러리
프레임워크: 내가 작성한 코드를 제어하고, 대신 실행 (ex. JUnit)
라이브러리: 내가 작성한 코드가 직접 제어의 흐름을 담당
의존성 주입(Dependency Injection)
애플리케이션 실행 시점에 실제 생선된 객체 인스턴스의 참조가 연결되는 것
- DI를 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있음
- 의존관계 코드를 손대지 않고 구현코드만 설정해서 동적인 연결을 구현
- 생성자 주입, 필드 주입, 수정자 주입 등 다양한 방법 존재
- 강하게 결합된 클래스들을 분리
- 두 객체 간의 결합도를 낮춤
- 객체의 유연성을 높임
- 테스트 작성을 용이하게 함
IoC 컨테이너, DI 컨테이너
- AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결
- 의존관계 주입에 초점을 맞추어 최근에는 주로 DI 컨테이너라 부름
- 어샘블러, 오브젝트 팩토리 등으로 불리기도 함
Reference
[Spring] 스프링 컨테이너 개념 및 동작 원리(DI,IoC,ApplicationContext 개념)
[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유
[인프런] 스프링 핵심 원리 - 기본편 (김영한)