Spring
BeanFactory와 ApplicationContext의 차이를 설명해주세요
Spring IoC 컨테이너의 두 축인 BeanFactory와 ApplicationContext의 차이를 Lazy/Eager 로딩, 이벤트, 국제화, BeanPostProcessor 자동 등록까지 인터랙티브 시각화로 완전 정복합니다.
2026년 3월 21일 · 약 10분 읽기
Q. "BeanFactory와 ApplicationContext의 차이를 설명해주세요. 실무에서는 어떤 것을 사용하고, 그 이유는 무엇인가요?"
예상 꼬리질문
답변 가이드
"BeanFactory는 Spring IoC 컨테이너의 최상위 인터페이스로, 빈의 등록·생성·조회를 담당하는 가장 기본적인 컨테이너입니다. ApplicationContext는 BeanFactory를 상속·확장한 인터페이스로, 엔터프라이즈 애플리케이션에 필요한 부가 기능을 추가로 제공합니다. 실무에서 ‘Spring 컨테이너’라고 부르는 것은 거의 항상 ApplicationContext를 가리킵니다."
"가장 핵심적인 차이는 빈 로딩 방식입니다. BeanFactory는 getBean() 호출 시점에 빈을 생성하는 지연 로딩(Lazy Loading)을 사용하고, ApplicationContext는 컨텍스트 초기화 시점에 모든 싱글톤 빈을 생성하는 즉시 로딩(Eager Loading)을 사용합니다. 또한 ApplicationContext는 이벤트 발행, 국제화, 환경 추상화 기능을 추가로 제공하며,BeanPostProcessor를 자동으로 감지·등록해 @Autowired, @Transactional 같은 어노테이션이 자동 처리됩니다."
"실무에서는 BeanFactory를 직접 사용하는 경우는 거의 없으며, 항상 ApplicationContext를 사용합니다. Eager Loading 덕분에 애플리케이션 기동 시점에 설정 오류를 즉시 감지할 수 있고, @Autowired·@Transactional·@EventListener 등 모든 Spring 어노테이션이 자동으로 동작하기 때문입니다. BeanFactory는 메모리가 극도로 제한된 임베디드 환경이나 프레임워크 내부 구현에서만 직접 사용됩니다."
TL;DR
- - BeanFactory: IoC 컨테이너의 최소 인터페이스, Lazy Loading, getBean() 제공
- - ApplicationContext: BeanFactory 확장, Eager Loading + 이벤트·국제화·환경·AOP 자동 처리
- - BeanPostProcessor 자동 등록: @Autowired, @Transactional이 자동 동작하는 이유
- - 실무 원칙: 항상 ApplicationContext — BeanFactory 직접 사용은 특수한 경우에만
면접에서 "BeanFactory와 ApplicationContext의 차이"를 물어볼 때, 면접관이 정말 듣고 싶은 건 단순히 "ApplicationContext가 더 많은 기능을 가져요"가 아닙니다.
Lazy vs Eager 로딩의 트레이드오프, BeanPostProcessor 자동 등록, 실무에서 왜 항상 ApplicationContext를 쓰는지를 논리적으로 설명할 수 있어야 합니다. 인터랙티브 시각화로 두 컨테이너의 차이를 직접 체험하며 면접 답변을 완성해 보겠습니다.
1. 인터페이스 계층 구조와 Lazy vs Eager 로딩
꼬리질문: "BeanFactory의 Lazy Loading과 ApplicationContext의 Eager Loading은 각각 어떤 상황에서 유리한가요?"
ApplicationContext는 BeanFactory의 하위 인터페이스입니다. 즉, BeanFactory가 할 수 있는 모든 것을 ApplicationContext도 할 수 있고, 거기에 부가 기능이 더해진 구조입니다. 가장 직관적인 차이는 빈을 언제 만드느냐입니다. BeanFactory는 getBean()이 처음 호출될 때 빈을 생성하고(Lazy), ApplicationContext는 컨텍스트가 초기화될 때 싱글톤 빈을 모두 미리 생성합니다(Eager).
Eager Loading은 기동 시간이 길어지는 단점이 있지만, 애플리케이션 시작 시점에 설정 오류를 즉시 발견할 수 있다는 강력한 장점이 있습니다. Lazy Loading은 기동이 빠르지만, 오류가 실제 요청이 들어올 때야 드러납니다.
트리 노드를 클릭하거나 시뮬레이션을 실행해 두 방식의 차이를 확인하세요.
인터페이스 계층 구조
노드를 클릭하면 설명을 확인할 수 있습니다.
2. ApplicationContext의 6가지 부가 기능
꼬리질문: "ApplicationContext가 제공하는 BeanFactory 이외의 부가 기능에는 어떤 것들이 있나요?"
BeanFactory가 "빈을 만들고 꺼내주는" 역할만 한다면, ApplicationContext는 엔터프라이즈 애플리케이션 운영에 필요한 6가지 기능을 추가로 제공합니다. 이 중 가장 중요한 것은 이벤트 발행, 국제화, 환경 추상화입니다.
Spring에서 @EventListener로 이벤트를 구독하고, application.yml로 환경별 설정을 분리할 수 있는 것도 모두 ApplicationContext 덕분입니다.
행을 클릭하면 해당 기능의 코드 예시를 확인할 수 있습니다.
기능 비교
행을 클릭하면 코드 예시를 확인할 수 있습니다.
| 기능 | BeanFactory | ApplicationContext |
|---|---|---|
| 빈 로딩 방식 | Lazy (요청 시) | ✓ Eager (시작 시) |
| 이벤트 발행 | 미지원 | ✓ ApplicationEventPublisher |
| 국제화(i18n) | 미지원 | ✓ MessageSource |
| 리소스 로딩 | 기본 제공 | ✓ ResourceLoader (추상화) |
| 환경/프로파일 | 미지원 | ✓ EnvironmentCapable |
| AOP 자동 처리 | 수동 등록 필요 | ✓ BeanPostProcessor 자동 등록 |
3. BeanPostProcessor 자동 등록의 차이
꼬리질문: "BeanPostProcessor가 ApplicationContext에서 자동으로 등록되는 이유가 무엇인가요?"
@Autowired가 자동으로 동작하는 이유는 AutowiredAnnotationBeanPostProcessor가 컨테이너에 등록되어 있기 때문입니다. ApplicationContext는 이런 BeanPostProcessor를 컨테이너 초기화 시 자동으로 감지·등록합니다. 반면 BeanFactory는 개발자가 직접 수동으로 등록해야 하며, 그렇지 않으면 @Autowired, @PostConstruct, @Transactional 같은 어노테이션이 모두 무시됩니다.
모드를 전환하며 BeanFactory와 ApplicationContext의 빈 생성 흐름 차이를 단계별로 확인하세요.
빈 생성 흐름 비교
모드를 선택하고 단계별로 진행하며 차이를 확인하세요.
4. Spring Boot에서의 ApplicationContext
꼬리질문: "Spring Boot에서 ApplicationContext는 언제 어떻게 생성되나요?"
Spring Boot 애플리케이션에서 SpringApplication.run()을 호출하면 내부적으로 AnnotationConfigServletWebServerApplicationContext(웹) 또는 AnnotationConfigApplicationContext(비웹)가 생성됩니다. @SpringBootApplication이 @ComponentScan을 포함하고 있어 ApplicationContext는 패키지 내 모든 빈을 자동으로 감지·등록합니다.
기동 흐름을 단계별로 따라가고, 하단에서 상황별 구현체를 선택해 확인하세요.
Spring Boot 기동 흐름
단계를 진행하며 기동 흐름을 확인하고, 하단에서 구현체를 선택해보세요.
단계 1 / 8
SpringApplication.run() 호출
main() 메서드에서 Spring Boot 애플리케이션을 시작합니다.
상황별 ApplicationContext 구현체
Spring Boot 웹 앱 기본값. 내장 Tomcat 서버를 포함하며 HTTP 요청을 처리합니다.
퀴즈로 확인하기
개념을 제대로 이해했는지 확인해 보세요.
Lazy vs Eager 로딩
@Component
public class OrderService {
@Autowired
private NonExistentService service; // 존재하지 않는 빈
}
// BeanFactory 사용 시와 ApplicationContext 사용 시
// 이 오류는 언제 발견될까요?@Autowired가 동작하지 않는 이유
DefaultListableBeanFactory factory =
new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(factory)
.loadBeanDefinitions("beans.xml");
@Component
class MyService {
@Autowired
private UserRepository userRepository;
}
MyService svc = factory.getBean(MyService.class);
// svc.userRepository 의 값은?Spring Boot 웹 앱의 컨텍스트 구현체
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
ApplicationContext ctx =
SpringApplication.run(MyApplication.class, args);
// ctx의 실제 구현체 타입은?
System.out.println(ctx.getClass().getSimpleName());
}
}
// Spring Boot 웹 MVC 앱 기준이벤트 발행과 BeanFactory
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder() {
publisher.publishEvent(
new OrderCreatedEvent(this, 1L)
);
}
}
// BeanFactory를 컨테이너로 사용할 때
// 이 코드의 동작은?면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 BeanFactory vs ApplicationContext 질문은 준비 완료입니다.
- - BeanFactory: IoC 컨테이너 최상위 인터페이스, Lazy Loading, getBean() 기본 제공
- - ApplicationContext: BeanFactory 확장, Eager Loading + 이벤트·국제화·환경 부가 기능
- - Lazy vs Eager 트레이드오프: Eager는 기동 시 오류 감지, Lazy는 빠른 기동 — 실무는 항상 Eager(ApplicationContext)
- - BeanPostProcessor 자동 등록: ApplicationContext만 자동 감지 — @Autowired, @Transactional이 동작하는 이유
- - Spring Boot 구현체: 웹 앱 → AnnotationConfigServletWebServerApplicationContext, 비웹 → AnnotationConfigApplicationContext
추가 학습 자료
- 김영한 스프링 핵심 원리 - 기본편 (인프런) — BeanFactory와 ApplicationContext의 차이를 강의 영상으로 직관적으로 설명. IoC 컨테이너 전반을 처음 배우기에 가장 좋은 한국어 자료
- Spring 공식 문서 — BeanFactory or ApplicationContext? — Spring 팀이 직접 권장하는 사용 지침. 짧고 명확하며 실무 근거를 제시
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.