|
|
システム開発に携わる技術者は誰でも,他システムとの連携や後々の機能拡張に柔軟に対応できる構造にしたいと考えることでしょう。そのためにはある程度時間や人手が必要です。しかし,Webアプリケーション開発では,規模や複雑さは増える半面,納期は短くなっているのが現状です。
これを解決するための技術として注目されてきたのが分散オブジェクトです。分散オブジェクトでは,機能を出来るだけ細分化し,再利用可能な部品としてコンポーネントを作成してコンテナで管理します。使いたい機能(コンポーネント)のAPIを理解し,決められたプロトコルを使って呼び出すことで,再利用性・拡張性は飛躍的にあがりました。
分散オブジェクトの技術としては,CORBA,COM+,JavaRMIなどがあります。また,EJB(Enterprise JavaBeans)も分散オブジェクト技術の一つです。EJBには「再利用性」「拡張性」「トランザクション管理」といった様々な利点があります。
しかし,実際に使ったことがある人は,その使いにくさに辟易したのではないでしょうか。必要ないメソッドの空実装…,テストの煩雑さ…。さらに,EJBに適した設計や実装ができる技術者は少なく,かえって生産性を下げるケースも多々ありました。
この影響からか,Seasar2やSpring FrameworkといったDI(dependency injction)コンテナを利用したフレームワークや,O/RマッピングツールのiBATISやHibernateなどが人気を集めています。ここ数年,これらを組み合わせて利用することで,開発コストを削減することが主流になりつつあります。
このような新しい技術の登場の影に隠れてしまったEJBですが,EJB 3.0になって大きく生まれ変わりました。DIの採用,ホーム・インタフェースの廃止,アノテーションの導入など大幅に改善されており,開発容易性が格段に向上しました。コンポーネントをPOJO(Plain Old Java Object,普通のJavaオブジェクト)で実装できるようになったことで,単体テストの実施も容易になっています。従来のEJBに対するイメージを払拭し,開発コスト削減にも期待が持てます。したがって,Webアプリケーション開発で,EJB 3.0を使うという選択肢は検討する価値があるでしょう。
本稿では,EJB 3.0を取り入れたWebアプリケーション開発をする際の,開発コスト削減のためのフレームワークとして「JBoss Seam」を紹介します。JBoss Seam(以下Seam)は,Web層にJSF(JavaServer Faces)を使い,EJB 3.0ベースで開発をするためのフレームワークです。Java Community Processに「JSR-299:WebBeans」として提案され標準化が進められており,Java EE 5によるWebアプリケーション開発の標準となるプログラミング・モデルとしても注目されています。
*EJB 3.0,Java Persistence API(JPA)に関しては「EJB3.0入門講座」を,JSFについては「JSFでStrutsは不要になる?答えを握るStruts-Facesとは」をご参照ください。 |
JSF+EJB 3.0
JSF 1.2とEJB 3.0は共にJava EE 5の中核となる技術です。それぞれを組み合わせた場合,アプリケーションのアーキテクチャは図1のようになります。
| |
図1●JSF+EJBによるWebアプリケーション [画像のクリックで拡大表示] |
WebアプリケーションはEJBを利用する場合,一般的に4層に分けて構成されます(表1)。それぞれの層単独では,JSFとEJB 3.0の導入により開発効率は向上します。しかし,各層を連携させる機能が不足しており,Java EE 5ではこの標準技術は提供されていません。結果として,JSFとEJBはそれぞれ独自のコンポーネント・モデルであるため,連携させるためにはグルーコード(接着剤)の作成を強いられるというデメリットが出てきます。
表1●Webアプリケーションを構成する四つの層 |
この問題を解決できるフレームワークがSeamです。Seamは,JSFとEJB 3.0を効率よく統合してプログラマの負担を軽減するという点で注目を集めているわけです。
具体的に,サンプルとしてユーザー登録をするアプリケーションを作成して,Seamを利用した場合としなかった場合について比較してみましょう。ユーザー登録アプリケーションは,新規ユーザーの「ユーザーID」「実名」「パスワード」をデータベースに保存する簡単なアプリケーションです。
Seamを使わずにJSFとEJB 3.0を連携させる場合の処理(図2)と,Seamを使用した場合の構成(図3)を示します。
| |
図2●Seamを使わない処理の流れ [画像のクリックで拡大表示] |
| |
図3●Seamを使用した処理の流れ [画像のクリックで拡大表示] |
Seamを使わない場合(図2)は,(2)のエンティティBeanと(3)のJSFのコントローラBeanを(1)の設定ファイルに定義しておきます。画面のボタンが押下されたとき,設定ファイルを元に,どのコンポーネントを使うかを決めています。さらに,(3)のコントローラにはEJBを呼び出す処理が記述されています。EJBの処理結果を元に,設定ファイルに定義されている画面遷移情報を取得し(5),レスポンスを返しています。処理を行うために,その都度設定ファイルの情報が必要です。
一方,Seamを使う場合は,(6)(7)のコンポーネントが画面と直接関連付けられています。また,遷移する画面の情報は(6)が保持しています。コンポーネントに@Nameアノテーションで名前を付け,その名前を画面上のテキストボックスやボタンに記述しています。
このように,いくつかのアノテーションを使うだけでEJBとJSFをつなぎ合わせることができるのが,Seamの最大の特徴です。Seamを使わない場合の構成(図2)と比較すると,設定ファイル(faces-config.xml)が実にシンプルになっており,一連の処理に直接かかわっていないことがわかります。
今まで設定ファイルとソースコードに分散して記述されていた情報を,アノテーションを利用することでソースコード上に表現することが可能になりました。ソースコード上に設定情報が記述されることで,可読性の向上にも一役かっています。