Kotlin + SpringBoot + JPA + Thymeleafで簡単なCRUDを作る①～HelloWorldまで～

## 内容

- Kotlin + SpringBootで簡単なCRUDアプリを作る
- [こちらの記事](https://qiita.com/ozaki25/items/74f8895db109290e75da)のKotlin版です
- 今回は雛形を作って動作確認まで

## 雛形作成

### SpringInitializrを使う

- [ここ](https://start.spring.io/)でzipを落としてもいいけど今回はIntelliJ上で作成する
    - IntelliJ上でSpringInitializrを使うにはCommunityではなくUltimateを使う必要あり

### 手順

- 雛形作成
    - IntelliJを開き「新規プロジェクトの作成」を選択
    - SpringInitializrで雛形を作る

<img width="850" alt="スクリーンショット 2018-12-31 0.53.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/1bfa12cf-c214-ea7d-9b9f-e3d25555b58f.png">

- サンプルなのでアプリ名はなんでもいい

<img width="849" alt="スクリーンショット 2018-12-31 1.06.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/f80c1cc7-2902-c03b-3ec7-3133847dd134.png">

- 今回はKotlinで開発するので言語はKotlinを選択
- ビルドツールはmavenとgradleどちらでもよいが今回はmavenを選択
    - 今回作る範囲ではどちらを選んでもさほど変わらない

<img width="848" alt="スクリーンショット 2018-12-31 0.54.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/776e33e7-f270-c432-5b7c-dad3306b464e.png">

- 必要なライブラリを選択すると同梱した状態で雛形ができる
- 今回は以下の5つを選択(後からでも追加可能)
    - Devtools・・・ホットデプロイとかできるようになる
    - JPA・・・JavaとDBをつなぐORMapper
    - H2・・・インメモリのDB
    - Thymeleaf・・・テンプレートエンジン
    - Web・・・エンドポイント(URL)を簡単に作れる

## アプリの起動

- 雛形の生成が終わったらまずは動作確認
- 「実行」を選択すると起動できる

<img width="733" alt="スクリーンショット 2018-12-31 1.01.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/61ce1453-052c-f263-b25e-772804d0424e.png">

- 起動するとコンソールにこんな感じの出力がされる

<img width="1182" alt="スクリーンショット 2018-12-31 1.09.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/1ad5e749-a832-80a5-ba48-c0fc92ea8e37.png">

- 最後にstartedと出ていれば正常に起動が完了している
- アプリの起動は以下のコマンドでターミナル上で実行することもできる
    - `mvn spring-boot:run` or `gradle bootRun`

## 雛形で生成されたファイルの確認

### BaseballApplication.kt

```kotlin:src/main/kotlin/com/example/baseball/BaseballApplication.kt
package com.example.baseball

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class BaseballApplication

fun main(args: Array<String>) {
    runApplication<BaseballApplication>(*args)
}
```

- このmainメソッドがアプリのエントリーポイントになり、Springアプリを起動している

### application.properties

```properties:src/main/resources/application.properties

```

- この時点では空のファイル
- アプリに関する設定を記述する

### BaseballApplicationTests.kt

```kotlin:src/test/kotlin/com/example/baseball/BaseballApplicationTests.kt
package com.example.baseball

import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner

@RunWith(SpringRunner::class)
@SpringBootTest
class BaseballApplicationTests {

    @Test
    fun contextLoads() {
    }

}
```

- テストコードの雛形

## HelloWorldをブラウザから確認

- http://localhost:8080/ にアクセスするとHelloWorldと表示されるようにする

### 手順

- 作るファイルは2つ
- 1つ目はユーザからのアクセスを受け取ってテンプレートを返すファイル
- 2つ目はユーザに返すテンプレート

#### HelloWorld.kt
- `com.example.baseball`に`HelloWorld.kt`を作成する

```kotlin:src/main/kotlin/com/example/baseball/HelloWorld.kt
package com.example.baseball

import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping

@Controller // ①
class HelloWorld {
    @GetMapping("/") // ②
    fun hello() = "hello" // ③
}
```

- ①：`@Controller`をつけることでこのClassがユーザからのアクセスを受け取ることができる
- ②：`@GetMapping("/")`とすると、httpメソッドがGETでURLが`/`のアクセスがあるとこのメソッドが呼ばれるようになる
    - ()の中のパスは、`http://localhost:8080`に続く内容を表す
    - 例えば`@GetMapping("/users")`だと`http://localhost:8080/users`にマッピングされる
- ③：`src/main/resources/templates/`配下の`hello.html`をユーザに返す
    - Stringを返しているだけなのになぜそんな動きをするかというと、このClassに`@Controller`がついているから

#### hello.html

- `src/main/resources/templates/`に`hello.html`を作成する

```html:src/main/resources/templates/hello.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>baseball</title>
  </head>
  <body>
    <h1>HelloWorld</h1>
  </body>
</html>
```

### 動作確認

- http://localhost:8080/ にアクセスすると以下の画面が表示される

<img width="463" alt="スクリーンショット 2018-12-31 1.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/eb0cfe43-58ca-8e68-40fd-cf6b36773069.png">

### ホットデプロイ

- [TODO] IntelliJでホットデプロイがうまくいっていない

### 次回

- 続きは[こちら](https://qiita.com/ozaki25/items/301d43dfcb1903ef995b)