Daily Dev Q&A: ApplicationContext

2026. 1. 19. 09:16·Archive/Daily Dev Q&A

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나 생성자 주입으로 해결하고 컨테이너를 직접 만지는 것은 피해야 합니다.

예상 꼬리질문 정리

  1. Q: BeanFactory와 ApplicationContext의 가장 큰 차이는?
    • 핵심 키워드: 지연 로딩(Lazy) vs 즉시 로딩(Eager). 그리고 부가 기능(국제화, 이벤트 등)의 유무.
  2. 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
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: TCP vs UDP
  • Daily Dev Q&A: Inner Join vs Outer Join
  • Daily Dev Q&A: DNS
  • Daily Dev Q&A: N+1 문제 & 해결책
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    경기기후바이브코딩
    java
    spring
    aws_s3
    Project_Review
    프로덕트개발자
    프로젝트회고
    REACT
    OrphanRemova
    devlog
    데브페스트
    backend
    DevFestIncheon2025
    커리어리셋
    Spring비교
    jpa
    til
    SpringBoot
    network
    클로드코드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: ApplicationContext
상단으로

티스토리툴바