Spring AOT 엔진은 빌드 시 스프링 애플리케이션을 분석하고 최적화하는 도구이다. 또한 AOT 엔진은 GraalVM Native Configuration이 필요로 하는 reflection configuration
을 생성해준다. 이것은 Spring native 실행 파일로 컴파일 하는데 사용되고 이후에 애플리케이션의 시작 시간과 메모리 사용량을 줄일 수 있게 한다.
그러한 변환은 Maven과 Gradle 스프링 AOT 플러그인에 의해 수행된다.
AOT 엔진은 최적화된 애플리케이션 컨텍스트와 애플리케이션을 위해 특별히 제작된 스프링 팩토리(Spring Boot 뒤의 플러그인 시스템)를 생성하기 위해 빌드 시 조건을 평가한다. 이를 통해 아래와 같은 효과를 볼 수 있다.
- 런타임시 필요한 스프링 인프라가 줄어든다.
- 런타임에 계산해야하는 조건이 감소한다.
- reflection의 방식을 줄이고, 프로그래밍 방식의 빈 등록을 사용한다.
AOT 엔진은 식별된 빈과 Spring 프로그래밍 모델, Spring Native에 있는 Native 힌트를 기반으로 애플리케이션을 돌리기 위해 필요한 native configuration
을 추론한다.
AOT 엔진의 주요 장점은 더 정확한 네이티브 구성을 사용하고 reflection이 덜 필요하며 런타임에 스프링 인프라가 덜 필요하기 때문에 네이티브 실행 파일에 더 작은 메모리를 사용한다는 것이다.
Spring Native 0.11는 Spring Native 0.10에 비해 사용하는 메모리의 양이 20%~26% 줄어들었다고 한다.
일부 처리가 런타임에서 빌드 시간으로 이동했기 때문에 스프링 네이티브 0.11에서 시작 시간이 0.10에 비해 16%에서 35% 더 빠르다. 이 마이너 버전 업데이트에서는 스프링 부트 및 스프링 프레임워크의 내부 아키텍처를 미세 조정할 수 없었기 때문에 여전히 개선의 여지가 있다.
AOT 엔진은 스프링 annotation 등의 다양한 유형을 분석하여, 실행 시 스프링이 수행하는 작업을 복제하지 않기 때문에 훨씬 더 정확하다. 대신에, 애플리케이션 컨텍스트를 (시작하지 않고) 빌드 시에 생성하고 내성적으로 만드는 새로운 프로세스를 시작한다. 이를 통해 Spring Framework가 런타임에 수행하고 빈 정의 수준에서 작동하는 부분 집합을 사용할 수 있으며, 이는 훨씬 더 정확하다.
빌드 시 이러한 최적화를 수행하면 일반 Spring Boot 자동 구성 모델보다 런타임 유연성이 떨어진다. 이미 컴파일된 Spring Boot 응용 프로그램을 실행하는 경우에도 응용 프로그램의 HTTP 포트 또는 로그 수준을 변경할 수 있지만, 프로파일을 사용하여 런타임에 새 빈을 추가할 수는 없다.
그렇기 때문에 JVM에서 AOT 모드는 선택 사항이다. 이는 필요에 따라 사용할 수 있는 최적화다. 하지만 네이티브(설계상 런타임에 훨씬 덜 동적임)에서는 필수이다. 또한 현재로서는 구축 시 조건이 평가되지만, 향후에는 대부분의 사용 사례에 적합하도록 유연성을 높일 것이라고 한다.
참고