들어가기 앞서..
우선 간단하게 BeanFactory와 ApplicationContext를 정리하고 자세히 살펴보겠다.
- BeanFactory : BeanFactory란 빈을 생성하고 의존관계를 설정하는 기능을 담당하는 가장 기본적인 IoC 컨테이너이자 클래스를 말한다.
- ApplicationContext : ApplicationContext는 BeanFactory를 구현하고 있는 확장 버전이라고 보면 쉽다.
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할을 담당
- getBean() 메소드를 제공
- 빈과 관련된 대부분의 기능을 제공
- Lazy-loading 방식
- 빈을 사용할 때 빈을 로딩하는데, 필요할 때만 로딩하기에 가벼운 경량 컨테이너이다.
ApplicationContext
- BeanFactory 기능을 모두 상속받아 제공
- Eager-loading
- 런타임 실행시 모든 빈을 미리 로딩
- 빈을 관리하고 검색하는 기능 BeanFactory + 부가기능
- MessageSource - 메시지를 활용한 국제화 기능
- 한국에서는 한국어, 영어권에서는 영어로 출력
- EnvironmentCapable - 환경변수
- 로컬, 개발, 운영 등을 구분해서 처리
- ApplicationEventPublisher - 애플리케이션 이벤트
- 이벤트를 발행하고 구독하는 모델을 편리하게 지원
- ResourceLoader - 편리한 리소스 조회
- 파일, class path, 외부 등에서 리소스를 편리하게 조회
ApplicationContext 사용을 권장하는 이유는?
JPA에서는 Eager Loading을 지양하고 Lazy Loading을 사용하라고 배웠었다. 그렇다면 스프링 공식문서에서는 어째서 Bean의 Eager Loading을 사용하는 ApplicationContext 사용을 권장할까?
문제가 있는 Bean 객체가 있을 때, Lazy Loading을 사용하게 되면 해당 Bean이 사용되는 시점이 되기 전까지 해당 오류의 유무를 파악하기가 어렵다. 때문에 Eager Loading을 사용하여, 객체의 초기화 시점에 오류를 잡아내기 위함이라고 생각한다.
정리
ApplicationContext는 BeanFactory의 기능을 상속받고, ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공한다. BeanFactory를 직접 사용할 일은 거의 없고 부가기능이 포함된 ApplicationContext를 사용한다. BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.
참고:
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#context-introduction-ctx-vs-beanfactory
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html
https://beststar-1.tistory.com/39#%EC%8A%A4%ED%94%84%EB%A7%81_%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88(Spring_Container)
https://velog.io/@saint6839/BeanFactory-%EC%99%80-ApplicationContext%EC%9D%98-%EC%B0%A8%EC%9D%B4