티스토리 뷰

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
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함