피드로 돌아가기
커스텀 어노테이션과 리플렉션으로 구현한 Spring Boot 웜업 로직 최적화
올리브영 테크블로그올리브영 테크블로그
Backend

커스텀 어노테이션과 리플렉션으로 구현한 Spring Boot 웜업 로직 최적화

올리브영이 @WarmUp 어노테이션과 리플렉션 기반 AppStartupWarmupRunner를 도입해 Redis·외부 API 초기 응답 시간 67~81% 단축

2024년 10월 30일8intermediate

Context

기존 WarmUpRunner는 각 서비스별 웜업 로직을 수동으로 관리하고 순차 호출하는 방식으로, 새 서비스 추가 시마다 직접 코드를 작성해야 했다. 동기화 처리로 인해 애플리케이션 시작 시간이 증가했으며, Spring Boot 애플리케이션 첫 요청 시 데이터베이스·Redis·외부 API 접근에서 높은 지연이 발생하는 콜드 스타트 문제가 있었다.

Technical Solution

  • @WarmUp 어노테이션 도입: Kotlin 리플렉션으로 어노테이션 붙은 메서드를 런타임에 자동 탐지하여 수동 호출 제거
  • AppStartupWarmupRunner 구현: ApplicationRunner를 상속받아 Spring 애플리케이션 시작 시 @WarmUp 메서드를 비동기 병렬 실행
  • CoroutineScope와 ExecutorService 조합: 코루틴 기반 비동기 작업 관리로 스레드 풀 크기를 제한하고 병렬 실행 효율화
  • SupervisorJob 도입: 단일 웜업 작업 실패가 전체 초기화 프로세스를 중단하지 않도록 격리
  • 동적 파라미터 설정: params 배열로 메서드 호출 시 파라미터를 동적으로 전달하고 타입 자동 추론
  • WarmUpType 열거형: DEFAULT·CONDITION_1·CONDITION_2 등 웜업 실행 조건을 enum으로 정의하여 선택적 실행
  • 성공/실패 기록: 각 클래스·메서드별 웜업 결과를 카운팅하여 Datadog 모니터링 및 Slack 알림으로 전달

Impact

  • Redis 연결 초기 응답 속도: 67% 개선
  • 외부 API 연결 초기 응답 속도: 81% 개선

Key Takeaway

리플렉션 기반 어노테이션과 코루틴을 결합하면 Spring Boot 애플리케이션에서 수동 보일러플레이트 코드 제거와 동시에 병렬 웜업 작업으로 초기화 시간을 단축할 수 있다. 이를 통해 콜드 스타트로 인한 초기 사용자 경험 저하를 획기적으로 개선할 수 있다.


Spring Boot 기반 마이크로서비스에서 Redis·데이터베이스·외부 API 등 외부 리소스 의존성이 있는 서비스의 경우, 커스텀 @WarmUp 어노테이션과 비동기 RuntimeRunner를 조합하면 애플리케이션 시작 시 이 리소스들을 미리 초기화하여 첫 요청의 응답 시간을 50% 이상 단축할 수 있다.

원문 읽기
커스텀 어노테이션과 리플렉션으로 구현한 Spring Boot 웜업 로직 최적화 | Devpick