김남주 - 2023년 10월 11일
GraalVMGraalVM
Oracle GraalVM은 대체 JIT(Just-In-Time) 컴파일러를 사용하여 Java 및 JVM 기반 애플리케이션의 성능을 가속화할 수 있는 고성능 JDK입니다. 이 솔루션은 애플리케이션 대기 시간을 줄이고 가비지 수집 시간을 단축하여 최대 처리량을 개선하며 연중무휴 Oracle 지원을 제공합니다.
또한 Java 바이트코드 AOT(Ahead Of Time)를 컴파일하고 거의 즉시 시작되며 메모리 리소스를 거의 사용하지 않는 일부 애플리케이션에 대해 기본 실행 파일을 생성하는 네이티브 이미지 유틸리티가 있습니다.
GraalVM 은 다음과 같은 특징을 가진다.
-
낮은 메모리 사용량
기본 실행 파일은 JVM에 필요한 메모리 및 CPU 리소스의 일부만 사용하므로 활용도가 향상되고 비용이 절감됩니다.
-
향상된 보안
기본 실행 파일에는 애플리케이션에 필요한 클래스, 메서드 및 필드만 포함되어 있어 공격 노출 영역이 줄어듭니다.
-
빠른 시작
미리 컴파일된 기본 실행 파일은 즉시 시작되며 최고 성능으로 실행하기 위해 준비 작업이 필요하지 않습니다.
-
컴팩트한 패키지
기본 실행 파일은 크기가 작으며 최소 컨테이너 이미지에 쉽게 배포할 수 있는 다양한 연결 옵션을 제공합니다.
-
Supported by Frameworks
Spring Boot, Micronaut, Helidon 및 Quarkus와 같은 널리 사용되는 프레임워크는 GraalVM에 대한 최고 수준의 지원을 제공합니다.
-
Supported by Leading Cloud Platforms
AWS, Microsoft Azure, GCP 및 Oracle Cloud Infrastructure와 같은 주요 클라우드 플랫폼의 SDK는 GraalVM을 통합하고 지원합니다.
AOT 컴파일
GraalVM은 Java 바이트코드를 네이티브 코드로 컴파일하는 AOT 컴파일러를 제공합니다. 이 컴파일러는 Java 애플리케이션을 네이티브 이미지로 컴파일하고 실행 파일을 생성합니다.
이 실행 파일은 JVM에 필요한 메모리 및 CPU 리소스의 일부만 사용하므로 활용도가 향상되고 비용이 절감됩니다.
GraalVM 사용해보기
1. 스프링 프로젝트 생성
spring initializr를 프로젝트 생성 시 spring native support 를 선택한다.
2. Docker 설치
본인 환경에 맞는 도커를 설치한다.
빌드 이미지의 경우 Gradle에서 자동으로 내려받는다.
3. 코드 작성
본인이 원하는 코드를 작성한다.
4. gradle 이미지 빌드
아래 명령어를 통해 이미지를 빌드한다.
./gradlew bootBuildImage
또는 gradle 탭에서 bootBuildImage를 실행한다.
자동으로 이미지를 빌드하고, 도커 이미지를 생성한다.
본인의 경우 약 3분 정도 소요되었다.
자동으로 생성된 도커 이미지를 확인할 수 있다.
5. 도커 이미지 실행
이미지 실행 시 다음과 같이 실행된다.
기존 스프링 실행 시 3초 정도 소요되었던 것과 비교하여 Spring Native의 경우 0.1초 정도 소요되었다.
클라우드 환경에서 GraalVM
최근 서버리스 및 마이크로서비스 아키텍처가 대세가 되면서, 클라우드 환경에서의 JVM 입지가 줄어들고 있다고 생각한다.
그 이유는 JVM은 메모리를 많이 사용하며, 부팅 시간이 오래 걸리기 때문이다.
하지만, GraalVM을 사용하면서 이러한 단점을 극복할 수 있다.
GraalVM은 메모리를 적게 사용하며, 부팅 시간이 짧다.
따라서, 클라우드 환경에서 GraalVM을 사용하면 더 많은 서비스를 운영할 수 있다.
결론
GraalVM을 사용하면 기존의 JVM보다 빠른 실행 속도를 보여준다.
또한, 메모리 사용량이 적어서 더 많은 서비스를 운영할 수 있다.
하지만, GraalVM을 사용하면서 단점도 존재한다.
미지원 라이브러리가 존재하며, 빌드 시간이 오래 걸린다.
따라서, GraalVM을 사용하면서 이러한 단점을 고려하여 사용해야 한다.