실행 시간 효율을 높이는 클래스 데이터 공유(CDS)와 Layered Jar
MyBatis 기반 Spring Boot 앱의 초기 구동 시간을 CDS와 Layered Jar로 30% 줄였다.
Java 애플리케이션의 약점인 초기 구동 시간을 줄이기 위해 GraalVM Native Image, Project CRaC, Project Leyden 같은 접근이 제안되고 있다. 그중 네이티브 이미지는 효과가 크지만 제약이 많고, CRaC은 리눅스와 트러블슈팅 부담이 있어 적용 장벽이 높다.
이번 사례에서는 Project Leyden이 활용할 Application Class-Data Sharing(CDS) 를 먼저 적용해, MyBatis가 들어간 시스템의 시작 시간을 줄였다. 개발 환경은 JDK 21, Spring Boot 3.2.2, MyBatis 3.0.3였고, Spring Framework 6.1.3의 CDS 정식 지원을 활용했다.
적용 절차는 먼저 -XX:ArchiveClassesAtExit=application.jsa로 아카이브를 만들고, 이후 -XX:SharedArchiveFile=application.jsa를 지정해 실행하는 방식이다. 로그 분석 결과 총 18,034개 클래스와 JDK proxy 중 **81.25%**가 캐시에서 로딩됐고, org.springframework 계열이 큰 비중을 차지했다.
함께 사용한 Layered Jar는 Spring Boot의 레이어 구조를 이용해 Docker 이미지의 중복을 줄이는 방식이다. 멀티 스테이지 Dockerfile에서 의존성, 로더, 스냅샷 의존성, 애플리케이션 레이어를 분리해 복사하면, 변경 범위를 최소화하면서 이미지 관리와 실행 효율을 개선할 수 있다.
실제 결과는 초기 실행 시간이 83초에서 56초로 줄어든 것이었다. 약 30% 개선으로, GraalVM보다 효과는 작지만 복잡한 네이티브 이미지 적용이 어려운 환경에서는 충분히 고려할 만한 대안으로 제시된다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.