백엔드
Spring Boot Startup Time 최적화 : 90초에서 30초까지의 여정(feat. 오픈소스 기여)
두줄요약
Spring Boot Startup Time을 90초에서 30초로 줄인 6단계 최적화 과정을 정리했습니다. 프로파일링으로 원인을 찾고, Spring 내부 동작과 오픈소스 패치까지 활용해 병목을 해소했습니다.
문제 상황
- Kubernetes 환경에서 Spring Boot 애플리케이션의 Startup Time이 너무 길어 Pod 기동, CronJob 실행, 노드 이주 시 가용성 저하
- 동일 이미지·동일 애플리케이션인데도 Pod마다 부팅 시간이 크게 달라지는 편차
- 평균 90초 수준의 부팅 시간으로 서비스 영향이 큰 상태
구조와 흐름
- Spring 초기화가 main thread에서 순차적으로 진행되어, 하나의 블로킹이 전체 부팅 지연으로 이어지는 구조
- Async Profiler, Flame graph, BufferingApplicationStartup으로 병목 구간을 단계별 추적
- 부팅 과정의 주요 병목을 순차적으로 제거하며 원인과 해결책을 좁혀감
해결 방법
- 초기화 시점의 외부 API 호출을 fire-and-forget으로 전환해 main thread 블로킹 제거
- 불필요한 Java Agent 제거로 bytecode 변환 비용 절감
- EntityManagerFactory 비동기 초기화, JPA bootstrapMode: DEFERRED, Spring Data 버그 임시 패치, repository 구조 정리, background 초기화 적용
적용해볼 점
- 평균값보다 실제 메트릭과 프로파일로 병목을 찾는 접근
- 프레임워크 내부 동작을 소스 코드로 확인해 우회가 아닌 근본 원인 해결
- class loading/linking 병목에는 CDS/AOT Cache 같은 추가 최적화 검토
