Spring Roo入門

## Spring Rooとは
* Springのサブプロジェクトで「コマンドラインからソースファイルを生成するRAD（Rapid Application Development）ツール。
* Rooは標準で、いままで使用されてきた実績のあるフレームワークやライブラリを使用（Spring Framework、Hibernate、JPA、AspectJなど）
* 実行は、コマンドライン、あるいはSTSのRooシェル上で行う。
* 生成されたソースにはRooに関連するアノテーションが付いているが、Rooはランタイムライブラリではなく、使用を中止する場合、コマンドを実行するだけでRooの依存性を簡単に削除できる。

## Spring Rooで出来るとこ
* Eclipse用プロジェクトとして設定ファイル生成
* CRUD機能を持ったscaffold生成
* DBやO/Rマッピングのセットアップ
* データベーススキーマからのEntity自動生成
* データベースとリンクしたEntityの操作
* 単体テストの自動生成
* Seleniumによる自動テストの生成
* Mavenによる依存性管理
* Spring Securityを使用した認証機能のセットアップ
* アプリケーションのバックアップ

## Rooのセットアップ
公式サイトからダウンロードもできるが、STSをインストールすると一緒に付いてくるのでそちらを利用したほうが簡単。

## Rooでアプリケーション作成
* STSで新規に「Spring Roo Project」を作成。（Project name,Top level package nameを入力し、それ以外はデフォルトでOK）

* JPAプロバイダとデータベースの設定

```
>persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
```

プロバイダは「ECLIPSELINK」「OPENJPA」も使用可。


* エンティティの作成

```
>entity jpa --class ~.Timer --testAutomatically
```

「~」は、トップレベルパッケージ。
Timerクラスとそれに付随するファイルがjp.cm.tenminutesパッケージ直下にいくつか作成される。
--testAutomaticallyはテストコードの生成。

```
>field string --fieldName message --notNull
```

Timerクラスに「message」フィールドをnotNull制約付きで作成。
それに付随するいくつかのファイルが更新。


* Spring MVCのコントローラとWebページを作成

```
>web mvc setup
```

Spring MVCを使用するための準備ができ、コントローラの生成ができるようになる。

```
>web mvc all --package ~.web
```

すべてのエンティティに対してSpring MVCコントローラを生成。

* アプリケーションの起動

Projectを右クリックし、Run As> Run on Serverでサーバにデプロイ&起動。
以下のURLにアクセスすると、作成したアプリケーションを使うことができる。
http://localhost:8080/（プロジェクト名）/


* Unitテスト実行

```
>perform tests
```
テストコードの実行。
初回はライブラリのダウンロードも行う。


* Seleniumテスト実行

```
>selenium test --controller ~.web.TimerController
```

※私の環境でうまく動作しなかった。

## JavaファイルとAspectJの関係
Rooの生成するエンティティはAspectJの「inter-type declaration」で、AspectJファイルからメンバやメソッドをクラスの外部から追加している。

## AspectJの「inter-type declaration」
* エンティティ名_Roo_Entity.aj
エンティティに対してJPAの操作（persist／remove／findなど）を定義。また、EntityManagerを取得するメソッドも定義しているので、自分でエンティティに対する操作もできる。

* エンティティ名_Roo_JavaBean.aj
エンティティクラスに定義されたprivateフィールドに対してsetter／getterを定義。setter／getterの中で「this.name」としていますが、これはエンティティクラスのnameフィールドのこと。

* エンティティ名_Roo_Configurable.aj
ここでは「declare @type: Topping: @Configurable;」とだけ定義されている。これは、エンティティクラスに@Configurableアノテーションを付加するための記述。@Configurableアノテーションを付加したクラスは、newでインスタンス化した際にもSpringのDI機能が適用される。
エンティティ名_Roo_Entity.ajに以下のようなメソッドが定義されているが、@Configurableアノテーションによって、newでインスタンス化されたときにEntityManagerがDIする。
* エンティティ名_Roo_ToString.aj
エンティティクラスのtoStringメソッドをオーバーライド。Webページでエンティティを表示している個所では、この「toString」が呼ばれる。

* エンティティ名Controller_Roo_Controller.aj
「create」「show」「list」「update」と、CRUD操作のためのメソッドが一通り定義。
テストした各エンティティのメソッドが呼ばれている。
これらのメソッドがコントローラに織り込まれる。

## Tilesを使ったView層の中身
「WEB-INF」ディレクトリ以下

* image
画像ファイルを格納。

* styles
スタイルシートを格納。デザインを変更したい場合、ここにあるデフォルトのCSSを変更するか、新しいCSSを追加。

* WEB-INF/i18n
国際化のためのメッセージプロパティを定義。「web mvc install language」コマンドを実行すると、新たな言語用のプロパティファイルが生成。

* WEB-INF/layout
基本レイアウトは「Apache Tiles」を使用して、ここにある「layouts.xml」で定義。

* WEB-INF/spring/webmvc-config.xml
Spring MVCの設定を記述。
ViewResolverの定義・設定もここで行っていて、レスポンス形式をカスタマイズしたい場合などは、ここでカスタムしたViewResolverを定義/設定。

* WEB-INF/tags
XML形式のカスタムタグが格納。

* /WEB-INF/views
XML形式のJSPが機能ごとに格納。
機能ごとに「views.xml」があり、そこのTiles定義で各.jspxファイルを設定。
自動生成されたファイルのUIを変更したい場合、これらのファイルを修正して独自のUIを定義。

## 補足
* ファイルの手動編集とコマンド実行が自動同期
追加したフィールドの名前を変更したり、削除したい場合は、.javaファイルから普通に削除する。
削除して保存すると、Roo Shell上で関連ファイルが更新する。
このように、ファイルの手動編集とコマンド実行の双方向で関連ファイルが作成／更新されていく。
ちなみに、ファイル自体を削除すれば、関連する.ajファイルも削除される。

* .ajファイルは編集してはいけない
JPA操作メソッドを追加／修正したり、「toString」を自分で定義したい場合は、javaファイルに対して追加／修正する。
例えば、Pizza.javaにtoStringメソッドを定義すれば、Rooがその変更を自動検出し、Pizza_Roo_ToString.ajを削除する。これは、コントローラも同様。

* Rooはコマンド実行後、Mavenなどの処理が裏で動いていることがあるので、焦りは禁物。
コマンド実行後は、Progressに注意を払う必要がある。

* Windows環境では、JAVA_HOME、M2_HOME、mvnのPATHを通しておかないと、途中でエラーになる。
（JAVA_HOMEはmavenを実行するため）

#### 参考
[10ミニッツで絶対にできる、Spring Rooアプリ開発 ](http://www.atmarkit.co.jp/ait/articles/1108/03/news124.html)
[EclipseベースIDEでSpring MVC開発ができRoo！](http://www.atmarkit.co.jp/ait/articles/1110/05/news123.html)