Kotlin
spring
gradle
Thymeleaf
spring-boot

【Kotlin】Spring BootでHello World

友人達と「KotlinとSpring Boot」で何か作ろうぜって話して、環境構築してたらちょこちょこ詰まったので備忘録として書いていきます

ちなみに私はJavaもKotlinもGradleもロクに触ったことがありません(˘ω˘)

環境

Ver
macOS High Sierra
IntelliJ IDEA 2018.1
Kotlin 1.2.31
Spring Boot 2.0.2.RELEASE
Thymeleaf 3.0.9.RELEASE

手順

雛形のDL

Spring InitializrでSpringプロジェクトの雛形を作成

Screen Shot 2018-05-10 at 10.58.45.png

プルダウンをGradle Project、Kotlin、お好みのバージョンにして
GroupとArtifactもお好みで記載しGenerate Projectをクリック

するとzipファイルがDL出来るので、適当な方法で解凍

プロジェクトの作成

IntelliJを起動しCreate New Projectを選択
Screen Shot 2018-05-10 at 10.55.43.png
GradleからKotlin(Java)をチェックを入れてNext

Screen Shot 2018-05-10 at 10.55.46.png
先ほどと同じGroupとArtifactを記入しNext

Screen Shot 2018-05-10 at 10.55.50.png
変更無しでNext

Screen Shot 2018-05-10 at 10.55.53.png
お好みで設定してFinish

雛形の適用

先ほど解凍したフォルダからbuild.gradlesrcディレクトリをプロジェクトにコピー
※build.gradleは上書き

コピーしたらbuild.gradleを開いて以下を変更&追記して保存

build.gradle
buildscript {
    ext {
        kotlinVersion = '1.2.20'
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    }
}

// ~~省略~~

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compile("org.jetbrains.kotlin:kotlin-reflect")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

build.gradle
buildscript {
    ext {
        kotlinVersion = '1.2.31' //1.2.31に変更
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    }
}

// ~~省略~~

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compile("org.jetbrains.kotlin:kotlin-reflect")
    testCompile('org.springframework.boot:spring-boot-starter-test')

    //以下を追記
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-devtools")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
}

保存したら画面右下に以下の表示が出るのでImport Changesをクリック
※または、メニューバーの[View]-[Tool Windows]-[Gradle]を開き、ぐるぐるしてるマークをクリック

Screen Shot 2018-05-10 at 10.56.09.png

Screen Shot 2018-05-10 at 12.54.25.png

クリックするとタスクが開始されるので完了まで待機

完了したら一度、メニューバーの[View]-[Tool Windows]-[Gradle]を開き、[Tasks]-[application]-[bootRun]をクリックしサーバを起動後、以下にアクセスして、「Whitelabel Error Page」が表示されることを確認
http://localhost:8080/

表示が確認出来たら、サーバを停止して次の手順へ

コントローラ作成

src/main/kotlin/com/example/demoにcontrollerパッケージを作成し
controller直下にHelloWorldController.ktを作成

HelloWorldController.kt
package com.example.demo.controller

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

@Controller
class HelloWorldController {

    val htmlName = "hello_world" //表示するhtmlの名前

    @GetMapping("/")
    fun root(model: Model): String {
        model.addAttribute("hello", "hello world!")
        return htmlName //表示するテンプレートのhtml名をreturn(.htmlはいらない)
    }
}

テンプレートの作成

src/main/resourcesにtemplatesディレクトリを作成し
templates直下にhello_world.htmlを作成

hello_world.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
</head>
<body>
    <p th:text="${hello}"></p>
</body>
</html>

実行

先ほどと同じ方法でサーバを起動し、以下にアクセス
http://localhost:8080/

Screen Shot 2018-05-10 at 15.01.47.png

「hello world!」が表示されれば成功

あとがき

今回そもそもspringやらgradleやらってなんだって状態から入って、今も正直良くわかってないですが、とりあえず起動して表示するところまで出来たのでこれからいろいろ遊んでみようと思います(˘ω˘)

Spring Bootを使うメリットや、gradleの使い方とか徐々に理解していきたい( ˘ω˘)