Spring Boot Web アプリケーションを作る

# はじめに

記載情報は CI/CD に関連します。  
実務上関わった環境・機能を身近な情報としてお届けしたく、投稿をはじめました。  
各学習上、お金のかからない方法を選択していきます。

以下の手順を実施することで、Spring Boot Web アプリケーションを作る工程を模倣します。

## 対象者と関連環境・機能

この記事は下記のような人を対象にしています。

- CI/CD 初学者
- プログラミング初学者
- 駆け出しエンジニア

記載している環境・機能は以下です。

- Java
- Spring Boot
- Spring Web
- thymeleaf
- Spring Tool Suite 4

## 準備

|  No | 参照 URL                                                                                  |
| --: | ----------------------------------------------------------------------------------------- |
|   1 | [Spring Tool Suite 4 インストール、Spring Initializr 、gradlew の利用](https://qiita.com/wf-kenji-ikeda/items/d00766da8a4076ec43ed) |


上記準備準備作業を行うことで空っぽの Spring Web アプリが立ち上がる状態になります。  
ただし、このままですと起動後、/ へリクエストしても、HTTP ステータスコード：404（Not Found）が返るのみとなります。  
これでは後続関連記事でコンテナ上稼働させてもいまいちだと思いますので、index.html の表示はさせてみたく思います。

## Spring Boot Web アプリケーションに画面遷移機能を追加する

### ソース

本作業実施後の状態となります。  
[web page 追加](https://github.com/oad3/application-springboot/tree/feature/add-web-page)

最新はこちらとなりますが、clone 後に状態を遡って確認頂けます。  
[main の最新](https://github.com/oad3/application-springboot)

### 実施した作業

発生差分は[実物](https://github.com/oad3/application-springboot/pull/1/files)を確認してもらう方が早いかもしれません。
概要としては Thymeleaf を利用しての画面遷移(index ⇒ result)を追加、となります。
（「Thymeleaf（タイムリーフ）」とは Java テンプレートエンジンです。 MVC モデルでいう「V（ビュー）」にあたる部分。らしいです。。）

[web page 追加した際の差分](https://github.com/oad3/application-springboot/pull/1/files)

```ex-add
├─main
│ ├─java
│ │ └─com
│ │ └─example
│ │ └─demo
│ │ DemoApplication.java
│ │ HelloSpringBootWebController.java 　 ※追加
│ │
│ └─resources
│ │ application.properties
│ │
│ ├─static
│ └─templates
│ index.html 　 ※追加
│ result.html 　※追加
│
└─test
```

以下、作業を進めるときに直面した困り事のご紹介です。
Spring Tool Suite 4 に振り回された気がします。

## 発生事象

Spring Web のサンプルアプリを作成していた際、Get で"/"アクセスした際、index.html が表示されるようにしたつもりでした。  
しかし、"/"アクセスした際には index.html ではなく、「This application has no explicit mapping for /error, so you are seeing this as a fallback.」が出力される。  
事は単純で build.gradle への thymeleaf 追記を漏らしていたことが原因でした。

```build.gradle
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'　※追記漏れしていた
}
```

Spring Tool Suite 4 を利用して動きを見ていたのですが、原因への対処をしたつもりであるのに症状が変化せず。。  
結論、「build.gradle に thymeleaf を記載しているが、IDE 側でうまいこと認識せず、依存対象をローカルにダウンロードできていなかった」という事象だった模様です。  
build.gradle の通りに依存対象が認識され、ビルドが通れば「$HOME/.gradle/caches/」に依存対象がローカルダウンロードされるはずなのに無かった、という内容です。  
Spring Tool Suite 4 の怪しい動きに振り回された可能性が高く、plugins に「id 'eclipse'」を追加し、「gradlew cleanEclipse eclipse」を実行すると Spring Tool Suite 4 上からも意図した挙動となりました。  
本筋ではない箇所で躓いてしまいました。。

### 備忘

build.gradle の dependencies を修正したのに挙動があやしかったら？

- 「$HOME/.gradle/caches/」に依存対象がローカルダウンロードされているか要確認
- なければ「gradlew cleanEclipse eclipse」実行とかで反映

## 関連作業

- [CI/CD とは?](https://qiita.com/wf-kenji-ikeda/items/bfb6d5e21b33d0cca83b)
- [Azure Devops (Artifacts) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/9c21859d8b5b6a63246e)
- [Spring Tool Suite 4 インストール、Spring Initializr 、gradlew の利用](https://qiita.com/wf-kenji-ikeda/items/d00766da8a4076ec43ed)
- [Spring Boot Web アプリケーションを作る](https://qiita.com/wf-kenji-ikeda/items/1e64e44094ce8a1d997f)
- [Jar の Library を作り、Azure Artifacts を利用して成果物を配布する](https://qiita.com/wf-kenji-ikeda/items/696bda335a8933abfcb3)
- [ライブラリ開発者より指定されたバージョンを利用してアプリを作る](https://qiita.com/wf-kenji-ikeda/items/5bf06ce19c52e73a5463)
- [アプリを Docker 、Docker Compose でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/e6604ea6ae257f3925a7)
- [Azure Devops (PileLines) を無償、無料で使う](https://qiita.com/wf-kenji-ikeda/items/451838da3b4ac45a8d65)
- [Azure Devops (PileLines) でテスト、ビルド、イメージプッシュをする](https://qiita.com/wf-kenji-ikeda/items/5ddf6158bb98c4174db9)
- [minikube(kubernetes) でコンテナを動かしてみる](https://qiita.com/wf-kenji-ikeda/items/95604d83850a17b91c46)
- [nginx のコンテナを Docker や minikube(kubernetes) で動かし、静的コンテンツ公開工程を模倣](https://qiita.com/wf-kenji-ikeda/items/bf6cb1b7a047f562d309)

## 参考記事

[Thymeleaf とは](https://qiita.com/opengl-8080/items/eb3bf3b5301bae398cc2)  
[【SpringBoot】This application has no explicit mapping for /error](https://techatoq.com/springboot-this-application-has-no-explicit-mapping-for-error)  
[ビルドしても更新が反映されなかったり、git の環境が壊れてしまったときにの対処方法](https://qiita.com/windows222/items/c0c7a69f61e6d8fc0dee)