개인 프로젝트를 진행하며 ApplicationRunner 인터페이스를 사용할 일이 있었는데, 이 인터페이스는 자동으로 프로젝트를 실행하면 인터페이스가 작동됩니다. 어떻게 알아서 진행되는지 궁금하여 찾아보던 중, SpringApplcation 에서 이게 작동한다는 것을 알게되었습니다. 이는 Spring Initializr 를 실행하면 자동으로 생성되는 main 메서드 안에 존재하는 SpringApplication.run() 메서드에 해당합니다.
내부 코드를 열어보면 무려 13단계에 걸쳐 복잡하게 실행되는 것을 볼 수 있습니다. 처음 코드를 까보면 "이걸 다 알아야 하나?" 하는 막막함이 들었습니다.
하지만 결론부터 말씀드리면, 핵심적인 6단계만 정확히 이해하셔도 충분합니다.
오늘은 실제 run() 메서드의 13단계 전체 코드 흐름을 가볍게 살펴보고, 우리가 진짜 집중해야 할 6가지 핵심 단계가 무엇인지 정리해 보겠습니다.
1. 13단계의 전체 흐름 (실제 코드 기준)
실제 run() 메서드는 다음과 같이 수많은 부가 작업을 포함하고 있습니다.
- 시간 측정 및 준비: StopWatch 시작, BootstrapContext 생성, Headless 속성 설정
- 리스너 및 환경 세팅: SpringApplicationRunListeners 실행, Environment 생성 및 준비
- 부가 기능: IgnoreBeanInfo 설정, Spring Banner 출력
- 핵심 컨텍스트 작업: ApplicationContext 생성, Context 준비, Context Refresh (핵심 중의 핵심!)
- 마무리: Refresh 후처리, 실행 시간 로깅, Runners 실행
여기서 시간 측정(StopWatch), 배너 출력, 리스너 상태 업데이트 등은 프레임워크가 안정적으로 돌아가기 위한 '유틸리티성' 작업입니다. 애플리케이션의 뼈대가 만들어지는 진짜 과정은 따로 있습니다.
2. 우리가 집중해야 할 '핵심 6단계'
스프링 부트가 어떻게 환경을 구성하고 Bean을 등록하는지 이해하려면 다음 6단계에 집중해야 합니다.
- SpringApplicationRunListeners 시작: 애플리케이션 실행을 감지하고 이벤트를 발생시킵니다.
- Environment 준비 (prepareEnvironment): 프로필(Profile) 설정, application.yml 등의 프로퍼티를 읽어와 환경(Environment)을 구성합니다.
- ApplicationContext 생성 (createApplicationContext): 애플리케이션의 타입(Servlet, Reactive 등)에 맞는 IoC 컨테이너(Context)를 메모리에 생성합니다.
- ApplicationContext 준비 (prepareContext): 생성된 Context에 준비된 Environment를 주입하고, 초기화 작업(Initializer)을 수행합니다.
- Context Refresh (refreshContext): 가장 중요한 단계입니다! 여기서 컴포넌트 스캔(@ComponentScan)이 일어나고, 구성된 Bean들이 실제로 생성되어 DI(의존성 주입)가 완료됩니다.
- ApplicationRunner 및 CommandLineRunner 실행 (callRunners): 애플리케이션 구동이 완료된 직후, 개발자가 정의한 초기 설정이나 커스텀 실행 코드를 수행합니다.
3. 마무리하며
13단계의 전체 코드는 스프링 부트가 얼마나 견고하게 설계되었는지 보여주는 좋은 자료입니다. 하지만 백엔드 개발자로서 전체적인 구조와 객체의 생명주기를 파악할 때는 환경 설정 ➔ 컨텍스트 생성 ➔ 빈(Bean) 등록(Refresh) 으로 이어지는 핵심 흐름을 먼저 머릿속에 그리는 것이 좋습니다.
'개발 공부 > 스프링' 카테고리의 다른 글
| 순수 Java로 WAS 구현해보기 (1) - 스프링과 WAS의 핵심 개념 이해 (1) | 2026.04.06 |
|---|---|
| 백엔드 계층 구조 정리 2 (0) | 2026.03.11 |
| 백엔드 계층 구조 정리 1 (0) | 2026.03.11 |
| 스프링 기초 (0) | 2026.02.17 |
| 스프링 정리 (0) | 2026.02.16 |