Spring Bootでとりあえず動くものを書く

<p>
### 追記
kazuki43zooさんがコメントしてくださったように、新しいバージョンのSpring Boot(1.3.3.RELEASE)と[SPRING INITIALIZR](https://start.spring.io)を使えば、本記事のような煩わしさを感じることなく、動くものが作れるようです。
<p>
-----

Javaのフレームワークとして有名なSpring。
その中でも、ウェブアプリをサクサクっと作るためのSpring Boot。
利用者も多いだけあって、検索すればいろんな情報が出てきますが、私のような技術力のないエンジニアにとって、簡単にできると言われてもなかなかできないのが現実です。
そこで、私がはまった点などを踏まえながら、とりあえず動くものを作るために必要な情報を記載します。
動くもののソース https://github.com/heiwa/spring-boot-template

# 開発環境
mavenとSpring Bootで開発します。
* Spring : 1.0.2-RELEASE
* maven : 3.3.3
私はMacを使用していますが、環境による差異はほとんどないと思われます。

# ディレクトリ構成
    SampleApp
      ├ src
        ├ main
          ├ java
            └ heiwa.spring.sample
              ├ controller
                └ SampleController.java
              └ App.java
          └ resources
            └ templates
              └ hello.html
        └ test  //省略
      └ pom.xml

App.javaにはメインメソッドがあり、Spring Bootを利用したウェブアプリ起動クラスとなります。
SampleControllerはコントローラで、hello.htmlをテンプレートにした画面を返します。

# pomの設定
まず、Spring Bootのどのバージョンを利用するかを記述します。

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.0.2.RELEASE</version>
    </parent>

依存関係に次を追加します。

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

上がSpring Bootを使う上で必須の依存、下はテンプレートとしてthymeleafを使用する場合に必要な依存です。
テンプレートはjspなども使えますが、springの推奨はthymeleafみたいなので、thymeleafを使用します。郷に入っては郷に従っておきます。

# 起動クラスを作成
App.javaを作成します。

    @Controller
    @ComponentScan
    @EnableAutoConfiguration
    public class App {
    
        @RequestMapping("/")
        @ResponseBody
        public String home() {
            return "Hello, Spring Boot!";
        }

        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
    }

(importはよしなにしてください）
@EnableAutoConfiguration をつけることで、Spring Bootがいろいろとよしなにしてくれるみたいなので付けます。そして、mainメソッドでSpringApplication.runを呼ぶことで、Spring Bootでウェブアプリが起動されます。簡単ですね！

@Controller をつけることで、このクラスがコントローラクラスだと知らせます。
そして、任意のメソッドに@RequestMapping を付けると、そのメソッドとurlをマッピングしてくれます。上記の場合だとlocalhost:8080/に接続するとhomeメソッドが呼ばれます。
homeメソッドは@ResponseBody が付いているので、返却値である文字列をレスポンスボディとしてレスポンスを返します。

これで、とりあえずレスポンスが返ってくるものができました！
動かしてみましょう！

# 起動
プロジェクトルートでmavenコマンドを叩きます。
`mvn clean package spring-boot:run`
ブラウザでhttp://localhost:8080/ にアクセスすると、 "Hello, Spring Boot!"が返ってきます。

# コントローラの追加
まず、上で説明しなかった @ComponentScan をApp.javaにつけます。これにより、そのパッケージ以下のクラスをスキャンし、コンポーネントを追加してくれます。作成したコントローラクラスを追加するために必要です。

    @Controller
    public class SampleController {
    
        @RequestMapping("hello")
        public String hello(Model model) {
            model.addAttribute("hello", "Hello, spring");
            return "hello";
        }
    }

作成したクラスに先ほど同様 @Controller をつけます。これだけで、このクラスをコントローラとして追加してくれます。その後、 @RequestMapping でマッピングの指定をします。

# テンプレートを使用したレスポンス
今回はテンプレートを使ったレスポンスを返します。
コントローラのメソッドでModelクラスの引数をとり、これにテンプレートに必要な情報をaddAttributeで入れていきます。
返却値はテンプレートファイルへのパスを返します。上記の例だと、helloなので、
resources/templates/hello.htmlが指定されます。
(テンプレートのデフォルト配置場所がtemplates以下)

    <!-- hello.html -->
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8" />
        <title>page title</title>
    </head>
    <body>
        <span th:text="${hello + ' world'}"></span>
    </body>
    </html>

最初の `<html xmlns:th="http://www.thymeleaf.org">` でthymeleafタグの使用を宣言し、`<span th:text="${hello + ' world'}"></span>` のように使用します。

これで、テンプレートを使用したレスポンスが返せます。

# まとめ
* クラスにアノテーションを付けていくだけでウェブアプリが作成できる
* デフォルトに気をつける
  * mainメソッドがあるクラスは一つにする（複数ある場合は指定が必要）
  * テンプレートの配置場所はtemplates以下
  * 起動クラスしか見ない（必要なら@ComponentScan を付ける)