IoC란?
IoC(Inversion of Control, 제어의 역전)는 객체의 생성, 관리, 의존 관계 설정을 개발자가 직접 수행하는 대신, 프레임워크(스프링 컨테이너)가 대신 수행하도록 제어권을 넘기는 설계 원칙입니다.
IoC의 장점
- IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리해준다.
∘ 때문에 개발자는 비즈니스 로직에 집중할 수 있다.
- 또한 POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
∘ 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
∘ 객체 생성코드가 없으므로 TDD가 용이하다.
IoC 컨테이너
컨테이너는 보통 객체의 생명주기를 관리하고 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것
- 스프링 프레임워크도 객체를 생성하고 관리하고 책임지며 의존성을 관리해주는 컨테이너가 있는데 그것이 IoC컨테이너(=스프링 컨테이너)이다.
스프링 컨테이너란?
IoC 원칙을 구현한 도구로, 애플리케이션에서 필요한 객체(빈, Bean)를 생성, 초기화, 의존성 주입, 소멸 등의 생명주기를 관리합니다.
역할
- 객체 등록
- 개발자가 정의한 객체를 빈(bean)으로 등록.
@Componenet, @Configuration 등으로 지정된 객체를 스캔하여 관리.
- 의존성 주입(Dependency Injection, DI)
- 빈의 생명주기 관리
- 빈의 생성 -> 초기화 -> 사용 -> 소멸까지 전 과정 관리.
- 객체 제공
종류
- BeanFactory
- 가장 기본적인 IoC 컨테이너
- 스프링 컨테이너의 최상위 인터페이스이다.
- Bean을 등록, 생성, 조회, 반환 관리를 한다.
- 팩토리 디자인 패텬을 구현한 것으로는 BeanFactory는 Bean을 생성하고 분배하는 책임을 지는 클래스이다.
∘ BeanFactory 계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리하는 기능만 제공한다.
- 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다.
- ApplicationContext
- BeanFactory를 확장한 컨테이너
- BeanFactory를 상속한 인터페이스로 BeanFactory의 기능 외에 추가적으로 AOP와 같이 대규모 웹 프로젝트에 필요한 여러 확장기능들을 포함하고 있다.
- 스프링의 각종 부가 기능을 추가로 제공해준다.
- BeanFactory 보다 추가적으로 제공하는 기능
∘ 국제화가 지원되는 텍스트 메시지를 관리해준다.
∘ 이미지 같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다.
∘ listener로 등록된 Bean에게 이벤트 발생을 알려준다.
- 따라서 대부분의 어플리케이션에서는 BeanFactory보다는 ApplicationContext를 사용하는 것이 더 좋다.