Kotlin Spring 개발을 하면서 꾸준히 라이브러리 / 프레임워크 / gradle 버전 및 관련 플러그인들 버전을 체크하고 올리고 있는데 Spring의 메이저 버전이 새롭게 Release 되었네요

Spring 5 -> 6

Spring boot 2.7 -> 3.0

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes

2.7 버전 아래에서는 2.7 버전으로 올리라는 추천 문구부터 JDK 17을 최소버전으로 8 -> 17 로 확 올리다니 11 버전은 뭔가 동일선상의 LTS 에서 붕 뜬 느낌이네요

다행히 기존의 프로젝트들도 11에서 17로 올렸고 (Mauve) 신규 CRM도 JDK 17부터 하는 걸 제안해서 하고 있었습니다

kotlin 버전도 1.7.2로 올려야 할 것 같네요

아직 스프링 개발자라고 하기 뭣하기가 스프링의 코어 부분에 대한 지식이 매우 없네요 ㅎㅎ.. (뭐 다른것도 아장아장 걸음마 이지만)

아키텍처를 소개해드리고 싶은데 아래 그림이 해석이 좀 어려운데 공부 겸 한번 시작해보자면

3.0에서는 AOT 플러그인 제공과 Native 지원에 관한 부분이 확대된다는 내용이라고 합니다

  • (그림의 Spring Boot 3 과 Spring Framework 6)

Spring 6.0을 통해 AOT transformation engine도 더 좋아진 버전의 엔진이 사용되는 것이고 Native에 굉장히 힘을 쏟는 것이라는 설명으로 보아 자동차 엔진의 성능이 더 좋아졌다고 보면 될 듯 합니다

  • (그림의 Spring portfolio )

 

엔진이 좋아지면 어떤게 좋아지느냐? 이게 이 고성능 외제차를 사야하나 말아야 하나의 관건 인데요

AOT의 적용 효과라고 합니다

  • 런타임시 Spring 인프라를 적게 사용
  • 런타임 시 검증할 조건 수 감소
  • 리플렉션을 줄이고 프로그래밍적 Bean 등록 방식 사용

위 내용을 볼때 런타임/리플렉션 이런 부분이 어플리케이션의 런타임 성능을 높이려는 주안점으로 보입니다

 

엔진 내부를 조금 더 보면 (AOT : Ahead Of Time)

Spring Boot 3.0 AOT

Spring AOT 엔진은 빌드 시 스프링 애플리케이션을 분석하고 최적화하는 도구이고

AOT 엔진은 GraalVM Native Configuration이 필요로 하는 reflection configuration을 생성해줍니다(그림에는 없음)

이것은 Spring native 실행 파일로 컴파일 하는데 사용 되고 이후에 애플리케이션의 시작 시간과 메모리 사용량을 줄일 수 있게 됩니다 ("Native" 라는 성능 친화적인 이름값을 하려는 것으로 보입니다)

Spring 의 Native-Image compiler 이 녀석을 통해 빌드 시간은 길고, 시작 시간이 짧고 메모리는 적게 사용게 된다는 부분이 있습니다

AOT 확대

위 그림에서 보면 AOT가 Spring Boot 환경에서 하는 일들과 순서를 알 수 있습니다

간단하게 얘기하자면 Bytecode를 분석하고 최적화해서 좀 더 실행하기에 빠르고 메모리적으로 효율적인 코드를 만듭니다

 

그리고 위에서 GraalVM 에 대한 부분도 보이는데.. 이걸 얘기하자니 JVM과 JIT(just in time) 컴파일러 부터 시작해야 하는 부분이라... 난감합니다 어쨌든 기존에 너무 너무 느리고 안좋으니 방식을 바꾸려고 노력했다 라고 해야 할 것 같은데요

  • Just In Time Compiler : 중간 언어를 실행 시점에 번역하는 인터프리터 방식 (기존 방식)
  • Ahead Of Time Compiler : 중간 언어(자바 바이트 코드)를 미리 목표 시스템에 맞춰 번역하는 방식

의 차이가 있고 추가적인 내용은 NHN 에서 리서치한 내용을 참고로 더 보셔도 좋을 것 같습니다 (NHN 링크)

 

이쯤에서 다시 러닝 커브가 오게 되었는데... (아니 그러면 기존의 Open JDK 사용 진영은? GraalVM 쓰지 않으면 그냥 느리게 지내라는 것인가? 기존의 JIT 컴파일러는 노답이라는 건가?)

지금 이런 노력을 왜 하는지 히스토리를 좀 알아야 하는 부분이 있는데요 현재 사용중인 JVM이 성능 한계를 만났기에 Spring Native 와 같은 시작을 하게 되었다고 하네요

이 말이 뭐지?

하는 분들은 Spring 개발이 다른 프레임워크나 언어로 하는것에 비해 서버 실행 시간이나 속도, 메모리 사용량이 많다는 것을 생각해 주셨으면 합니다 (Spring 은 구리다는 단점 들 중)

그럼에도 불구하고 오랜시간 축적된 다양한 기능과 안정성 그리고 컨벤션에 의한 대규모 개발이 가능했기 때문에 단점들이 커버되어서 널리 사랑받았다는 평도 본적이 있었습니다 (대규모 인력 개발로서는 대체제가 있을까? 공감되는 부분)

 

그 밖의 세세하게 변경된 부분을 보자니 내용이 더 길어질 것 같습니다 (이 부분은 업그레이드를 하게 되면 2탄으로 정리해보겠습니다)

그러고 보니 어플리케이션 테스트 코드 짜는 가이드 방법도 마지막 글을 적어야 하는 군요.. ㅎㅎ (1탄, 2탄, 마지막)

어쨌든 새로운 엔진을 교체하면서 AOT를 적용하려면 해당 플러그인도 설치를 해야 할 것 같습니다

Gradle 에 새로운 Configuration 을 추가해야 할 수도 있고요

아직은 0살 버전이라 어느 시니어 개발자 분 우스겟 소리로는 3살은 넘어야 쓸 수 있는 버전이라고 했던 기억도 나서 일단은 변경 부분에 대해 주시해 보려고 합니다

 

성능을 위한 코어 개발자들의 노력들이 대단 한 것 같습니다

 

관련 내용 링크

+ Recent posts