🌏 BeanFactory
Spring 초창기(2000년대 초반)부터 존재하던 가장 기본적인 IoC 컨테이너입니다.
역할은 단순했습니다: 객체(빈) 생성, 의존성 주입(DI)
즉, 스프링의 “컨테이너 철학”을 처음 구현한 게 바로 BeanFactory입니다.
✅ 빈을 만드는 시점
요청할 때! 즉, getBean()을 호출해야 그제서야 객체를 생성합니다. (Lazy Loading)
✅ 기능
객체를 만들고, 관리하는 단순한 기능 뿐 (Spring MVC, @Transactional, @EventListener 대부분 없음)
BeanFactory는 필요한 시점에만 객체를 만들어주는 단순 기계입니다.
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyService service = (MyService) factory.getBean("myService");
🌏 ApplicationContext
시간이 지나면서 “빈만 관리하는 것”으로는 부족했습니다. 엔터프라이즈 애플리케이션에서는 다국어 처리, 이벤트 시스템, AOP, 트랜잭션 관리 같은 부가기능이 필요했기 때문에, BeanFactory를 확장해서 ApplicationContext가 등장했습니다.
BeanFactory가 비유하자면 그냥 자판기라면, ApplicationContext는 풀옵션 편의점입니다. 단순히 객체만 관리하는 게 아니라, 애플리케이션 전반에서 필요한 기능들을 함께 제공합니다.
✅ 빈을 만드는 시점
컨테이너가 뜨자마자! 실행 시점에 대부분의 객체를 미리 만들어둡니다. (Eager Loading)
- 빈 설정이나 의존성 주입에 문제가 있으면 애플리케이션이 아예 로딩되지 않고 바로 실패합니다. 런타임 중간에 갑자기 “빈 못 만듦” 오류가 나는 것보다 애플리케이션 시작할 때 바로 에러를 잡는 게 안정적이기 때문입니다.
- 이론적으로는 BeanFactory를 직접 쓰면 Lazy Loading만 되니까, 문제가 있는 빈도 요청하지 않으면 생성되지 않고 애플리케이션은 떠 있을 수 있습니다. 하지만 기능이 너무 부족해서 직접 사용하지는 않습니다.
✅ 기능
- 다국어 지원 (메시지 국제화)
- 이벤트 발행/리스너 등록
- AOP, 트랜잭션 관리
- 스프링 MVC와의 통합
ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
MyService service = context.getBean("myService", MyService.class);
✅ 설정 방법
사실 우리가 직접 “ApplicationContext를 쓰겠다”고 설정하지는 않습니다. Spring 자체가 기본 컨테이너로 ApplicationContext를 사용합니다.
Spring Boot에서 SpringApplication.run()을 실행하면 자동으로 ApplicationContext가 생성됩니다. 이때 Profile, AutoConfiguration 같은 기능이 모두 ApplicationContext 위에서 동작합니다.
✅ 다양한 구현체
ApplicationContext는 인터페이스이기 때문에 상황에 따라 다양한 구현체가 있습니다.
ClassPathXmlApplicationContext: XML 설정 기반FileSystemXmlApplicationContext: 파일 시스템 경로 기반 XML 설정AnnotationConfigApplicationContext:@Configuration자바 설정 기반GenericWebApplicationContext,ServletWebServerApplicationContext: 웹 애플리케이션 전용 (Spring Boot가 사용하는 기본 컨텍스트)
✅ 그러면 빈 Lazy Loading은 못 쓰나?
가능은 합니다. 전부 BeanFactory로 바꿀 필요 없고, 특정 빈만 지연 로딩으로 바꾸는 게 일반적인 방법입니다.
@Component
@Lazy
public class MyService {
// 이 빈은 요청될 때까지 생성 안 됨
}
예를 들어 무거운 객체 (대용량 캐시, 외부 API 클라이언트)는 @Lazy로 늦춰서 애플리케이션 기동 속도를 개선할 수 있습니다.
또는 설정 파일에서 전체 빈에 대해 Lazy Loading을 걸 수도 있습니다
@Configuration
@Lazy
public class AppConfig {
// 모든 빈이 lazy init으로 동작
}

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!