Programming
Spring Boot + GraalVM Native 빌드 최적화 설정
ipxy
2025. 3. 23. 08:06
728x90
✅ Spring Boot + GraalVM Native 빌드 최적화 설정 총정리
🔧 1. Gradle 설정 (build.gradle 또는 build.gradle.kts)
📌 필수 플러그인
plugins {
id("org.springframework.boot") version "3.2.2"
id("io.spring.dependency-management") version "1.1.3"
id("org.graalvm.buildtools.native") version "0.9.28"
}
📌 GraalVM 빌드 설정
graalvmNative {
binaries {
named("main") {
imageName.set("my-native-app")
buildArgs.addAll(listOf(
"--no-fallback", // JVM fallback 제거
"--static", // 정적 링크 (scratch용)
"--report-unsupported-elements-at-runtime",
"-H:+ReportExceptionStackTraces",
"--initialize-at-build-time=org.slf4j.LoggerFactory"
))
}
}
}
⚙️ 2. application.properties 설정
# 배너 출력 제거 (불필요한 리소스 로딩 제거)
spring.main.banner-mode=off
# ANSI 컬러 제거 (Jansi 등 오류 방지)
spring.output.ansi.enabled=never
# 로그 패턴 단순화 (컬러, AWT 등 방지)
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
# (선택) Spring DevTools 사용 금지
spring.devtools.restart.enabled=false
🐳 3. Dockerfile 최적화 (멀티스테이지 + scratch)
FROM ghcr.io/graalvm/graalvm-ce:latest AS builder
WORKDIR /app
COPY gradlew build.gradle settings.gradle gradle.properties gradle/ ./
RUN chmod +x gradlew
RUN ./gradlew dependencies --no-daemon
COPY src ./src
RUN ./gradlew nativeCompile --no-daemon -Pnative -Dorg.graalvm.nativeimage.imagecode=static
FROM scratch
COPY --from=builder /app/build/native/nativeCompile/my-native-app /application
ENTRYPOINT ["/application"]
📦 4. .dockerignore 설정
.gradle/
build/
.idea/
*.iml
*.log
📂 5. GitLab CI / GitHub Actions 캐시 설정 예시
cache:
key: gradle-cache
paths:
- .gradle/
Gradle 의존성 캐시를 재사용하여 빌드 시간 단축
🚫 6. 사용하면 안 되는 것들
항목 | 이유 |
java.awt.*, BufferedImage, Color 등 | GUI 라이브러리 – GraalVM에서 미지원 |
jansi, AnsiColors | 콘솔 컬러 처리 시 오류 |
Spring DevTools | 자동 리로딩 등 AOT 비호환 기능 포함 |
리플렉션 기반 프레임워크 | 미리 등록하지 않으면 오류 발생 (reflect-config.json 필요) |
📘 7. 빌드/디버깅 팁
CLI 옵션
./gradlew nativeCompile \
-Dspring.aot.debug=true \
-Dspring.output.ansi.enabled=never \
--no-daemon
GraalVM native-image 직접 호출 예시
native-image \
--no-fallback \
--static \
--report-unsupported-elements-at-runtime \
-H:+ReportExceptionStackTraces \
-cp build/libs/myapp.jar
✅ 8. 빌드 후 기대 효과
JVM 모드 | GraalVM Native | |
기동 시간 | 2~10초 | 0.1~0.5초 ⚡ |
메모리 사용량 | 300~600MB | 50~150MB 🧠 |
이미지 크기 | 200~300MB | 15~30MB 📦 |
컨테이너 베이스 | openjdk 기반 | scratch / distroless 기반 가능 |
🧩 9. 선택적으로 고려해볼 추가 설정
설정 | 설명 |
--initialize-at-build-time | 일부 클래스 초기화를 빌드 타임으로 옮겨 성능 개선 |
--enable-url-protocols=http,https | 일부 Spring 기능에서 필요 (환경에 따라) |
리소스 수동 등록 | resource-config.json 작성 또는 Spring AOT 자동 처리 확인 |
✨ 보너스: 꼭 확인할 항목 체크리스트
- --no-fallback 설정했는가?
- spring.main.banner-mode=off 설정했는가?
- ANSI 관련 설정 비활성화 했는가?
- GraalVM 플러그인 최신 버전 사용 중인가?
- gradlew dependencies 캐시 레이어 구성했는가?
- AWT 사용 코드가 없는가?
728x90