Topic (오늘의 주제)
Spring의 심장: ApplicationContext (스프링 컨테이너)
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 단순히 객체를 생성하는 것을 넘어, 환경 설정, 메시지 처리(다국어), 이벤트 발행 등 엔터프라이즈 애플리케이션 개발에 필요한 모든 기능을 통합 관리해 줍니다.
- 구조적 의미: BeanFactory의 기능을 모두 상속받으면서, 실제 서비스에 필요한 부가 기능을 더한 스프링의 완성형 컨테이너입니다.
- 면접 의도: "스프링 컨테이너가 뭐예요?"라고 물었을 때 BeanFactory와의 차이점, 그리고 **Bean의 로딩 시점(Eager vs Lazy)**을 이해하고 있는지 확인합니다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | 애플리케이션의 설정 정보(Configuration)를 로드하고, Bean의 생성, 관계 설정, 생명주기를 관리하는 스프링의 핵심 인터페이스. |
| 상속 구조 | BeanFactory (최상위 인터페이스, 기본 기능) ⬆ (상속) ApplicationContext (부가 기능 추가) |
| 주요 기능 | 1. Bean 관리: 의존성 주입(DI), 생명주기 관리. 2. MessageSource: 국제화(i18n) 기능 지원. 3. EnvironmentCapable: 로컬/개발/운영 등 환경(Profile) 구분 처리. 4. ApplicationEventPublisher: 이벤트 리스너를 통한 이벤트 발행/구독 모델 지원. |
| 동작 방식 | 컨테이너 구동 시 설정 파일(@Configuration)을 읽음 → 모든 Singleton Bean을 미리 생성(Eager Loading) 및 초기화 → 요청 시 즉시 사용 가능. |
| 비교 | vs BeanFactory: BeanFactory는 빈을 **지연 로딩(Lazy, 부를 때 생성)**하여 가볍지만 기능이 적음. ApplicationContext는 **즉시 로딩(Eager, 뜰 때 다 만듦)**하여 초기화는 느려도 런타임 성능이 좋고 기능이 많음. |
Interview Answer Version (면접 답변식 요약)
"ApplicationContext는 BeanFactory를 확장한 스프링 컨테이너의 핵심 인터페이스입니다.
BeanFactory가 제공하는 기본적인 Bean 관리 및 DI 기능뿐만 아니라, 국제화(i18n), 환경 변수 처리, 애플리케이션 이벤트 등 엔터프라이즈 개발에 필수적인 부가 기능을 제공합니다.
실무에서는 대부분의 경우 BeanFactory보다는 모든 기능을 갖춘 ApplicationContext를 사용합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. 생성자 주입을 써야 하는 이유 (순환 참조 방지)
- ApplicationContext는 앱 구동 시점에 모든 빈을 다 만들고 연결하려고 시도합니다.
- 이때 생성자 주입을 쓰면, A가 B를 필요로 하고 B가 A를 필요로 하는 순환 참조(Circular Reference) 문제를 **앱 구동 시점(컴파일 타임과 유사)**에 바로 에러로 잡아낼 수 있어 안전합니다.
2. ApplicationContextAware 지양
- 일반 클래스에서 ApplicationContext를 직접 사용하고 싶어서 ApplicationContextAware 인터페이스를 구현하는 경우가 있습니다.
- 이렇게 하면 해당 클래스가 **스프링 프레임워크에 강하게 결합(Coupling)**되므로, 가능한 한 @Autowired나 생성자 주입으로 해결하고 컨테이너를 직접 만지는 것은 피해야 합니다.
예상 꼬리질문 정리
- Q: BeanFactory와 ApplicationContext의 가장 큰 차이는?
- 핵심 키워드: 지연 로딩(Lazy) vs 즉시 로딩(Eager). 그리고 부가 기능(국제화, 이벤트 등)의 유무.
- Q: 스프링 컨테이너에 등록된 빈은 모두 싱글톤인가요?
- 핵심 키워드: 기본은 **싱글톤(Singleton)**입니다. 하지만 @Scope("prototype") 설정을 통해 요청마다 새로 생성하게 할 수도 있습니다.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: TCP vs UDP (0) | 2026.01.20 |
|---|---|
| Daily Dev Q&A: Inner Join vs Outer Join (1) | 2026.01.19 |
| Daily Dev Q&A: DNS (0) | 2026.01.14 |
| Daily Dev Q&A: N+1 문제 & 해결책 (0) | 2026.01.13 |
| Daily Dev Q&A: Spring MVC (0) | 2026.01.13 |