永井 敬英(ながい たかひで)
株式会社DTS ネットワーク事業本部所属。Springを利用した業務開発に携わる。

 JavaのWebアプリケーション開発には,有用なオープンソースのフレームワークが欠かせません。本連載では,オープンソース・フレームワークの一つとして,現在,注目を集めているSpring Framework(以下,Spring)を解説します。

従来のWebアプリケーションの問題点

 Springの話をする前に,従来のWebアプリケーションの構造と問題点について簡単に説明します。一般的に,JavaのWebアプリケーションでは,レイヤー構造を採用します。表1にあるように,レイヤーは「プレゼンテーション・レイヤー」「ビジネス・レイヤー」「データアクセス・レイヤー」の三つで構成されます。

表1●レイヤー構造とその役割
レイヤー役割
プレゼンテーション・レイヤークライアントの画面表示や画面からの入力を受け付ける
ビジネス・レイヤー業務処理を行う
データアクセス・レイヤーデータベースなどのリソースにアクセスする

 Webアプリケーションは,レイヤーによって論理的に分割され,各レイヤーでは様々なフレームワークを使用して効率的に開発を行います。例えば,図1のようにプレゼンテーション・レイヤーにはStruts,データアクセス・レイヤーにはHibernateを使うといった具合です。各レイヤーに適用するためのフレームワークは様々な種類があるため,作成するアプリケーションの要件に合わせて選びます。

図1●レイヤー構造のイメージ
図1●レイヤー構造のイメージ
[画像のクリックで拡大表示]

 このように各レイヤーごとに,フレームワークを適用して開発する方式はかなり一般的になりましたが,実際にプログラムを作っていく上で,いくつかの問題が出てきました。

  • 変更に弱い
  •  図1を見ると,各レイヤーは一見独立しているように見えるのですが,実際のところ,隣り合うレイヤーは密接に連結しています。例えば,ビジネス・レイヤーからデータアクセス・レイヤーのオブジェクトにアクセスする場合,通常は以下のようなプログラムになるでしょう。

    DataAccessObject dao = new DataAccessObject();

     これは,データアクセス・レイヤー(DataAccessObjectメソッドなど)に変更があった場合,呼び出し元のビジネス・レイヤーにも変更が発生することを意味しています。できるならば,データアクセス・レイヤーの変更だけに留めたいものです。

  • 単体テストが困難
  •  レイヤー同士が密接に連結している場合,単体テストが困難になります。例えば,ビジネス・レイヤーの単体テストをする場合,依存しているレイヤーの環境,つまり,データアクセス・レイヤーの実装とデータベース環境が必要になります。ビジネス・レイヤーのテストをしたいだけなのに,わざわざデータベースを用意してテストデータを投入する…というのは面倒です。

     また,複数のレイヤーをまとめてテストすると,エラーが発生したときに何が原因でエラーになったのか,切り分けの手間が増えます。可能ならば,ビジネス・レイヤー単体で試験したいものです。

  • トランザクション・コードが散在
  •  データベースにアクセスするアプリケーションでは(ほとんどのアプリケーションが当てはまると思います),データベースのトランザクションを処理するコードがプレゼンテーション・レイヤーやビジネス・レイヤーに散在します。プログラムのメンテナンスのしやすさや再利用性を考えると,トランザクション・コードは分離して,まとめて管理したいところです。

    Springの特徴とメリット

     このような従来のWebアプリケーションにおける問題は,Springを適用することで解決できます。

    図2●Springを採用したWebアプリケーションのイメージ
    図2●Springを採用したWebアプリケーションのイメージ
    [画像のクリックで拡大表示]

     図2は,Springを採用したWebアプリケーションの構造を表わしています。Springはすべてのレイヤーの基盤となるDI×AOPコンテナ(以下,DIコンテナ)を持ち,Springを適用したアプリケーションは,依存する各レイヤーをインタフェース・ベースで連結します(疎結合と言います)。これにより実行時に実装プログラムを指定できます。

     もう少し具体的に言うと,ビジネス・レイヤーからデータアクセス・レイヤーにアクセスするとき,インタフェース経由で呼び出すようにしておくと,実行時にHibernateで作ったプログラムを指定したり,iBATISで作ったプログラムを指定したりできるのです。また,AOPを利用すると,トランザクション・コードなどをビジネス・レイヤーから分離して管理することができます。

     DIコンテナ,AOPの詳しい説明は後述するとして,ここではSpringの導入メリットを簡単に紹介します。

    ◆拡張性の向上

     機能追加が容易になります。DIコンテナとインタフェース・プログラミングを併用することで,実装クラスを実行時に変更できるため,機能の切り替えが簡単に行えます。

    ◆保守性の向上

     プログラム修正が容易になります。AOPを利用すると,ビジネス・レイヤーからロールバックやコミットなどのトランザクション・コードを排除できるので,コードが見やすくなる,修正がしやすくなるといったメリットが得られます。

     また,各レイヤーがインタフェースで連結されているため,レイヤーごとの単体テストが可能になります。例えば,ビジネス・レイヤーの単体試験をする場合,データアクセス・レイヤーはモック(試験用のダミークラス)を使うことにより,データベース環境がなくても試験ができます。

    ◆再利用性の向上

     作成したロジックを他システムで再利用しやすくなります。AOPを使用することで,ログ出力やトランザクション処理など業務処理に関係ない処理をロジックから排除でき,純粋な(業務処理の)役割だけを持ったPOJOのクラスとしてロジックを作成することができます。

     そのほかにも,Springが提供する多くの機能やユーティリティ・クラス,フレームワーク連携機能は,Webアプリケーション開発をいろいろな局面で助けてくれます。

    本連載について

     本連載で扱うSpringには,以下のような機能があります。

     ・DIコンテナ
     ・AOP
     ・データベース・アクセス機能
         トランザクション管理
         HibernateやiBATISなどのO/Rマッピング・フレームワークとの連携
     ・Web MVCフレームワーク機能
         JSPとJSTLを使用した画面出力
         Strutsとの連携
         JSFとの連携
     (他にも様々な機能があります)
    

     また,Springにはいくつかのサブプロジェクトがあります。

    • Spring Web Flow
    • Spring Web Services
    • Spring Security (Acegi Security)
    • Spring LDAP
    • Spring Rich Client
    • Spring Extensions (Modules)
    • Spring IDE for Eclipse
    • Spring BeanDoc
    • Spring OSGi
    • Spring JavaConfig
    • Spring .NET
    • Spring Batch

     この連載では,最初にDIやAOPといったSpringの基本機能について解説した後,データベース・アクセス関連の機能,WebMVCフレームワークなどを紹介したいと思います。特に,日本ではまだ情報の少ないSpring Web FlowやAcegiなどのフレームワークを組み合わせた,総合的なWebアプリケーションの構築方法がわかるような連載にする予定です。実装のサンプルを示しながら,具体的な使い方を解説していきます。

     次回は,Springのコア機能の一つである「DIコンテナ」について説明します。