Spring Initializerを使ってHello World

# はじめに
Spring Fest 2020でSpring Initializerを使ったプロジェクトの作成方法が紹介されていました。
これまでSpringBootでの自主開発に挑戦と挫折を繰り返してきましたが、Hello Worldまでたどり着いたのでその記録を残します。

# 環境
- OS: macOS Mojave 10.14.6
- IDE: Visual Studio Code


# 下準備

## Javaのインストール
HomebrewでJDK11をインストールします。
インストールするだけだと自動でアップデートされてしまうので、バージョンを固定するために`tap`コマンドをはさみます。

```
$ brew tap AdoptOpenJDK/openjdk
$ brew install --cask adoptopenjdk11
  ~~
🍺  adoptopenjdk11 was successfully installed!

# brewでインストールしたパッケージにJDKが含まれているか確認
$ brew list
  ~~  openjdk

# Javaのバージョンを確認
$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1, mixed mode)

# インストールされたディレクトリの場所を確認
$ /usr/libexec/java_home -v 11
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
```

JAVA_HOME と PATH を設定

```
# 現在の設定を確認
＄ export -p

# 設定追加
$ export JAVA_HOME=`/usr/libexec/java_home -v 11`
$ PATH=${JAVA_HOME}/bin:${PATH}

# 追記されているか確認
＄ export -p
declare -x JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home"
declare -x PATH="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin

# sourceコマンドを実行してPATHを通す
$ source ~/.bash_profile

$ which java
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java
```

> ・GitHub AdoptOpenJDK - HomeBrew TAP
https://github.com/AdoptOpenJDK/homebrew-openjdk
・Java 11 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする
https://qiita.com/niwasawa/items/460ccd0fa0041e7a2491

## Mavenのインストール

同じくbrewでインストールします

```
$ brew install maven
$ brew list
  ~~  maven

$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 11.0.9.1, vendor: AdoptOpenJDK, runtime: /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"

# setting.xmlを.m2フォルダに移動
$ cp /usr/local/Cellar/maven/3.6.3_1/libexec/conf/settings.xml ~/.m2
```

## Visual Studio Codeの設定

### 拡張機能のinstall

 - Java Extension Pack
 （https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack）
 - Spring Boot Extension Pack
 （https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack）

それぞれPackという名前の通り色々内包されています。詳細はリンク先まで。

# Spring Initializer

## Project作成
https://start.spring.io/
以下の内容で「GENERATE」すると、ダウンロードフォルダにzipファイルが格納されます。
![スクリーンショット 2020-12-30 0.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/aca90cbb-681a-9ba8-0820-a3fef69c3706.png)

## VSCodeで開く

File > Open > 展開したフォルダを選択
DemoApplication.javaにmainメソッドが作成されています。
![スクリーンショット 2020-12-30 0.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/f99b6147-daf2-f5f1-0000-28bbbb0228c7.png)

## Hello World

### Controller
- `/src/main/java/com/example`配下に`Controller`フォルダを作成する
- `Controller`フォルダの配下に`IndexController.java`を作成する

```IndexController.java
package com.example.demo.Controller;

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

@RestController
public class IndexController {

    @GetMapping("/")
	public String index(){
		return "Hello World";
	}
}
```


### 実行

MAVEN から `clean`, `package`, `install`
Spring boot dashboard から `start` or `debug`

ブラウザで`http://localhost:8080`をたたく
![スクリーンショット 2020-12-30 22.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/bd38c732-9ee3-945a-e06e-15a4816a31a6.png)
成功です:thumbsup:


## Hello World -Thymeleaf

次は文字列ではなくHTMLを返せるように修正します。

### pom.xml
dependenciesに以下を追加して再ビルド

```pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
  <version>2.4.1</version>
</dependency>
```

> Maven repository - Spring Boot Starter Thymeleaf
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf

### Controller

```IndexController.java
package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

    @RequestMapping("/")
	public String index(){
		return "index"; //returnするHTMLのファイル名
	}
}
```

### HTML

`/src/main/resources/templates` に`index.html`を作成

```index.html
<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
    <head>
        <meta charset="utf-8">
        <title>Sample</title>
    </head>
    <body>
        <h1>HelloWorld Thymeleaf</h1>
    </body>
</html>
```

### 実行

Spring boot dashboard から `start` or `debug`
ブラウザで`http://localhost:8080`をたたく
![スクリーンショット 2020-12-30 22.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/96247ff7-76b6-aa70-c6fb-b9ffa00a9d9a.png)
成功です:thumbsup:

もしも以下のようなエラーが出てしまったら、.m2/repository 配下のフォルダを全て削除して再ビルドを試してみてください。私はしばらくはまってしまったのですがその方法で解決しました。
>javax.servlet.ServletException: Circular view path [～]: would dispatch back to the current handler URL [/～] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)