개념
•
제어의 역전이란 기존 객체의 생성, 생명주기의 관리 등의 작업들에 대한 제어권이 코드에서 다른 곳으로 옮겨간 것이다.
•
컴포넌트 의존관계, 설정 및 생명주기를 해결하기 위한 디자인 패턴이다.
IoC의 분류
•
의존성 주입과 의존성 검색이 존재한다.
◦
Dependency Lookup
▪
저장소에 존재하는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 탐색하는 것이다.
◦
Dependency Injection
▪
각 클래스 간의 의존관계를 빈 정의 정보를 바탕으로 컨테이너가 주입해주는 것이다.
•
의존성 검색을 사용하는 경우, 컨테이너에 대한 의존성이 증가하기 때문에 주로 DI를 사용한다.
IoC 컨테이너 설정 종류
•
XML 설정 파일(legacy)
•
Java 어노테이션
•
Java 소스코드
상세
•
스프링 어플리케이션에서는 객체의 생성과 관계 설정, 사용, 제거 등의 작업을 코드 대신 독립된 컨테이너가 담당한다.
◦
이를 컨테이너가 코드 대신 객체에 대한 제어권을 가지고 있다고 해서 IoC라고 부른다. 그래서 스프링 컨테이너를 IoC 컨테이너라고도 한다.
•
스프링에선 IoC를 담당하는 컨테이너를 Bean Factory 또는 Application Context라고 부르기도 한다.
◦
객체의 생성과 객체 간의 관계를 설정하는 DI 관점에서는 컨테이너를 Bean Factory라고 한다.
◦
외에도 엔터프라이즈 어플리케이션을 개발하는 데 필요한 여러 컨테이너 기능을 추가한 것을 Application Context라고 한다.
•
스프링의 IoC 컨테이너라하면 일반적으로 Applicaiotn Context를 의미한다.
•
스프링의 Bean Factory와 Application Context는 각각 BeanFactory와 ApplicatoinContext 인터페이스로 정의되어 있으며 ApplicationContext는 BeanFcaotry 인터페이스를 상속한 서브 인터페이스다.
◦
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver{};
•
실제로 스프링 컨테이너 또는 IoC 컨테이너는 ApplicationContext 인터페이스 구상 클래스의 객체다.