エンタープライズJavaについて

皆様はじめまして。

サーバーエンジニアのウィリアムです。数年前まではエンタープライズJava開発に従事していましたが、最近私たちWONDERFULLのサーバーサイドはPHPで開発していますので、エンタープライズJava開発について復習したいと思います。

あのStrutsはどうなってますか?

 エンタープライズJava開発に従事している方であれば、一度はStruts を扱ったことがあるでしょう。筆者自身が業界に入ったのは2004年のこと。最初に参加したプロジェクトがStruts 1を使った企業システムの構築だったことをよく覚えています。

 当時にStruts 1で作られたシステムの多くは、今でも現役で稼働しています。しかし、2013年にサポート終了を迎えたため、今後Struts 1を使い続けることは大きなリスクになりますね。

 なお、Struts 1からの移行先として、ApacheではStruts 2を勧めています。しかし、以下の点から他のフレームワークに比べてStruts 2を採用するメリットが少ないと判断しました。

Struts 1とStruts 2の間にソースコードの互換性はないこと
Struts 2にも重大な脆弱性が何度か発見されていること

では、Struts 1終了後。新規のエンタープライズJava開発、どうしてますか?

大成功を収めた Spring

 Spring FrameworkJava製のOSSフレームワークです。軽量かつ開発のしやすさから人気を得ています。特徴は、DIとAOPアスペクト指向)を中核とした豊富な機能です。ドキュメントも豊富で、多数の採用実績があり、Javaに関するもので最も成功しているオープンソースプロジェクトと言ってよいでしょう。

Springのアーキテクチャは以下のようなイメージです。

 

f:id:tech-inagora:20160122154913j:plain

 

 View層では、「Thymeleaf」というテンプレートライブラリで作ったHTMLを使用します。Viewの入力値は、Controller層のコントローラーで受け取ります。入力値にはフォームの他、JSONXMLも使用できます。コントローラーは、Model層のサービスを呼び出し、その結果に応じてViewとデータを設定します。Viewの代わりにJSONXMLなど任意のデータを出力することも可能です。

 Model層内のサービスは、Java EEのサービスと同じ役割を担っており、トランザクションの起点として機能します。リポジトリは、Spring Data JPAが提供するデータ操作用のオブジェクトです。リポジトリとエンティティを使用してデータベースを永続化します。

 各オブジェクトの生成や依存性注入、トランザクション制御は、SpringのDI機能が実現します。

Dependency Injection(DI)」を直訳すると「依存性の注入」となります。まずは「DIとは何か」というところから理解するために、この言葉を詳しく説明していきます。

 DIという言葉のうち「Dependency(依存性)」という単語は、「オブジェクトが成立するために必要な要件」という意味を持っています。この要件とは、オブジェクトの持つ属性や関連するオブジェクトなどです。

 次の単語である「注入(Injection)」とは「外部からの設定(Configuration)」を意味しています。設定ファイルやWebアプリケーションのデプロイメントディスクリプタ(web.xmlなど)での設定を「注入」と呼んでいるのです。

 これらのことから「DI」という言葉を言い表すと「オブジェクトの成立要件に必要な情報を外部設定すること」となります。情報を外部に切り出すことで、たとえオブジェクトを利用する状況が変わったとしても、設定を変更するだけでそのオブジェクトを利用することができるようになります。つまり再利用性の高い「部品」としてオブジェクトを実装しやすくなるのです。このような再利用性の高いソフトウェア部品のことを「コンポーネント」と呼びます。

 DIでは、「設定を利用から分離する(the principle of separating configuration from use)」という考え方をコンポーネント設計のための1つの原則としています。コンポーネントの集合としてプログラムを設計することは「再利用」というメリットだけではなくソフトウェア開発に対してさまざまな恩恵を与えます。

 DIの主目的の1つはアプリケーションのコンポーネント化を促進することです。アプリケーションをコンポーネント化することで以下のようなメリットが得られます。

コンポーネント単位で機能を強化・改訂することができる
・バグや故障を局所化できる
・ベンダ提供のコンポーネント等と付け替えることができる
・テストが容易になる

 DIは、オブジェクトを構成するために必要なほかのオブジェクトとの関係を外部設定に分離することで、アプリケーションをコンポーネントの集合として組み立てるためのデザインパターンです。そして、DIフレームワークを利用することで容易にアプリケーションのコンポーネント化を促進することができ、コンポーネント化によって開発中や開発後の仕様変更やデバッグにも強いアーキテクチャを構築することができます。

 Spring以外にも、Play Frameworkなど軽量のフレームワークがありますが、Spring Frameworkは、現在Javaオープンソースソフトウエアの中で最も普及したプロダクト群であるため、しっかりと覚えてみてはいかがでしょうか。