최근 스프링 발표 세션을 듣거나 블로그들을 돌아다니다 보면 GraalVM에 대해서 언급한다.
공통 내용 중 한 가지는 GraalVM의 기능 중 AOT 컴파일러를 이용하면 Native 이미지 또는 실행 파일을 생성할 수 있게 도와준다고 한다.
즉, JIT을 사용하여 바이트코드를 매번 기계어 코드로 변환하는 것이 아닌 해당 머신의
기계어 코드를 바로 실행시킬 수 있게 하는 것이다.
이번 포스팅에서 자세한 내용을 다루기보다는 얼마나 빠른지 체감을 할 수 있는 정도이다.
(자세한 내용은 다른 블로그에서 잘 설명하고 있다.)
Native 빌드 방법
Gradle GraalVM 플러그인을 사용하면 Native Image를 만드는 방법 말고도 Native 실행 파일을 직접 만들 수 있게 제공한다.
스프링 공식 문서를 보고 적용했다.
GraalVM Native Image Support
When writing native image applications, we recommend that you continue to use the JVM whenever possible to develop the majority of your unit and integration tests. This will help keep developer build times down and allow you to use existing IDE integration
docs.spring.io
Native Compile 이후


여러 개의 JSON 메타 데이터 파일들이 생성되는데 이것들은 컴파일 때 힌트 파일로 사용된 파일들이다.
빠른 로딩을 위해 JSON에 미리 기록해 놓고 정적 컴파일 방식을 사용한다.
런타임 때 어노테이션이 붙은 Bean들을 찾아 생성하지 않기 때문에 더 적은 메모리를 사용할 테고 초기 로딩 속도가 훨씬 빠른 이유 중 하나 일 것 같다.
실행
build/native/nativeCompile 경로로 가면 프로젝트 이름으로 된 실행파일이 존재하는데 해당 파일을 실행시키기만 하면 된다.

실행 속도가 어마어마하게 빠르다.

비교를 위해 이전 방식도 올려본다.

AWS Lambda와 같은 서버리스 환경, 오토 스케일링이 빈번하게 일어나는 컨테이너 환경에서 사용하면 굉장히 유용할 것 같다.
참고