티스토리 뷰

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

접속: http://localhost:8080


✅ 빌드 결과 요약

항목 예상 수치

기동 시간 0.1 ~ 0.5초
메모리 사용량 30 ~ 100MB
컨테이너 이미지 크기 약 15 ~ 30MB
의존 Docker 없이 독립 실행 가능

🎁 추가 팁

  • application.properties는 네이티브 이미지 생성 시 포함되므로, 프로파일이나 설정도 빌드 시점에 포함됩니다.
  • 리플렉션을 사용하는 경우 reflect-config.json 설정이 필요할 수 있습니다.
  • Spring AOT가 자동으로 GraalVM 최적화를 지원합니다 (target/classes/META-INF/native-image/... 경로 참고)

 

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
글 보관함