Programming
Spring Boot + GraalVM Native + Docker 예시
ipxy
2025. 3. 21. 10:58
728x90
🧱 1. build.gradle (Groovy DSL, Java 기반)
plugins {
id 'java'
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'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
graalvmNative {
binaries {
main {
imageName = 'my-native-app'
buildArgs.add('--no-fallback')
buildArgs.add('--static')
buildArgs.add('-H:+ReportExceptionStackTraces')
}
}
}
📁 2. 프로젝트 구조 예시
src/
└── main/
├── java/
│ └── com/example/demo/
│ └── DemoApplication.java
└── resources/
└── application.properties
build.gradle
Dockerfile
🧪 3. DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/")
public String hello() {
return "Hello from GraalVM Native Image!";
}
}
🐳 4. Dockerfile (멀티스테이지 빌드)
# 1단계: GraalVM 이미지로 빌드
FROM ghcr.io/graalvm/graalvm-ce:latest as builder
WORKDIR /app
# 프로젝트 복사 및 빌드 실행
COPY . .
RUN chmod +x ./gradlew && ./gradlew nativeCompile --no-daemon
# 2단계: 경량화된 실행용 이미지
FROM scratch
WORKDIR /
COPY --from=builder /app/build/native/nativeCompile/my-native-app /application
ENTRYPOINT ["/application"]
🔃 5. docker-compose.yml (선택)
version: '3.9'
services:
demo:
build: .
ports:
- "8080:8080"
▶ 실행 절차
1️⃣ 네이티브 빌드
./gradlew nativeCompile
2️⃣ Docker 이미지 빌드 및 실행
docker build -t my-native-app .
docker run --rm -p 8080:8080 my-native-app
3️⃣ 또는 Compose 실행
docker compose up --build
✅ 빌드 결과 요약
항목 예상 수치
기동 시간 | 0.1 ~ 0.5초 |
메모리 사용량 | 30 ~ 100MB |
컨테이너 이미지 크기 | 약 15 ~ 30MB |
의존 Docker 없이 독립 실행 가능 | ✅ |
🎁 추가 팁
- application.properties는 네이티브 이미지 생성 시 포함되므로, 프로파일이나 설정도 빌드 시점에 포함됩니다.
- 리플렉션을 사용하는 경우 reflect-config.json 설정이 필요할 수 있습니다.
- Spring AOT가 자동으로 GraalVM 최적화를 지원합니다 (target/classes/META-INF/native-image/... 경로 참고)
728x90