Spring IoC Container(Spring Container) 란
Spring IoC Container(혹은 Spring Container)란 객체의 생명주기를 관리하며 이러한 객체들에게 추가적인 기능을 제공하는 스프링의 핵심 컴포넌트이다. 즉, 스프링의 bean을 관리(bean 생성 및 생명주기 관리, DI, AOP 지원 등)하는 컨테이너라고 보면 된다.
이러한 스프링 컨테이너는 XML 파일 또는 어노테이션 기반의 자바 설정 클래스로 구현할 수 있다. 예전에는 xml 파일을 통해 직접적으로 스프링 컨테이너를 설정하는 것이 일반적이었지만, Spring Boot가 등장하고 설정이 자동화되어 대부분 사용하지 않게 되었다.
Spring IoC Container(Spring Container) 구성
스프링 컨테이너는 BeanFactory와 ApplicationContext라는 2가지 주요 인터페이스로 구성되어 있다.
1. BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- bean 등록, 생성, 조회, 인스턴스화 와 같이 bean을 생성하고 관리하는 데 필요한 기본 기능 제공
2. ApplicationContext
- BeanFactory를 상속하는 인터페이스
- BeanFactory의 모든 기능을 포함하고 있으며 다양한 추가 기능 제공
- 일반적으로 대부분의 Spring 어플리케이션에서는 bean의 생명주기 관리 외에 추가 기능이 필요함
[추가 기능]
- MessageSource : 메시지 다국화를 위한 인터페이스
- EnvironmentCapable : 개발, 운영, 환경변수 등으로 나누어 처리하고, 어플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
- ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
- ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회 - 따라서 대부분의 Spring 어플리케이션에서는 BeanFactory가 아닌 ApplicationContext를 사용
- ApplicationContext는 별도의 설정 정보를 참고하고 IoC를 적용하여 bean의 생성, 관계설정 등의 제어 작업을 총괄함
- ApplicationContext에는 직접 객체를 생성하고 관계를 맺어주는 코드가 없다. 대신에 그런 생성 정보와 연관관계 정보에 대한 설정을 읽어서 처리한다. (ex. @Configuration과 같은 어노테이션이 대표적인 IoC의 설정정보)
ApplicationContext의 구현체
ApplicationContext는 인터페이스이므로 구현체를 통해서 동작한다. 대표적인 구현체는 다음과 같다.
1. AnnotationConfigApplicationContext
- 자바 클래스 기반의 설정을 사용하는 구현체
- @Configuration 어노테이션이 있는 클래스를 설정 파일로 인식
2. ClassPathXmlApplicationContext
- xml 파일 기반의 설정을 사용하는 구현체
- xml 파일을 설정 파일로 인식
Bean 요청 시 처리 과정
클라이언트에서 특정 bean을 요청하면 ApplicationContext는 다음과 같은 과정을 거쳐 bean을 반환한다.
1. ApplicationContext는 @Configuration이 붙은 클래스들을 설정 정보로 등록해두고, @Bean이 붙은 메소드의 이름으로 bean 목록을 생성한다.
2. 클라이언트가 해당 bean을 요청한다.
3. ApplicationContext는 자신의 bean 목록에서 요청한 이름이 있는지 찾는다.
4. ApplicationContext는 설정 클래스로부터 bean 생성을 요청하고 생성된 bean을 돌려준다.
ApplicationContext는 @Configuration이 붙은 클래스들을 설정 정보로 등록해두고, @Bean이 붙은 메소드의 이름으로 bean 목록을 생성한다. 그리고 클라이언트가 해당 bean을 요청한다면 ApplicationContext는 자신의 bean 목록에서 요청한 이름이 있는지 찾고, 있다면 해당 bean 생성 메소드(@Bean)을 호출하여 객체를 생성하고 돌려준다. (구체적으로는 Spring 내부에서 Reflection API를 이용해 bean 정의에 나오는 클래스 이름을 이용하거나 또는 bean 팩토리를 통해 bean을 생성한다.)
Singleton Registry
앞서 설명했듯, 스프링 컨테이너는 bean을 관리하는 컨테이너이다. 이러한 bean은 기본적으로 singleton으로 생성된다. 즉, 각 bean은 어플리케이션 전체에서 단 하나의 인스턴스만 생성되어 공유된다. 따라서 스프링 컨테이너는 싱글턴 객체를 저장하고 관리하는 singleton registry 역할을 한다.
스프링 컨테이너는 bean을 최초로 요청 받을 때 해당 bean을 생성하고, 이후 동일한 bean에 대한 요청이 있을 때는 이미 생성된 인스턴스를 반환한다. 이렇게 함으로써 애플리케이션 내에서 bean의 인스턴스가 한 번만 생성되고 재사용되도록 보장한다.
'Spring' 카테고리의 다른 글
Bean 스코프 (0) | 2024.07.16 |
---|---|
Spring, Spring Boot 차이 (0) | 2024.07.14 |
@Transactional 동작 방식 (0) | 2024.07.02 |
JDK Dynamic Proxy vs CGLIB Proxy (0) | 2024.07.02 |
AOP와 Spring AOP (0) | 2024.06.26 |