📚FOS Study
홈카테고리
홈카테고리

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agents 페이지로 이동
    • custom-agents 페이지로 이동
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • 멀티모달 LLM (Multimodal Large Language Model)
  • architecture 페이지로 이동
    • 디자인 패턴
    • 분산 트랜잭션
    • 슬롯 게임 엔진 고도화 — 2025년 회고
  • css 페이지로 이동
    • FlexBox 페이지로 이동
  • database 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • 커넥션 풀 크기는 얼마나 조정해야할까?
    • 인덱스 - DB 성능 최적화의 핵심
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • monitoring 페이지로 이동
  • go 페이지로 이동
    • Go 언어 기본 학습
  • http 페이지로 이동
    • HTTP Connection Pool
  • interview 페이지로 이동
    • 210812 페이지로 이동
    • 뱅크샐러드 AI Native Server Engineer
    • CJ 올리브영 지원 문항
    • CJ 올리브영 커머스플랫폼유닛 Back-End 개발 지원 자료
    • 마이리얼트립 - Platform Solutions실 회원주문개발 Product Engineer
    • NHN 서비스개발센터 AI서비스개발팀
    • nhn gameenvil console backend 직무 인터뷰 준비
    • 면접을 대비해봅시다
    • Tossplace Node.js Developer
    • 토스플레이스 Node.js 백엔드 컬처핏
  • java 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • OpenTelemetry 란 무엇인가?
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • Data_Structures_and_Algorithms 페이지로 이동
    • Heap 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node.js
    • npm vs pnpm 선택기준은 무엇인가요?
    • `setImmediate()`
  • kafka 페이지로 이동
    • Kafka 기본
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • 메시지 전송 신뢰성
  • network 페이지로 이동
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • react 페이지로 이동
    • JSX 페이지로 이동
    • VirtualDOM 페이지로 이동
    • v16 페이지로 이동
  • redis 페이지로 이동
    • Redis
    • Redis Hash와 Lua 스크립트로 잭팟 누적 구현하기
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
📚FOS Study

개발 학습 기록을 정리하는 블로그입니다.

바로가기

  • 홈
  • 카테고리

소셜

  • GitHub
  • Source Repository

© 2025 FOS Study. Built with Next.js & Tailwind CSS

목록으로 돌아가기
☕java/ spring

Application Context의 생명주기

약 2분
2026년 2월 25일
2026년 3월 22일 수정
GitHub에서 보기

Application Context의 생명주기

  • AbstractApplicationContext.refresh() 메서드의 흐름과 동일하다.
  • 이 과정 중, 단 한 단계라도 예외가 발생하면 리프레시는 중단되며, has not been refreshed yet 에러가 발생한다.

1. 초기화 단계 (Bootstrap & Refresh)

  • 1. 준비 (prepareRefresh)
    • 컨텍스트의 상태를 'active'로 전환하기 위한 준비 작업을 한다.
    • 시작 시간 기록, 시스템 속성 (Environment) 검증 및 초기화가 일어난다.
    • 아직 빈은 생성되지 않는다.
  • 2. BeanFactory 획득 (obtainFreshBeanFactory)
    • 내부적으로 DefaultListableBeanFactory를 생성(또는 갱신)한다.
    • XML, JavaConfig 등 설정 파일로부터 Bean Definition(빈 설계도)를 로딩한다.
    • 이 시점에는 "어떤 빈을 만들지"만 알고 있고, 실제 객체는 없다.
  • 3. BeanFactory 전처리 (prepareBeanFactory)
    • BeanFactory에 표준 컨텍스트 구성(ClassLoader, PostProcessor 등)을 설정한다.
    • ApplicationContextAware 같은 Aware 인터페이스를 처리할 BeanPostProcessor를 등록한다.
  • 4. BeanFactory 후처리 (invokeBeanFactoryPostProcessors)
    • BeanFactoryPostProcessor가 실행된다.
    • 빈의 정의(BeanDefinition)을 수정할 수 있는 마지막 방법이다. (프로퍼티 치환, 스코프 변경 등)
  • 5. Bean 후처리기 등록 (registerBeanPostProcessors)
    • 빈 생성 과정에 개입할 BeanPostProcessor들을 찾아서 등록한다. (실행은 나중에)
  • 6. 메시지 소스 & 이벤트 멀티캐스터 초기화
    • i18n 처리를 위한 MessageSource와 이벤트 발행을 위한 ApplicationEventMulticaster를 초기화한다.
  • 7. 특정 컨텍스트 초기화 (onRefresh) 🔥
    • 이 단계는 비어 있는 템플릿 메서드이며, 하위 클래스에서 구현한다.
    • Spring Boot의 ServletWebServerApplicationContext의 경우:
      • 이 시점에 내장 톰캣(Tomcat) 같은 웹 서버를 구동한다
      • 포트 충돌이나 서블릿 설정 오류가 있다면 여기서 터지고, 리프레시는 실패한다.
  • 8. 리스너 등록 (registerListeners)
    • ApplicationListener 구현체들을 등록한다.
  • 9. 싱글 톤 빈 생성 (finishBeanFactoryInitialization) 🔥🔥
    • 가장 중요한 단계이자 에러의 주범이다.
    • 남아있는 모든 Non Lazy 싱글톤 빈을 인스턴스화하고 의존성을 주입(DI)한다.
    • 순서:
      • 인스턴스 생성
      • 의존성 주입
      • Aware 콜백 (setApplicationContext)
      • BeanPostProcessor (Before)
      • @PostConstruct
      • BeanPostProcessor (After)
  • 10. 리프레시 완료 (finishRefresh)
    • LifecycleProcessor의 onRefresh를 호출한다.
    • ContextRefreshedEvent 이벤트를 발행한다.
    • 이 단계까지 에러 없이 도달해야 비로소 컨텍스트가 완전한 "Refreshed" 상태가 된다.

2. 실행 단계 (Active & Running)

리프레시가 성공적으로 끝나면 컨텍스트는 Running 상태가 된다.

  • 빈 조회 및 사용: getBean() 요청 시 완성된 빈을 반환한다.
  • 이벤트 발행: publishEvent()를 통해 이벤트를 전파한다.
  • 웹 요청 처리: DispatcherServlet이 들어오는 요청을 받아 컨트롤러로 라우팅한다.

3. 종료 단계 (Destory & Close)

애플리케이션 종료나 테스트 종료 시 close()가 호출된다.

  • 1. ContextClosedEvent 발행
    • 종료 이벤트를 알린다
  • 2. Lifecycle 빈 종료
    • SmartLifecycle 등의 stop() 메서드를 호출한다.
  • 3. 싱글톤 빈 파괴
    • 생성의 역순으로 빈을 제거한다
    • @PreDestroy -> DisposableBean.destroy() 순으로 실행된다.
  • 4. Active 상태 해제
    • 컨텍스트를 비활성화한다.
java 카테고리의 다른 글 보기수정 제안하기

댓글

댓글을 불러오는 중...
목차
  • Application Context의 생명주기
  • 1. 초기화 단계 (Bootstrap & Refresh)
  • 2. 실행 단계 (Active & Running)
  • 3. 종료 단계 (Destory & Close)