2017年9月28日、新たなリアクティブWebフレームワークを備えたSpring Framework 5.0がリリースされた。PivotalのプロダクトマーケティングマネージャであるPieter Humphrey氏によれば、2004年のプロジェクト開始以来、最も重要なリリースだ。
今回リリースされたSpring 5.0では、コードベース全体がJava 8ソースコードレベルに基づいている。開発とデプロイメントの面では、JDK 9と互換性がある。
Spring 5.0のリアクティブWebフレームワークであるSpring WebFluxは、Project React 3.1をベースとしており、アノテーションと関数型プログラミングの両方をサポートする。InfoQは、PivotalのシニアスタッフエンジニアであるRossen Stoyanchev氏に、Spring 5.0が重視するリアクティブプログラミングについての考えを聞いた。
Stoyanchev: Java開発者はJava 8のCompletableFuture以降、継続スタイルAPI(continuation style API)を利用した非同期ロジックの記述に習熟しています。最近ではCompletableFutureと同じようなメリットに加えて、ストリーム(stream of values)用にバックプレッシャ(Reactive Streams仕様でモデル化されているような)もサポートする、RxJavaやReactorのような非同期ロジック開発用のライブラリも現れています。
Spring Framework 5は独自のWebフレームワークで、この非同期プログラミングモデルを用いたアプリケーションを実現しています。このWebフレームワークは、コアコントラクトにおいてそれ自身が完全非同期であるとともに、内部的に非ブロックI/Oを使用し、NettyやUndertowなどの非同期ランタイム上に構築されたReactive Streamsバックプレッシャと、TomcatやJettyといった(Servlet 3.1非ブロックI/Oに基づく)Servletコンテナを備えています。このアプローチのメリットは、特に負荷の高い状態において、より少ないハードウェアリソースでより高い同時実行性を処理可能とするような、イベントループ形式の実行モデルを供えた非同期ロジックの作成をファーストクラスでサポートしていることにあります。
新機能はSpring MVCと並立しているため、Spring 5.0での変更がアップグレードを検討中の既存アプリケーションに直接的な影響を及ぼすことはない、とStoyanchev氏は言う。
ほとんどのアプリケーションは、spring-webmvc(Servletスタック)あるいはspring-webflux(Reactiveスタック)のいずれかをインポートすることになります。既存のアプリケーションに関しては、Spring Framework 5のバージョンのspring-webmvcに簡単にアップグレード可能です。
Stoyanchev氏によると、Spring 5.0で目指しているのは、Spring MVCとSpring WebFluxの間で、可能な限りの選択性と一貫性を提供することにある。どちらのフレームワークも、フレキシブルなコントローラメソッドシグネチャを備えた、アノテーションベースの同じプログラミングモデルをサポートする。さらにSpring WebFluxでは、別の選択肢として、Java 8ラムダと内蔵するKotlinエクステンションのメリットを活用可能な、関数型のWebエンドポイントプログラミングモデルも提供している。
Spring Framework 5では、Spring MVCを拡張してリアクティブな戻り値をサポートしています。これにより、Servlet 3.1以降のコンテナを従来どおりServletベースのWebエンドポイント構成で運用しながら、リアクティブWebClientや他のリアクティブデータリポジトリなどのリアクティブライブラリをSpring MVCコントローラで利用できるようになりました。
Spring 5.0でリアクティブプログラミングモデルを採用する場合、開発者が注意すべき点は何か、Stoyanchev氏に聞いてみた。
命令型ロジックの記述から宣言的な非同期APIへのシフトには大きな学習曲線があることを、開発者として知っておく必要があります。非同期で非ブロックなコードは単一のコールスタックを持たないため、デバッグも難しくなります。これらのものに不慣れならば、最初は小規模なものから始めて、学習と適応に十分な時間を確保してください。どのアプリケーションがフィットするかを慎重に選択することで、非ブロック並行性のメリットを最大限に活用できます。先に進むと決める前に、パフォーマンス上のメリットを測定し、それらを証明してください。既存のSpring MVCアプリケーションに対して、リアクティブなWebClientを始める手軽な手段があることを覚えておいてほしいと思います。
Spring FrameworkプロジェクトのリーダであるJuergen Hoeller氏にも、Spring 5.0についての考えを聞いてみた。
Hoeller: Java 8以降をベースラインにしたことで、APIの大幅な改良と、フレームワーク全体の内部的な最適化が実現できました。同時にSpring Framework 5.0では、すでにクラスパスやモジュールパスに関して、JDK 9を完全にサポートしています。
コアコンテナには、Java 8とKotlin用の関数型ビーン(functional bean)の登録メカニズムが備えられています。
さらにSpring 5.0は、JdbcTemplateやRestTemplateといった一般的なSpring API用のKotlinエクステンションや、Kotlinデータクラスに対するデータバインディングのサポートも提供する、とHoeller氏は付け加えた。
その他のSpring 5.0の注目すべき機能について、Hoeller氏は次のようにまとめている。
Spring Framework 5.0は、Servlet 4.0によるSpring MVCハンドラメソッドへのPushBuilderインジェクション、JSON変換用の標準JSON Binding API(JacksonおよびGsonの代替品として)、JPA 2.2永続化、アノテーション中心のバリデーションのためのBean Validation 2.0などを、Java EE APIレベルで実行時サポートしています。それらすべてについて、ベースラインはJava EE 7+レベルで維持されており、Servlet 3.1コンテナやJPA 2.1プロバイダなどが従来通りサポートされます。
この記事を評価
- 編集者評
- 編集長アクション