MVC のこれまでとこれから

この記事は Java EE Advent Calendar 2017 の 6 日目です。昨日分は Payara の Notification Service がこの 1 年でどのように進化したのかをご紹介しました。本日はちょっとした読み物です。

今年の 9 月にようやく Java EE 8 がリリースされました。当初とはだいぶ異なる形となり、いくつかの仕様が延期あるいは除外され、またいくつかの仕様が新たに追加されました。計画当初から Java EE 8 入りを期待されながら最終的に外された機能の最たるものは MVC 1.0 (JSR 371) でしょう。いまだに蔓延る Struts を掃討する切り札とされながら、Java EE 入りを見送られた背景には、どのようなものがあったのでしょうか? JSF との比較も交えて、少し振り返ってみましょう。

MVC は、コミュニティを対象とした大規模アンケートで JSON Binding や Security API とともに Java EE 8 に必要な機能として選ばれ、JSR 371 による仕様策定とリファレンス実装 Ozark の開発が始まりました。スペックリードには JSF 2.3 (JSR 372) の Manfred Riem と JAX-RS 2.1 (JSR 370) の Santiago Pericas-Geertsen が選ばれ、作業は順調に進んでいたかに見えました。実際、Early Draft の段階で Ozark はある程度の実用に耐え得る完成度に達していたのです。

しかし、ご存知の通り Java EE 8 の仕様策定は約 1 年間のブランクが発生し、一時は中止かと思われる危機的状況にありました。その後、Java EE Guardians らコミュニティの働きかけで Java EE 8 の仕様策定作業は再開されますが、ブランクの間にサーバーサイド技術ではマイクロサービスやサーバーレスといった新機軸が登場し、そうした状況を考慮して、将来を見越した形で採用する機能を見直すことになりました。これにより当初は必須機能と位置付けられていた MVC が Java EE から半永久的に外されることになります。JSR 371 はスペックリードを Java Champion の Ivar Grimstad に委ね、コミュニティ主導のフレームワークとして再出発することになりました。Java EE の EE4J への移管が決定すると、MVC も EE4J 傘下に入ることを表明し、Java EE との協調姿勢は崩していません。

MVC にとってのノックアウト・ファクターは、おそらくマイクロサービスでしょう。Java EE でマイクロサービスを構築する際、必須となるのは RESTful Web サービスのフレームワークである JAX-RS であるはずで、その強化が優先されるでしょう。実際に、Java EE 8 に含まれる JAX-RS にはリアクティブ・クライアントが追加され、複数サービスの同時呼び出しにかかる煩雑さが軽減されています。マイクロサービスにおいて画面フレームワークの比重は大きくないのです (JSF に対しても似たようなことが言えるでしょう)。

また、画面フレームワークには既に JSF が存在し、相応の完成度にまでなっています。JSF のコンポーネント・モデルの画面フレームワークは感覚的でないと批判されることがあります。しかし、特に業務システムの画面 UI を作るという観点からは、部品を組み合わせて画面を構成することの方がむしろ自然であり (JavaFX などの GUI プログラミングを想像してみてください)、リクエスト・レスポンス・モデルはプリミティブな、HTTP に近い低水準処理と言えます (こちらの方が自然だという人はおそらく GUI プログラミングの経験が乏しいと思われます)。さらに現在では JavaScript だけで画面を構成できるまでにクライアントサイドの技術が進化しています(毎年流行りの JavaScript フレームワークが変わっているという状況はさておき)。こうしたことを総合すると、MVC はあるに越したことはないが必須とは言えない機能であると言えるでしょう。

私は比較的長い間 MVC の標準入りを支持し、今回の Java EE 8 の決定には不満を持っていたひとりではあります。しかし、今年の上半期に JavaFX や Android 等の GUI 技術に触れる機会が多く、そこから得たものは、画面の構成はコンポーネント・モデルに基づくのが必然であり、リクエスト・レスポンス・モデルは技術的制約から生まれた妥協の産物であるという結論でした。Java EE 標準の画面フレームワークは JSF を主とすべきで、MVC はオプショナルで問題ない、というのが現時点での私の見解です。

幸いにも MVC はコミュニティによって継続され、EE4J 傘下で完成する見込みです (Ivar Grimstad は EE4J の中心人物のひとりでもあります)。Java 関連の仕様は消えて無くなったり、完成にこぎつけても誰も使わず陳腐化してしまうケースが後を絶ちません。そうした中で MVC は恵まれている方だと思われます。