Kotlin + Spring Boot でHello! World!

# プロジェクト作成

[Spring Initializr](https://start.spring.io/)でプロジェクトを作成
https://start.spring.io/

以下の図のように選択します。

・Gradle
・Kotlin
・Spring Boot 2.1.6
・Spring Web Starter

<img width="980" alt="スクリーンショット 2019-07-04 13.59.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/4f0f8af4-2cf9-8e7b-5a0f-b6ef28e09f72.png">

最後に、「Generate The　Project」を押下するとZipファイルがダウンロード開始します。
解凍すると、上記の指定にしたがって作成されたプロジェクトフォルダが現れます。

解凍したフォルダごと、IntellJ IDEAへドロップすると
<img width="1064" alt="スクリーンショット 2019-07-04 14.07.26（2）.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/c90a960e-16d8-74c2-d936-fc94c27ea0be.png">

IDEが開き、プロジェクト読み込みが開始されます。
Import Gradle projiectと表示されたらクリックします。

<img width="1166" alt="スクリーンショット 2019-07-04 14.12.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/ca4aea9a-6e61-0457-30ed-501c694a5d6b.png">

ポップアップが開くのでOKを押します。
Use auto-import を選択しといた方がいいです。
<img width="1052" alt="スクリーンショット 2019-07-04 15.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/0e9fd500-fb05-5f5f-b480-83b4589921c6.png">


プロジェクト読み込みが完了します。
<img width="1166" alt="スクリーンショット 2019-07-04 14.16.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/04f71b05-7a63-9a74-0529-92c2d4a76040.png">


## テスト実行

SwaggerDemoApplication.ktを開き、▶︎ボタンを押して表示される「Run」を選択します。
<img width="743" alt="スクリーンショット 2019-07-04 14.27.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/865619c8-7774-effb-0a52-21d952571628.png">

この状態で特に何も変化はおきませんが、8080ポートでWebサーバーが起動しています。
http://localhost:8080/

アクセスするとエラーページが表示されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/e9d9a70d-09cd-9f7e-0de2-5a095414f095.png)

ログにはアクセスした形跡が表示されてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/4a754bdc-fcd6-9831-c1b1-ee7791a4a7bd.png)

# REST APIの追加

## Controllerの作成

com.example.swagger.demoの下にHelloController.ktを作成します。
<img width="790" alt="スクリーンショット 2019-07-04 14.37.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/850b6f8d-10fe-c3f7-a450-353d84e7b05b.png">
<img width="353" alt="スクリーンショット 2019-07-04 14.40.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/9a696e4c-3167-ca0c-7743-d9c438438dfe.png">

以下のようにimportと`@GetMapping`アノテーションを追加します。
単に文字列を返すだけのgetメソッドです。

```kotlin:HelloController.kt
package com.example.swagger.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloController {
    @GetMapping("/hello")
    fun hello(): String {
        return "Hello! World!"
    }
}
```

再度実行して以下のアドレスにアクセスします。
http://localhost:8080/hello

Hello! World! が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/6b4c2b96-0c59-5ee7-4804-5df45bdc7cc9.png)


## RequestParamの追加

このままでは寂しいのでコントローラーにパラメータを渡せるようにしてみます。

RequestMappingとRequestParamを追加します。
`import org.springframework.web.bind.annotation.RequestMapping`
`import org.springframework.web.bind.annotation.RequestParam`

HelloControllerに`@RequestMapping`アノテーションを追加し以下のようにします。

```kotlin
package com.example.swagger.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam

@RestController
@RequestMapping
class HelloController {
    @GetMapping("/hello")
    fun hello(@RequestParam(value = "name", required = false, defaultValue = "world") name: String): String {
        return "Hello, $name!"
    }
}
```

再度実行して以下のアドレスにアクセスします。
http://localhost:8080/hello?name=taro

リクエストパラメータ ”name" にtaro が渡されて、Hello! taro!　と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/96e36969-98de-a215-80b2-17d52408e84f.png)

パラメータを省略可（required = false,）にしているので、
http://localhost:8080
にアクセスした際にはデフォルト値のWorld（defaultValue = "World"）が使用されて、Hello! World!と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/0b174c56-82ff-096c-20db-86035d95909d.png)



# 参考

[Kotlin×Springで作るAPI&ドキュメント \- Qiita](https://qiita.com/nogut0123/items/35af54dc7ebf3bb22507)