Spring+React 프로젝트에 GraalVM Native 를 붙이면?

Sunghyun Roh
6 min readJan 26, 2023

오늘은 간단한 토이 프로젝트를 위해 spring에 react를 붙여서 서비스를 만들어보고 있었습니다

만들고자 했던 프로젝트는 회사에서 만들고 있는 제품을 쉽게 설치 할 수 있는 installer였는데요

jenkins처럼 처음 서비스를 켜면 설치하는 프로세스에 큰 인상을 받았거든요

jenkins를 처음 실행하면 설치 페이지가 떠요

딱 Setup하는 기능 컨셉만 잘 꺼내서 쓰고 싶었어요

https://velog.io/@u-nij/Spring-Boot-React.js-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85 페이지를 보면서 열심히 세팅을 진행하고 있었습니다

이때 문득 GraalVM의 native 기능을 쓰게 되면, java가 설치되어 있지 않아도 지금 만들고 있는 installer를 실행시킬 수 있지 않을까? 생각이 들었어요

  1. Spring에 GraalVM 입히기
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
id 'org.graalvm.buildtools.native' version '0.9.18'
}

group = 'io.imqa'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

graalvm에 대한 spring 세팅을 진행합니다.

id 'org.graalvm.buildtools.native' version '0.9.18'

해당코드를 추가하면 되겠네요

2. graalvm 설치

저는 Mac 환경이여서 sdkman을 이용하여 설치를 심플하게 진행하였어요

https://sdkman.io/install 에서 설치 방법을 확인할 수 있어요

설치가 완료 된 후

sdk list java

를 호출하면 다음과 같은 화면을 볼 수 있어요

sdk list java

저는 이미 설치가 되어있는걸 확인할 수 있는데요

설치를 안하신분은 17이상의 graalVM을 설치하시기 바랍니다

뒤에 Identifier값을 복사해서

Q를 클릭하여 리스트 화면에서 나와서

> sdk install java 22.3.r17-grl

In progress...

Repackaging Java 22.3.r17-grl...

Done repackaging...
Cleaning up residual files...

Installing: java 22.3.r17-grl
Done installing!

> sdk use java 22.3.r17-grl

Using java version 22.3.r17-grl in this shell.

> java -version
openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08, mixed mode, sharing)

다음과 같이 명령어를 입력하여 graalVM을 심플하게 설치했습니다

3. GraalVM Native Build

프로젝트 루트에서

> ./gradlew nativeCompile

또는 다음과 같이 intellij에서 nativeCompile을 진행해줍니다

그러면 gradle이 nativeCompile을 진행하는데요…

저같은 경우에는 17분이 걸렸습니다

(17분이나 걸려서 빌드되고 있는 이시간에 기다리기 지루해서 포스팅 쓴거에요… 성능 좋은 맥 사용하시길…)

실제 빌드된 폴더에 가보면 다음과 같이 빌드된것을 볼 수 있습니다

(파일명은 제가 만든 프로젝트명이에요)

빌드가 완료되었으니 실행시켜보겠습니다

스프링이 잘 올라간 것을 볼 수 있습니다

실제 실행하면 react페이지와 api 모두 정상적으로 동작하는 것을 볼 수 있습니다

react 페이지
spring api 결과

오늘은 spring과 react로 만들어진 서비스를 GraalVM의 Native 기능을 이용하여 실행하는 구성을 만들어봤습니다

위에 스프링 올라간 시간 봐주세요… 37ms 입니다…

GraalVM의 native빌드를 하니 스프링 올라가는게 엄청 빠르네요

여러분들도 GraalVM으로 여러분들의 서비스를 native로 바꿔서 성능을 체험해보세요

소스코드

https://github.com/devload/SpringReactGraalNative

--

--