스프링 부트 어플리케이션이 실행되면 어떤 일들이 일어나는가.

Spring Boot Application이 시직되면 내부에서 일어나는 일에 대해 정리한다.

1.JVM 및 Main 메서드 시작

  • JVM 이 애플리케이션을 실행하며 main메서드를 호출
  • Spring Boot 애플리케이션은 @SpringBootApplication 어노테이션이 붙은 클래스의 main메서드를 시작점으로 잡는다.

2.SpringApplication 초기화

  • SpringApplication.run() 메서드가 호출되며 스프링 애플리케이션 컨텍스트가 초기화됨
  • 주요 작업
    • 애플리케이션 타입 결정(Servlet, Reactive, None)
    • 배너 출력 여부 설정
    • 기본 프로퍼티 및 환경 로딩

3.Environment 생성 및 설정

  • Environment 객체가 생성되어 시스템 속성, 환경 변수, 프로파일 등이로그됨
  • 외부설정(ex: application.properties, application.yml)이 읽혀지고 환경 변수와 병합됨.

4.Application Context 생성

  • Spring Boot 는 실행 모드에 따라 적절한 컨텍스트를 선택함.
    • AnnotationConfigServletWebserverApplictionContext (웹 어플리케이션)
    • AnnotationConfigReactiveWebServerApplicationContext (리액티브 어플리케이션)
    • AnnotationConfigApplictionContext (비 웹 어플리케이션)
  • 이 컨택스트는 어플리케이션의 모든 빈(bean) 및 설정을 관리함

5.CommandLineRunner 및 ApplicationRunner등록

  • ApplicationContext 초기화 중에 CommandLineRunnerApplicationRunner 인터페이스를 구현한 빈들이 등록됨
  • 이 빈들은 애플리캐이션 초기화가 완료된 후 추가 작업을 실행할 수 있음.

6.자동설정(Auto Configuration)

  • Spring Boot는 @EnableAutoConfiguration을 통해 여러 자동 설정 클래스(AutoConfiguration)을 활성화함.
  • 자동 설정은 클래스 패스 및 환경 변수를 기반으로 애플리케이션에 필요한 빈을 자동으로 구성함.
    • Ex) DB Connection 설정, Web server 설정, Spring Security 설정 등

7.빈(Bean) 등록 및 DI(의존성 주입)

  • 스프링 애플리캐이션 컨텍스트 내에서 모등 @Component, @Service. @Repository, @Controller 등의 빈을 스캔하여 등록
  • 등록된 빈들 간의 의존성을 주입(생성자, 세터, 필드 기반)
  • 프로파일 조건에 따라 특정 빈만 활성화될 수도 있음.

8.내장 웹서버 시작(Optional)

  • 웹 어플리케이션인 경우, Spring Boot는 내장된 톰캣, 제티, 언더토우 등을 통해 HTTP서버를 시작
    • HTTP 포트, SSL설정 등이 적용됨.
  • 서블릿 컨테이너가 초기화 되고 DispatcherSErvlet이 설정됨.

9.Spring MVC 또는 WebFlux 설정(웹 애플리케이션인경우)

  • DispatcherServlet을 통해 요청을 처리하는 기본 매핑을 설정
  • HandlerMapping,HandlerAdapter,ViewReolver등을 초기화 하여 웹 요청에 필요한 구성요소를 준비

10.이밴트 발행 및 리스너 실행

  • Spring Boot는 애플리케이션 실행 과정에서 여러 이벤트를 발행함.
    • ApplicationStartingEvent
    • ApplicationEnvironmentPreparedEvent
    • ApplicationPreparedEvent
    • ApplicationStartedEvent
    • ApplicationReadyEvent
  • 위 이벤트를 통해 특정 시점에 사용자 정의 작업을 실행할 수 있음.

11.애플리케이션 준비 완료

  • 애플리케이션 컨택스트 초기화가 완료되고, 모든 빈이 생성되고 초기화됨
  • CommandLineRunnerApplicationRunner구현체가 실행됨.
  • ApplicationReadyEvent 가 발행되며 애플리케이션이 요청을 처리할 준비가 완료됨

12.애플리케이션 실행 상태 유지

  • Spring Boot는 실행 상태를 유지하며 HTTP요청을 대기하거나 비웹 애플리케이션에서는 작업을 지속함.
  • 내부적으로 애플리케이션 컨택스트는 필요에 따라 라이프 사이클을 관리함.

13.애플리케이션 종료

  • 애플리캐이션 종료시 Spring Boot는 ApplicationContext를 닫으며 빈의 destroy() 메서드 호출 및 리소스 정리를 수행
  • ApplicationFailedEvent 가 발행될 경우 애플리케이션 시패를 기록

Spring Boot Application으 LifeCycle에 대해 간략하게 정리 해 보았다.
Spring 기반의 서비스를 운영 / 개발 하는 회사라면 자주 나오는 질문이니 숙지하고 있으면 좋다.
세부 내용까지는 힘들더라도 1~12번 넘버링 되어있는 순서만이라도 기억하면 좋다.

반응형

+ Recent posts