티스토리 뷰
728x90
✅ GraalVM을 사용한 네이티브 이미지 정적 링크 빌드란?
GraalVM 네이티브 이미지(Native Image)란?
Java 애플리케이션을 AOT(Ahead-Of-Time) 컴파일하여 **독립 실행 파일(바이너리)**로 변환하는 기술입니다.
이렇게 하면 JVM 없이 실행 가능하며, 시작 속도가 빠르고 메모리 사용량이 적습니다.
그런데 네이티브 이미지(Native Image)를 빌드하는 방법은 두 가지가 있습니다.
- 동적 링크(Shared Link): 실행 시 OS의 공유 라이브러리(glibc 등)를 사용
- 정적 링크(Static Link): 실행 파일에 필요한 모든 라이브러리를 포함 (독립적 실행 가능)
즉, "정적 링크 빌드"란?
- OS에 의존하지 않고 실행될 수 있도록 모든 라이브러리를 실행 파일에 포함하는 방식입니다.
- 이렇게 하면 scratch 같은 최소한의 컨테이너에서도 실행 가능합니다.
🔥 왜 정적 링크를 사용해야 할까?
빌드 방식 | 특징 | 실행 환경 |
동적 링크 (기본) | OS 공유 라이브러리를 사용 | glibc 또는 musl 필요 |
정적 링크 (Static) | 실행 파일에 모든 라이브러리 포함 | OS가 필요 없음 (scratch 사용 가능) |
💡 즉, 정적 링크 빌드는 "완전 독립적인 실행 파일"을 만들기 위해 필요합니다!
🚀 GraalVM을 사용한 정적 링크 네이티브 이미지 빌드
📌 실행 방법: -Dorg.graalvm.nativeimage.imagecode=static 옵션 추가
Dockerfile에서 Gradle을 사용하여 정적 링크 네이티브 이미지를 빌드하는 과정입니다.
# Step 1: GraalVM을 사용한 정적 링크 네이티브 이미지 빌드
FROM ghcr.io/graalvm/graalvm-ce:alpine AS builder
WORKDIR /app
# 필수 패키지 설치
RUN apk add --no-cache bash curl gcc musl-dev zlib-dev
# 프로젝트 파일 복사
COPY . .
RUN chmod +x ./gradlew
# 네이티브 이미지 빌드 (완전 정적 링크)
RUN ./gradlew nativeCompile \
-Dorg.graalvm.nativeimage.imagecode=static \ # ✅ 정적 링크 옵션 추가
--no-daemon \
-Pnative
🛠 정적 링크 vs 동적 링크 예제 비교
🚫 동적 링크 실행 파일 (imagecode=dynamic)
$ ldd application
linux-vdso.so.1 (0x00007ffc1092f000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbcf27f4000)
✅ 동적 링크 방식이므로 libc.so.6 같은 OS 라이브러리가 필요합니다.
✅ 정적 링크 실행 파일 (imagecode=static)
$ ldd application
not a dynamic executable # ✅ 모든 라이브러리가 포함되어 있음!
✅ OS 없이도 실행 가능 (scratch 컨테이너에서도 실행 가능)
🔥 최종 결론:
- GraalVM 네이티브 이미지는 기본적으로 동적 링크 방식으로 빌드됨
- 하지만, 최소한의 리소스로 실행하려면 "정적 링크 빌드"가 필요
- -Dorg.graalvm.nativeimage.imagecode=static 옵션을 추가하면 OS 없이 실행 가능한 독립 실행 파일 생성
- 정적 링크 빌드를 사용하면 scratch 컨테이너에서 최적의 실행 환경을 만들 수 있음! 🚀
728x90
'Programming' 카테고리의 다른 글
자바 Lazy Initialization이 유용하게 사용 하는 법 (0) | 2025.03.20 |
---|---|
스프링부트 서비스 리소스 절감 최적화 전략 (0) | 2025.03.20 |
자바 WebClient VS FeignClient 비교 (0) | 2025.03.20 |
Kotlin + Spring Boot REST API 예시 (0) | 2025.03.18 |
비동기(Asynchronous) vs. 동기(Synchronous), 블로킹(Blocking) vs. 논블로킹(Non-blocking) (0) | 2025.03.18 |