From Spring Native to Spring Boot 3
本セッションでは、実験的プロジェクトであるSpring Nativeが提供するネイティブイメージへのコンパイル機能がSpring Boot 3でサポートされるようになったことで、Springにおけるネイティブアプリケーションがどのような進化を遂げたのかについての説明がなされました。
セッションの序盤では、ネイティブアプリケーションにより得られるメリットとして、起動が高速かつ安定稼働までの待ち時間も少なく、軽量でセキュアになる点があるとして、コンテナ上での利用にも触れながらの振り返りがありました。
その一方で、ネイティブアプリケーションはコンパイルに時間がかかるというデメリットがあるため、頻繁にデプロイを行う場合、膨大なメモリとCPUで動作する前提のモノリシックアプリケーションの場合等についてはJava VM上での動作の方が適切であることもあるなど、ネイティブアプリケーションとするべきかについては適宜評価する必要があると補足されました。
続いて、Spring Boot 2で開発したアプリケーションをネイティブサポートするにあたりSpring Boot 3にアップグレードしながらマイグレーションする方法の説明がありました。Jakarta EE対応のためのパッケージ名修正は当然必要ですが、さらにネイティブイメージ化のためにはリフレクション、リソース、プロキシなどの動的要素を明確に与える必要があります。そのために使用する@ImportRuntimeHintsによるメッセージ読み込みの方法や@RegisterReflectionForBindng による非公開の型の設定方法に関して説明されました。
Spring Nativeからの進化としては、Spring Boot 3ではほぼすべてのSpringプロジェクトとGraalVM reachability metadataに基づく幅広いライブラリをサポートするなどによりSpring Nativeが抱えていた互換性の問題の多くが解決され製品レベルの品質となったこと、ユーザからの要望が多かったlogbackがサポートされたことが強調されていました。
また、Spring Boot 3におけるAOTとネイティブサポートの概要、ネイティブコンパイルの流れについて触れたうえで、Spring Boot 3での新しい機能としてネイティブイメージでのテストの実行についてMavenやGradleを使用する際の具体的なコマンドを含めて紹介されました。
なお、Spring Boot 3をネイティブアプリケーションとして動作させるためのビルド方法は2通りありますが、ネイティブイメージでテストを実行するためには、Native Build ToolsでビルドするとともにGraalVMのnative-image compilerが必要である模様です。
最後に、ネイティブイメージでもActuatorやトレーシングが動作すること、VMware Tanzuにend-to-endでのネイティブサポートが加わったこと、および、今後ネイティブイメージの更なる軽量化を図っていくことに触れてセッションが締めくくられました。
