티스토리 뷰
Spring IoC 컨테이너 학습 도중 BeanFactory, ApplicationContext에 대해 알게 되어 이를 정리해 보고자 글을 작성하게 되었습니다.
BeanFactory
BeanFactory는 빈 컨테이너에 접근하기 위한 루트 인터페이스로 스프링에서 IoC 컨테이너의 가장 기본적인 형태이다. 스프링에서 관리되는 객체인 Bean들의 생성, 관리, 조회 등의 역할을 담당한다. 빈 객체들의 라이프사이클을 관리하며 싱글톤 객체들을 캐싱하여 동일한 객체들을 재사용한다. 빈 스코프에 따라 반환하는 빈들이 달라질 수 있다.
다양한 구현체를 가질 수 있는데 스프링에서는 XmlBeanFactory, DefaultListableBeanFactory 등의 구현체를 제공한다.
- XmlBeanFactory : XML 파일에서 빈 정보를 읽어와서 등록하고 관리하는 구현체
- DefaultListableBeanFactory : 자바 코드에서 빈 정보를 등록하고 관리하는 구현체
해당 구현체들이 구현하는 대표적인 메서드는 아래와 같다.
- Object getBean(String name) : 해당 이름을 가진 빈 객체를 반환한다. 해당 빈 객체가 존재하는 경우 캐싱된 객체를 반환하고 빈 객체가 존재하지 않는 경우 빈을 생성하고 등록한 후 반환한다.
- boolean containsBean(String name) : 해당 이름을 가진 빈 객체가 존재하는지 여부를 반환한다.
ApplicationContext
ApplicationContext은 BeanFactory 하위 인터페이스로 애플리케이션에 대한 구성을 제공하는 중앙 인터페이스이다. BeanFactory와 마찬가지로 스프링 IoC 컨테이너를 나타내며 Bean들의 생성, 관리, 조회 등의 역할을 담당한다. ApplicationContext는 다른 인터페이스도 확장함으로 추가적인 기능도 제공하게 된다.
- EnvironmentCapable : 애플리케이션의 환경을 알아내는 기능을 제공한다. 이를 통해 애플리케이션 실행 환경에 따라 다양한 설정을 지원하고 환경 변수를 사용할 수 있다.
- ListableBeanFactory : BeanFactory의 하위 인터페이스로 빈 목록을 조회하는 기능을 추가적으로 제공한다.
- HierarchicalBeanFactory : BeanFactory의 하위 인터페이스로 BeanFactory의 계층 구조를 정의하고 부모 BeanFactory에 등록된 빈 객체들을 상속받아 사용할 수 있다.
- MessageSource : 스프링 프레임워크에서 제공하는 인터페이스로 국제화 기능을 지원하는 메시지 관리 기능을 제공한다.
- ApplicationEventPublisher : 스프링 프레임워크에서 제공하는 인터페이스로 이벤트를 발생시키고 해당 이벤트를 처리하는 리스너를 등록할 수 있다.
- ResourcePatternResolver : 스프링 프레임워크에서 제공하는 인터페이스로 다양한 리소스를 검색하고 이를 이용해 필요한 작업을 수행할 수 있도록 한다.
스프링 공식 홈페이지에서도 BeanFactory에 비해 ApplicationContext가 부가적인 기능을 제공한다는 것을 명시하고 있다.
추가적으로 ApplicationContext는 Bean의 Pre-loading을 지원한다. Pre-loading이란 빈을 미리 로딩할 수 있음을 의미하는데 이를 통해 애플리케이션이 실행될 때 빈을 미리 로딩하여 응용 프로그램 시작시간을 단축할 수 있다. BeanFactory는 기본적으로 Lazy Loading 방식으로 동작하기 때문에 애플리케이션이 실행될 때 빈 객체들이 생성되지 않고 해당 빈 객체를 조회할 때 생성된다. 메모리 사용량, 구현 자원 등의 요소를 확인 후 IoC 컨테이너를 선택하겠지만 위와 같은 이점들로 인해 ApplicationContext를 주로 사용한다.
ApplicationContext 구현체
- AnnotationConfigApplicationContext : 자바 어노테이션을 사용하여 구성 정보를 제공하는 구현체이다. XML 구성 파일을 사용하지 않고도 스프링 컨테이너를 구성할 수 있다.
- ClassPathXmlApplicationContext : 클래스 패스를 통해 XML 구성 파일을 읽어 들이는 구현체이다. XML 파일로 정의된 빈들을 사용하여 스프링 컨테이너를 구성할 수 있다.
- FileSystemXmlApplicationContext : 파일 시스템에서 XML 구성 파일을 읽어 들이는 구현체이다. 파일 시스템을 통해 XML을 읽어 들이기 때문에 조금 더 유연하게 스프링 컨테이너를 구성할 수 있다.
- XmlWebApplicationContext : 웹 애플리케이션에서 XML 구성 파일을 읽어 들이는 구현체이다. 웹 애프리케이션에서 구성 정보를 XML 파일에 정의하고 이를 읽어 들여 스프링 컨테이너를 구성할 수 있다.
SpringBoot에서 사용하는 ApplicationContext 구현체
스프링 부트에서는 SpringApplication 클래스를 사용하여 ApplicationContext를 구성한다. 스프링 부트 애플리케이션에서는 보통 SpringApplication.run 메서드를 통해 애플리케이션을 시작한다. 이 메서드를 하나씩 따라가 보며 내부적으로 어떤 구현체를 생성하는지 알아보고자 한다.
스프링 부트 애플리케이션에서는 보통 SpringApplication.run을 통해 애플리케이션을 시작한다. 이 메서드는 내부적으로 AnnotationConfigApplicationContext를 생성하고 반환한다.
메서드 반환값인 ConfigurableApplicationContext는 처음에는 null로 초기화되어 있다. 이후 createApplicationContext 메서드를 통해 생성된 ApplicationContext를 참조하게 된다.
createApplicaitonContext는 SpringApplication이 필드로 가지고 있는 ApplicationContextFactory를 통해 애플리케이션 컨텍스트를 생성하는 역할을 수행한다. ApplicationContextFactory는 애플리케이션 컨텍스트를 생성하기 위한 편의성을 제공하기 위한 클래스이다. 주로 XML 또는 Java Configuration을 사용하여 설정 파일을 작성하고 해당 설정을 ApplicationContextFactory에 전달하여 애플리케이션 컨텍스트를 생성한다.
파라미터로 전달되는 WebApplicationType은 스프링 부트 애플리케이션이 동작할 때, 웹 애플리케이션의 유형을 지정하는 열거형 타입이다. 아래의 두 가지 값 중 하나를 갖는다.
- SERVLET : 웹 애플리케이션이 서블릿을 기반으로 동작하는 경우를 의미한다. 이 값은 기본값으로 지정되어 있다.
- REACTIVE : 웹 애플리케이션이 리액티브 스타일로 동작하는 경우를 의미한다. 스프링 5부터 지원하는 WebFlux 모듈을 사용하여 리액티브 스타일의 웹 애플리케이션을 개발할 수 있다.
SpringApplication에서 사용되며, 애플리케이션 컨텍스트를 생성할 때 웹 애플리케이션의 유형을 지정하는 데 사용된다. 이 값을 바탕으로 애플리케이션 컨텍스트가 생성되고 스프링 부트 애플리케이션의 동작 방식이 결정된다.
create를 확인하면 자바 어노테이션을 통해 구성 정보를 제공하는 AnnotationConfigApplicationContext를 생성해서 반환하는 것을 알 수 있다.
'Spring' 카테고리의 다른 글
[Spring] ObjectMapper에서 LocalDateTime이 변환되지 않는 문제 (8) | 2023.05.21 |
---|---|
[Spring] 스프링을 어노테이션 기반으로 만든 이유 (1) | 2023.05.02 |
[Spring] @Controller가 뷰 이름을 반환하지 않는다면 (2) | 2023.04.25 |
[Spring] RestTemplate 알아보기 (2) | 2023.04.22 |