2012年8月28日

Spring framework のメモ

Spring framework に関するメモを書いておきます。 Spring は Java の巨大なフレームワークで、標準的な Web アプリケーションの実装だけでなく、 バッチ処理や Hadoop 処理から Android の開発まで網羅的にカバーされています。 脇を固めるモジュール群も充実しており、関係データベースに対する O/R Mapper だけでなく、 MongoDB などの NoSQL も透過的に扱えたり OAuth 1.0/2.0 を使った認証を組込めたりと、 全てを使いこなすことは多くの人にはオーバースペックとも言える内容になっています。

とはいえ、基本的には POJO をベースにして、オブジェクト同士に依存関係を注入してくれるものです。 オブジェクトの関係を粗結合に保つことで、実行環境に応じて実装クラスを差し替えたり、 テスタビリティの向上を図ることが可能になります。

Spring framework のコア

Spring framework のコアでは、XML に記述された Java Bean を関連付けることができます。 大量の Bean を記述すると XML 地獄に陥ってしまうことも多いですが、 STS (Spring Tool Suite) を使うと少しはグラフィカルに管理できます。 最近は XML の記述でなく、アノテーションで Bean のコンポーネントを管理できるようになっています。 XML かアノテーションかは議論が分かれる部分だと思いますが、 実装するアプリケーションの規模に応じて、機能を水平分割すべきか垂直分割すべきかは異なりますので、 「ケースバイケースで検討することが望ましい」が最終的な答えになるでしょう。

具体的な使い方は、書籍 - Spring in Practice - の第1章 (Introducing Spring: the dependency injection container) が詳しいと思います。 この章は無料のPDFで公開されています。

英文で30ページ程度ですが、IoC (Inversion of Control) のことを順序立てて説明してくれています。 Web アプリケーションをしばらく書いていると依存性を解決する方法に悩む場合も多いと思いますが、 この章をサラサラと読んでみるとスッキリするかもしれません。 「職場に新人さんがやってきたけど DI (Dependency Injection) をうまく説明できないかもな」 という人にはオススメの内容と言えます。

なお、最後はかなり強引な流れになりますが、 AOP (Aspect Oriented Programming) まで辿り着きます。 Spring Roo という Spring プロジェクトを生成/管理できるツールでは AOP をふんだんに利用しますので、目を通しておくと良さそうです。

Spring MVC

Web アプリを実装するには Spring MVC を使います。 ひとつ古いバージョンではありますが、公式サイトにステップバイステップのチュートリアルがあります。 (現在の最新は 3.1 だが、チュートリアルは 2.5 ベースで記述)

TDD の手法を用いて、テストを書いてそれが失敗することを確認してから実装を進めています。 取り組み方によっては、JUnit の基本的な書き方、Maven の実行方法なども学べるかもしれません。 データベースにつないでのテストは何かと面倒なことも多いですが、 このチュートリアルでは Ant を用いてテストデータを管理する方法を採用しています。 個人的には Ant の <sql> タスクを知りませんでしたので、勉強になりました。

目次は次のようになっています。とても長いです。

概要
  1. このドキュメントの範囲
  2. 事前準備が必要なソフトウェア
  3. 構築するアプリケーション
  1. 基本的なアプリケーションと開発環境の設定
    1. プロジェクトのディレクトリ構成を作成する
    2. 'index.jsp' を作成する
    3. Tomcat にアプリケーションを反映させる
    4. アプリケーションが動くことを確認する
    5. Spring Framework をダウンロードする
    6. 'WEB-INF' ディレクトリにある 'web.xml' を変更する
    7. ライブラリを 'WEB-INF/lib' にコピーする
    8. コントローラを実装する
    9. コントローラに対するテストを記述する
    10. ビューを実装する
    11. アプリケーションをコンパイルして反映させる
    12. アプリケーションを動かしてみよう
    13. まとめ
  2. ビューとコントローラを開発して設定する
    1. JSTL を設定し、JSP ヘッダーファイルを追加する
    2. コントローラを改良する
    3. ビューをコントローラから分離する
    4. まとめ
  3. ビジネスロジックを開発する
    1. Inventory Management System の使われ方をおさらいする
    2. ビジネスロジックにいくつかのクラスを追加する
    3. まとめ
  4. Web インターフェイスを開発する
    1. コントローラにビジネスロジックへの参照を追加する
    2. ビジネスデータを表示するためのビューを変更し、 メッセージバンドルのサポートを追加する
    3. ビジネスオブジェクトを自動的に計算するためにテストを追加する
    4. メッセージバンドルを追加し、'build.xml' に 'clean' ターゲットを付け足す
    5. フォームを追加する
    6. フォームコントローラを追加する
    7. まとめ
  5. データベースに保存する機能を実装する
    1. データベース起動スクリプトを作成する
    2. テーブルとテストデータのスクリプトを作成する
    3. スクリプトを実行する Ant タスクを追加し、テストデータを読み込む
    4. JDBC のための Data Access Object (DAO) 実装を作成する
    5. JDBC DAO 実装のためのテストを実装する
    6. まとめ
  6. Web アプリケーションに永続化層を統合する
    1. サービス層を変更する
    2. 失敗するテストを修正する
    3. サービス層を設定するために新しいアプリケーションコンテキストを作成する
    4. アプリケーションコンテキストにトランザクションとコネクションプールの設定を追加する
    5. 完全なアプリケーションの最後のテスト
    6. まとめ
  • ビルドスクリプト

Spring + Hibernate

Spring には JDBC を直接扱えるライブラリもありますが、 たいていのプロジェクトでは O/R Mapper を利用することになると思います。 Hibernate を使うサンプルはたくさんありますので、サンプルプロジェクトのソースコードに目を通すと良いでしょう。 ただ、Spring 3.x + Hibernate 3.x の組み合わせが多く、 最新の Hibernate 4.x を使う場合には注意してください。 いくつかのインターフェイスは変更されていますので、 Javadoc やなんらかのドキュメントを読み解く力が必要になります。

こうした記事を一通り読んでみると、Maven の依存性の書き方も身に付くと思います。 何となく <dependency> タグをコピペしてしまうことも多いと思いますが、 フレームワークのバージョンをプロパティで設定しておく手法は見通しを立てやすいと思います。 Java 開発におけるベストプラクティスが反映されている面もあるでしょうから、 「普段は Spring も Hibernate も使わない」という人も、 一度はチュートリアルなどで手を動かしてみることをオススメします。

開発ツール

何と言っても STS です。 Eclipse ベースの IDE で、Maven と Spring Roo もバンドルされています。 Spring が管理する Bean をグラフ表示してくれたり、 Spring 用の設定ファイルから必要そうな情報をまとめて参照できるようにしてくれます。

Spring Roo は Maven と AOP をコアに据えた開発補助ツールです。 基本的にコマンドラインで操作します。 新規のプロジェクト作成だけでなく、既存のデータベースから Bean を作成することもできます。 クラス定義やメソッド定義、設定ファイルの編集もコマンドラインから実現できます。 その他、Roo とは何か?あるいはどうやって使うのか? は丸山先生のスライドで非常によく解説されています。

とはいえ、これを使いこなす用事は多くもないでしょうから、 設定ファイルの配置に迷ったら参照用に自動生成できるようにしておく、 というスタンスで十分な気もします。

あと、Spring というソフトウェアとはちょっと離れますが、 STS と同じように Groovy/Grails 用の IDE として GGTS もあります。 Groovy は Spring source でホスティングされて開発が進められていますので、 その流れの中で IDE の開発も共有している、というイメージでしょうか。

終わりに

Spring framework に関するリンクをメモしておきました。 実際のソースコードは、クラウドサービスが公開しているサンプルプロジェクトが参考になります。 おそらく Cloud Foundry が最も強力に後押ししているはずですが、 Heroku にもドキュメントやサンプルプロジェクトがあります。 Heroku の場合は Spring Roo を使ってアプリケーションのひな形を自動で生成するスタイルをとっています。

色々な都合で初めから相当規模になることが確定している開発 (ex. SI案件) では、 Spring framework で様々なモジュールを組み合わせる、という選択肢はアリかもしれませんね。 (気が乗るかどうかはさておき)

コメントを投稿