컨테이너
- 컨테이너는 인스턴스의 생명 주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공한다.
- 예컨대, servlet을 실행해주는 WAS는 Servlet 컨테이너를 가지고 있다고 말한다.
- 개발자가 서블릿 클래스만 작성하면, WAS는 웹 브라우저로부터 서블릿 URL에 해당되는 요청을 받아 메모리에 올린 후 실행, 동일한 요청을 받으면 기존에 메모리에 올라간 서블릿을 실행하는 등의 작업을 대신 해준다.
IOC
- 컨테이너가 코드 대신 오브젝트를 가지고 있어 IoC(제어의 역전)이라고 한다.
- 서블릿 클래스는 개발자가 만들지만, 그 서블릿의 메소드를 알맞게 호출하는 것은 WAS이다.
- 이렇게 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전이라고 한다.
DI(Dependency Injection)
- DI는 의존성 주입이라는 뜻을 가지고 있으며, 클래스 사이의 의존 관계를 빈(Bean)설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것을 말한다.
- DI가 적용 안된 예
class 엔진 {
}
class 자동차 {
엔진 v5 = new 엔진();
}
- Spring에서 DI가 적용된 예 : 엔진 type의 v5변수에 인스턴스를 컨테이너가 할당해준다.
@Component
class 엔진 {
}
@Component
class 자동차 {
@Autowired
엔진 v5;
}
Spring에서 제공하는 IoC/DI 컨테이너
- BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있다.
- ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천된다. 트랜잭션 처리, AOP등에 대한 처리를 할 수 있다. BeanPostProcessor, BeanFactorPostProcessor 등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 있다.
- BeanPostProcessor : 컨테이너의 기본 로직을 오버라이딩하여 인스턴스화와 의존성 처리 로직 등을 개발자가 원하는 대로 구현할 수 있도록 한다.
- BeanFactoryPostProcesser : 설정된 메타 데이터를 커스터마이징 할수 있다.