Spring入門ガイド実施　第1回　Restful WEBサービスの構築

公式サイトにあったドキュメントで学習するよ。

https://spring.io/guides/gs/rest-service

>このガイドでは、Spring を使用して「Hello, World」RESTful Web サービスを作成するプロセスについて説明します。

`http://localhost:8080/greeting`でアクセスすると`{"id":1,"content":"Hello, World!"}`が返ってきて、
`http://localhost:8080/greeting?name=User`でアクセスすると`{"id":1,"content":"Hello, User!"}`が返ってくるWEBサービスを作成する。

# 必要なもの
・約15分
　→準備している前提。
・任意のテキスト エディターまたは IDE
　→eclipse Version: 2022-12 (4.26.0)を使用します。
・Java 17以降
　→17を使います。
・Gradle 7.5 以降または Maven 3.5 以降
　→Gradle 8.7 を使用します。

Gradleのインストールの際に環境変数で躓いたので備忘↓

https://qiita.com/toon258/items/6c85d6a7183f715482bd

https://www.techfun.co.jp/services/magazine/java/windows-jdk-pathset.html

# soringbootプロジェクト作成
eclipseの新規プロジェクト作成でSpringスタータープロジェクトを選択。
追記：名前とかパッケージとかは任意で良いけど手順で想定しているのは以下。任意でやった場合はパッケージ名変えたりする必要があるからちょっと面倒。以下の設定にすればたぶん問題ない。
名前　　　：`gs-rest-service`
パッケージ：`com.example.restservice`
![messageImage_1712146725547.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/5c34f829-4db4-a551-9ba9-48416c75b7d5.jpeg)

SpringWEBだけ使用するのでチェックを入れる。
![messageImage_1712153097948.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/a47a4a96-3f1f-78c8-92ae-c2cc6d85ce5f.jpeg)

Springフレームワークの中にWEBサービスの開発を補助するフレームワークとしてSpringWEBがあるイメージ。
そしてSpringフレームワークを使用した開発をより快適にするためのSpringBootというイメージでいる。

https://hnavi.co.jp/knowledge/blog/spring-boot/

# 手順実施
ここからは手順にあるファイルを作成していく。途中よくわからなかったところがあったので調べながら実施した。

全然見慣れないコードが出てきたけど冗長なコードをめちゃくちゃはしょれるrecordクラスというJava16くらいで追加された機能らしい。
```java
package com.example.restservice;

public record Greeting(long id, String content) { }
```

https://qiita.com/value-urano/items/6b37026fbe5c4ac24565

# ビルドする
springbootの特徴として組み込みwebサーバーがある。デフォルトでtomcatが組み込まれたjarを作成出来るのでそれをサーバーに置いてjarを実行するだけで良くなった。アプリを起動するとtomcatを起動してデプロイされてがサイクルの一部となると理解している。面倒なデプロイが不要になり、サーバー上に置くだけで良くなるので便利。tomcat以外にも使えるけど今は割愛。

Gradleでビルドすると実行可能jarがbuild/libs配下に作成される。
これはプロジェクトを作る際にしれっとjarを作ることを選択していたのでそうなる。warも作れる。

jarを実行するコマンド例は以下で、jarは作成されたものを指定する。
`java -jar "D:\Spring学習\workspace-sub\demo\build\libs\demo-0.0.1-SNAPSHOT.jar"`

eclipseからgradleのビルドを実施する方法は以下参照。

https://learning-collection.com/eclipse%E3%81%A7jar%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

jarを実行すると以下のような出力がされる。
```
>java -jar "D:\Spring学習\workspace-sub\demo\build\libs\demo-0.0.1-SNAPSHOT.jar"

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.4)

2024-04-04T10:17:56.478+09:00  INFO 8960 --- [demo] [           main] c.e.restservice.RestServiceApplication   : Starting RestServiceApplication v0.0.1-SNAPSHOT using Java 17.0.10 with PID 8960 (D:\Spring学習\workspace-sub\demo\build\libs\demo-0.0.1-SNAPSHOT.jar started by socce in C:\Users\socce)
2024-04-04T10:17:56.492+09:00  INFO 8960 --- [demo] [           main] c.e.restservice.RestServiceApplication   : No active profile set, falling back to 1 default profile: "default"
2024-04-04T10:17:59.116+09:00  INFO 8960 --- [demo] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-04-04T10:17:59.169+09:00  INFO 8960 --- [demo] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-04-04T10:17:59.169+09:00  INFO 8960 --- [demo] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.19]
2024-04-04T10:17:59.234+09:00  INFO 8960 --- [demo] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-04-04T10:17:59.236+09:00  INFO 8960 --- [demo] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2619 ms
2024-04-04T10:18:00.052+09:00  INFO 8960 --- [demo] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2024-04-04T10:18:00.272+09:00  INFO 8960 --- [demo] [           main] c.e.restservice.RestServiceApplication   : Started RestServiceApplication in 4.298 seconds (process running for 6.585)
動いているよ
```
最後の行は想定通りのjarが動いてるか確認するために入れたprintln。

この状態で`http://localhost:8080/greeting`にアクセスすると以下のようなjsonが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/b0e3d8dc-d1ce-862b-ebe6-efd18c3bdabd.png)

`http://localhost:8080/greeting?name=spitz`で好きなnameパラメータを設定してリクエストすればしっかり反映されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/a675c714-9dd8-e907-bec0-32f3ba2711d5.png)


とりあえず実施完了。

# 感想
初めてspringbootのプロジェクトを作成して、gradleも初めてだったので良い経験になった。
準備で手間取ったところが多いけど今回で環境構築はできたので次からはきっと捗る。