次世代J2EEを目指すSeasar2はどう誕生したか:Seaser Projectの全貌を探る(1)
Seasar(シーサー)は、国内のコミュニティ「The Seasar Project」によって開発が行われているオープンソースプロダクトだ。DI+AOPコンテナとして評価が高いSeasarV2は、J2EE開発の現場にも影響力を持ち始めた。例えば電通国際情報サービスがSeasar Projectを正式に支援することを表明し、2005年6月からは同社による商用サポートサービスが開始されている。本連載では、同プロジェクトの代表的なプロダクトを紹介していく。(編集局)
Seasarプロジェクトは、「J2EEの解体と再構築」「易しさと優しさ」をテーマに掲げて比嘉康雄氏を中心とするメンバーによりオープンソースでの開発を進めており、現在その中核となるSeasarV2(以下S2)をはじめとして30余りのプロダクトを抱える規模に成長しています。この連載では、いま注目を集めているS2とそれに関連するプロダクトを各回で1つずつ紹介していきます。今回はSeasarプロジェクトの全体像と、そこで開発されているプロダクトについて説明しましょう。
Seasarプロジェクトの沿革
このSeasarがプロジェクトとしてSourceForge.jpで最初に登場したのは2003年8月でした。そしてSeasarをDI+AOPの軽量コンテナとして再構築することが比嘉氏によって表明されたのが2004年1月です。これがSeasarV2として開発され、最初に公開されたのが2004年3月です。その後、これに対応する関連プロダクトとして、この後紹介するS2Struts、S2Hibernate、S2Daoなどが続々と生まれていきます。そして、2005年4月からはOSCJ.net(Open Source Collaboration Joint Network)からの支援を受け、同サイト上でSeasarプロジェクトのホスティングも開始されました。
最初はアプリケーションサーバだった
冒頭で述べたとおり、Seasarプロジェクトで中核となるプロダクトの名前は現在S2となっています。これはご存じの方もいらっしゃると思いますが、DI(Dependency Injection : 依存性の注入)とAOP(Aspect Oriented Programming : アスペクト指向プログラミング)の技術を取り入れた軽量コンテナです。しかし、もともとこのプロジェクトではSeasarという名前のアプリケーションサーバの開発が進められていました。このプロダクトの開発はすでに終了していますが、現在もseasarsetupV1Final With Nazunaという、JettyとHSQL Database Engine(HSQLDB)が組み込まれたバージョンがダウンロード可能となっています。
今後はEJB 3.0の仕様も取り込む
2005年4月22日(金)に開催された「Seasar Strategies Day 2005」というイベントで比嘉氏自らが講演し、その中で「Kuina」(クイナ)というプロジェクトについて言及されました。このプロジェクトは、いまのSeasarに、仕様策定中のEJB 3.0(JSR220)のうちEntity Beanの仕様を取り込み、J2SE5で追加されたアノテーション(annotation)を記述することで、よりO/Rマッピング機能を使いやすくしようというものです。
SourceForge.jpで公開されている資料によると、具体的なアノテーションの例として挙げられているのは、EJB 3.0に準拠しているものが@Entity、@Table、@Columnなど13種類、独自のものとして@Criterion、@Criterionsの2種類でした。EJB 3.0の仕様では、Early Draft Review 2の段階で40種類以上のアノテーションが存在しているため、Kuinaが実装される段階では、資料に記述がないアノテーションも順次取り込んでいくことになるのでしょう。
このほか資料では、アスペクトによるEJBQLやDaoの実装コードの自動生成、外部ファイル化したSQLファイルを@NamedQueryのqueryStringパラメータに利用、テストコードの自動作成、といった開発支援機能の実装も予定されていることにも言及しています。
同じDI+AOPツールとして知られているSpring Frameworkや、O/RマッピングツールHibernateでもアノテーションの実装が進められており、フレームワークを用いたアプリケーション開発ではアノテーションを利用するのが規定路線となっていくのか、今後の発展が楽しみです。
からさわぎ
「からさわぎ」というのは、Seasarプロジェクトが主催する、S2および関連プロダクトについての講演が行われるイベントで、2004年4月に東京で行われたのをはじめ、これまでに大阪、福岡、沖縄でも開催されています。このとき用いられた資料は、やはりSourceForge.jpで公開されています。
Seasarプロジェクトで開発されているプロダクト
現在、このプロジェクトで開発されているプロダクトは、表1に示すように、大きく3つに分類されています。1つはS2コアで、これはそのままS2を表します。次にS2を基盤として動作するS2プロダクトがあります。そして現在開発途上にあるSandboxです。表1に掲げた以外にもメールの送受信を行うライブラリや永続化をサポートするツールもあります。Seasarプロジェクトで開発されているすべてのプロダクトの配布はSeasar Software Licenseに基づいて行われています。
プロダクトの種類は、S2StrutsやS2JSFなど、ほかのWebアプリケーション開発フレームワークでS2の利用を可能にするものがまず挙げられます。それからS2Dao、S2Hibernate、S2Cayenneなど、データベースアクセスに関係するものもあります。さらにS2FlexやS2OpenAMFのようにリッチクライアント環境にS2を適用するものもあれば、S2AxisのようにS2と外部との通信を行うものなど多岐にわたります。それから新しい動きとして、S2そのものを.NET FrameworkやPHPといった別のプラットフォームに移植する活動も始められ、Seasarプロジェクトはその活動の幅を一層広げています。
これらのプロダクトについては、SeasarプロジェクトのWebサイトからドキュメントを閲覧したり、プロダクトをダウンロードしたりすることができるようになっていますので、適宜参照してみてください。
カテゴリ | プロダクト名 | |
---|---|---|
S2コア | SeasarV2 | |
S2プロダクト | 永続化 | S2Dao、S2Hibernate |
プレゼンテーション(HTML) | S2Struts、S2StrutsUnit、S2JSF、S2Tapestry | |
リッチクライアント(Flash) | S2Flex、S2OpenAMF | |
リモーティング | S2Axis、S2Remoting、S2RMI | |
ツール | Kijimuna、S2JSFプラグイン | |
その他 | S2GroovyBuilder | |
Sandbox | 永続化 | S2Cayenne |
プレゼンテーション(HTML) | Maya(注)、S2Velocity、S2XWork | |
リッチクライアント(Flash) | S2Laszlo | |
リモーティング | S2Hessian、S2XmlRpc | |
J2EE | J2EE S2JCA(注)、S2JMS(注) | |
セキュリティ | S2AnA | |
ジョブスケジューリング | S2Quartz | |
ユーティリティ | S2UtilConfiguration | |
サーバ | S2HsqldbServer | |
アプリケーション | S2BTS、S2CRM、S2PM | |
移植 | S2.NET、S2PHP5(注) | |
注:OSCJ.net(http://seasar.oscj.net/)でホストされているプロダクト |
代表的なプロダクト
では、Seasar2プロジェクトの代表的なプロダクトとして、SeasarV2(S2)、S2Dao、S2Hibernate、S2Struts、S2JSFについて簡単に紹介しましょう。
SeasarV2(S2)
S2はSeasarプロジェクトの中核となるプロダクトで、DIとAOPという技術を導入した軽量コンテナだということはすでに述べました。また、このほかにもトランザクション制御のS2Tx、コネクションプールのS2DBCP、さらにテスティングフレームワークとしてJUnitを拡張したS2Unitも用意されています。
S2におけるDIは、コンストラクタ・インジェクション(Constructor Injection)とセッター・インジェクション(Setter Injection)のほかに、任意のメソッド名を指定したメソッド・インジェクション(Method Injection)も可能です。
そしてAOPはインターセプタ(Interceptor)を用いています。あらかじめS2で用意されているものとしては、実行経過をトレースするTraceInterceptor、例外処理を行うThrowsInterceptor、テスト用にモックオブジェクトを用いるためのMockInterceptorなどがあります。もちろんインターセプタは独自に実装することもできます。
S2Txは、トランザクション処理を行うインターセプタとして実装されており、J2EEのトランザクション属性のうち、Required、RequiresNew、Mandatory、NotSupportedが実装されています。トランザクションの開始とトランザクション終了時のコミットおよびロールバックはインターセプタで行いますので、開発者はその実装をしなくてもS2の設定のみでトランザクション制御機能を利用することができます。
S2DBCPは、JTA(Java Transaction API)と連動したコネクションプール機能を提供します。XADataSource機能がJDBC Driverで提供されていなくても、S2の実装でエミュレートさせることができます。これにより、開発者はS2の設定のみでコネクションプール機能が利用できるようになります。
S2Unitには、テストメソッドごとに自動的にS2Container(S2でDIによりオブジェクトを取得するためのコンテナ)を生成する機能や、テストメソッド名の最後にTxを付けると自動的にトランザクション制御を行う機能があります。また、検証用のデータをExcelファイルから読み込む機能や実行結果をExcelファイルに出力する機能も持っています。そしてS2DaoによるSELECT文の実行をテストするS2DaoTestCaseクラスも用意されています。
S2Dao
S2Daoは、JavaBeansオブジェクトに対するデータ(プロパティ)へのアクセスをデータベースへのアクセスに置き換えて処理を行うDAO(Data Access Object)をS2の「注入」機能によって作成できるようにするものです。
その基礎になるのは「アノテーション」(J2SE5のそれとは別物)と呼ばれる定数の設定で、ここで設定される値に基づいてオブジェクトとデータベースのテーブルとの対応などが決められます。また、アノテーションの設定でデータのバージョンやタイムスタンプに基づく排他制御もできるようになっています。
そして、データベースへのアクセスで用いられるSQL文を生成する際に、基となるSQL文にコメントを付けておき、生成するSQL文の内容を開発者が設定することができるSQLコメント機能があります。これにより、パフォーマンスなどを考慮したDAOを作成することが可能になります。
このほかSQL文の生成には、EntityManagerとなるクラスをAbstractDaoクラスをアプリケーション内で継承するという方法もあります。こうすると、SQLファイルを作成せずにアプリケーション内でSQL文を生成させることができます。
S2Hibernate
S2DaoはDAOをインターフェイスの形で開発しておき、データベースアクセスの部分を後から「注入」するというものでしたが、S2Hibernateは、DAOをインターフェイスの形で開発するのは同じですが、データベースアクセスの部分はHibernateのO/Rマッピング機能を利用するツールです。つまり、SQLを生成する処理をS2側ではなくHibernateに託してしまおうというわけです。
Hibernateでは、通常SessionやTransactionの制御をアプリケーション上で行わなくてはなりませんが、S2Hibernateはそれを内部で行っているため、開発者がこれらを意識する必要がなくなります。またS2Hibernate.daoを用いると、Hibernateにおけるクエリー言語のHQL文と、S2Daoのアノテーションと同じ記述方法を用いてDAOを作成することもできます。
Hibernate3のサポートについては、本稿執筆現在、シーサーサンプルプロジェクトにkoichik氏が作成したS2Hibernate3-1.0.6b4.zipがアップされていますが、今後の正式なサポートが待たれるところです。
S2Struts
S2Strutsは、Strutsにおいて業務処理を担うActionクラスに対して依存性注入(DI)を行うことができるプロダクトです。セッター・インジェクションかコンストラクタ・インジェクションの場合は、ActionクラスをコンポーネントとしてS2に登録しなくてもよいことになっています。
また、StrutsのActionクラスを継承しないクラスでもstruts-config.xmlにActionクラスとして登録しておくことができます。この場合は、登録するActionクラスの名称のところをインターフェイスの名称にしておきます。
それから、通常Strutsにおいて使用するActionクラスの名称はstruts-config.xmlに記述しますが、これをS2の設定ファイルに記述できるようにする方法もあります。
これらの機能を実現するには、web.xmlやstruts-config.xmlにS2Strutsを使用するための設定を書き加える必要があります。
S2JSF
JSF(JavaServer Faces)は、JSP(JavaServer Pages)にコンポーネント指向開発の要素を取り入れて、表示画面の構成をコンポーネントを組み合わせることにより実現することができる仕組みであることはあなたもご存じでしょう。S2JSFは、この仕組みを利用したテンプレートエンジンといえます。
画面表示に必要なコンポーネントの名称や、そのコンポーネントに対する属性の値を、HTML文書内に<span>タグなどの属性の値として記述し、これを解釈する段階で、その場所に指定されたコンポーネントを「注入」し、実際の表示画面が出来上がるというわけです。このとき、JSPの式言語に相当する、"#{変数名}"というValueBindingと呼ばれる記述も用いることができます。
次回以降は、それぞれのプロダクトについて詳しくご紹介していきます。最初に取り上げるのはSeasarV2(S2)です。それ以降はS2Dao、S2Hibernate、S2Struts、S2JSFの順で取り上げていく予定です。
関連URL
Copyright © ITmedia, Inc. All Rights Reserved.