피드로 돌아가기
Spring Native + Cloud Run : cold-start 18, RAM 3, facture à 0 FCFA
Dev.toDev.to
Infrastructure

Spring Native 도입으로 Cloud Run Cold-start 3.7s에서 205ms로 94% 단축

Spring Native + Cloud Run : cold-start 18, RAM 3, facture à 0 FCFA

BANGA2026년 5월 26일8intermediate

Context

Cloud Run의 min-instances=0 설정 시 JVM 기반 Spring Boot의 긴 Cold-start로 인한 요청 타임아웃 및 재시도 비용 발생. 특히 JPA의 Runtime Reflection으로 인한 부팅 지연이 사용자 경험 저해 및 불필요한 vCPU/RAM 과금으로 이어지는 구조적 한계 직면.

Technical Solution

  • GraalVM 기반 Native Image 컴파일을 통해 Runtime JVM 및 JIT Compiler 제거
  • Spring AOT(Ahead-Of-Time) 처리를 통한 Bean 정의 및 Mapping 정보의 사전 계산으로 Runtime Reflection 비용 제거
  • Closed-world analysis를 적용하여 사용되지 않는 클래스를 제거한 최적화된 Binary 생성
  • Paketo Buildpacks를 통한 Dockerfile 없는 OCI 이미지 빌드 체계 구축
  • RuntimeHintsRegistrar 커스텀 구현을 통해 AOT 분석에서 누락된 동적 라이브러리(H2 Console 등)의 리플렉션 힌트 제공

Impact

  • Cold-start 시간: 3,740ms → 205ms (18.2배 개선)
  • JPA 초기화 속도: 774ms → 14ms (55배 개선)
  • RAM 사용량: ~250MB → ~80MB (약 3배 감소)
  • 운영 비용: GCP Free Tier 범위 내 0 FCFA 달성
  • 빌드 시간: ~10초 → 7~12분 (Trade-off 발생)

Key Takeaway

Serverless 환경의 Cold-start 문제는 단순 리소스 증설이 아닌, AOT 컴파일을 통한 런타임 오버헤드 제거라는 구조적 접근이 필수적임. 다만, 빈번한 코드 변경이 발생하는 개발 초기 단계에서는 빌드 시간이 긴 Native Image보다 표준 JVM의 생산성이 우세하므로 워크로드 특성에 따른 선택적 적용이 필요함.


- Serverless/Scale-to-Zero 환경에서 Cold-start 1초 이상 발생 시 Spring Native 검토 - 런타임 리플렉션을 사용하는 외부 라이브러리 도입 시 RuntimeHintsRegistrar 설정 필요성 확인 - CI/CD 파이프라인의 빌드 시간 증가(7분+)를 수용할 수 있는 배포 주기인지 평가 - 트래픽이 일정하고 24/7 구동되는 서비스의 경우 JIT 최적화 이득이 큰 표준 JVM 유지 고려

원문 읽기