Spring Boot + Domaによる”新”スーパーアジャイルなWeb開発

### はじめに
Seasar2 の Java 系の多くのプロダクト、
特に SAStruts,S2JDBC,S2DAO が 2016年9月26日 に End of Life になるということで、
今後新しくJavaでWebアプリケーションを作るときは、どのフレームワークを使えば良いか。

いろいろ調べてみた感じ、Seasar2と同じようにサクサク感のある開発をしたいなら、
Spring Boot + Doma が良さそう。

というわけで、これら関連のメモを。（随時加筆予定）

### 開発環境構築
1. JDK
    - ここではJDK 8を使用。
    - <http://www.oracle.com/technetwork/java/javase/downloads/index.html> からダウンロードしてインストール。
2. Spring Tool Suite (以降、STSと記載)
    - EclipseにSpring開発用のプラグイン群がバンドルされたもの。
    - ここではバージョン 3.8.1 を使用。
    - <http://spring.io/tools/sts> からダウンロードしてインストール。
3. Doma Tools (Eclipseプラグイン)
    - Doma1 と Doma2 があるが、ここでは Doma2 を使用。
    - STS起動後、[Install New Software]で <http://dl.bintray.com/domaframework/eclipse/> からインストール。
4. Buildship Gradle Integration (Eclipseプラグイン)
    - STS起動後、[Eclipse Marketplace]からインストール。
    - 別のもので[Gradle IDE Pack](http://marketplace.eclipse.org/content/gradle-ide-pack)というものもあるが、[ここの説明](https://github.com/eclipse/buildship/wiki/Migration-guide-from-STS-Gradle-to-Buildship)によると廃止される予定のようなので、ここに書いた [Buildship Gradle Integration](http://marketplace.eclipse.org/content/buildship-gradle-integration)のほうを使用。

### プロジェクト作成、設定
1. STSを起動する。
2. プロジェクトの作成
    - [File]-[New]-[Spring Starter Project]を選択。
    - 以下を指定してプロジェクトを作成。
        - [Name]：Example
        - [Type]：Gradle (Buildship)
        - [Packaging]：Jar
        - [Java Version]：1.8
        - [Language]：Java
        - [Boot Version]：1.4.1 (SNAPSHOT)
        - [Dependency]：
            - Web
            - DevTools
            - Tymeleaf
            - MySQL
        - それ以外：デフォルトのまま
3. build.gradleの編集
    - ポイント
        - 出力するJavaクラスとSQLファイルの出力先ディレクトリを同じにする
            - processResources.destinationDir = compileJava.destinationDir
        - コンパイルより前にSQLファイルを出力先ディレクトリにコピーするために依存関係を逆転する
            - compileJava.dependsOn processResources
        - Doma関連Mavenリポジトリ、依存関係追加
            - https://oss.sonatype.org/content/repositories/snapshots/
            - compile('org.seasar.doma.boot:doma-spring-boot-starter:1.1.0')
            - domaGenRuntime('org.seasar.doma:doma-gen:2.12.1')
        - domGenタスク作成
    - 設定例
        - https://gist.github.com/cacarrot/7bfa164511f1b461605c686d43446c22
4. プロジェクトの設定
    - Domaのライブラリを取得してプロジェクトの/libフォルダに格納しておく。
        - build.gradleに設定した依存関係により、以下のようなパスにダウンロードされているはず。これをコピーして格納。
            - ~/.gradle/caches/modules-2/files-2.1/org.seasar.doma/doma/2.12.0/df98f42d23e149ff699c0ccd2a0997e974a55a14/doma-2.12.0.jar
    - 作成したプロジェクトのプロパティを開く。
        - [Java Compiler]-[Annotation Processing]で以下を指定。
            - [Enable project specific settings]：チェックを付ける
            - それ以外：デフォルトのまま
        - [Java Compiler]-[Annotation Processing]-[Factory Path]で以下を指定。
            - [Enable project specific settings]：チェックを付ける
            - [Add JARs]でDomaのライブラリを追加
                - {プロジェクト名}/lib/doma-2.12.0.jar
            - それ以外：デフォルトのまま

### Doma-GenによるDAO,Entity自動生成
1. 事前にSTSで[Window]-[Show View]から[Gradle Tasks]ビューを表示させておく。
2. [Gradle Tasks]ビューにてプロジェクトを右クリックし、[Create Gradle Run Configuration]を選択。
3. 以下を指定してOKを押す。
    - Name：適当な名前（例：Example - domaGen）
    - Gradle Tasks：domaGen（build.gradleに定義したタスク名）
4. 保存したRun Configurationを実行するとDoma-Genが実行され、DAOとEntity(ソースフォルダ配下)、sql（META-INF配下）が自動生成される。

### Spring BootとDomaの連携
- ポイント
    - doma-spring-boot-starterの設定を利用するには、Doma-Genで生成したDAOに @ConfigAutowireableアノテーションの付与が必要。
        - org.seasar.doma.boot.ConfigAutowireable
    - application.ymlの設定には最低限以下が必要
        - doma.dialect
        - spring.datasource.url
        - spring.datasource.username
        - spring.datasource.password
        - spring.datasource.driver-class-name

### 参考URL
- Doma関連
    - http://doma.readthedocs.io/ja/stable/
    - http://doma-gen.readthedocs.io/ja/stable/

- Spring Boot関連
    - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/
    - http://jsug-spring-boot-handson.readthedocs.io/en/latest/index.html