SpringBootでHello World!


#目的

前回記事は、[Spring Initializr を使って爆速でHello World！！！](https://qiita.com/morioheisei/items/5b75da7af8de77d9f1b5)と急いでいる人向けの記事でした。

今回は[Spring Quickstart Guide](https://spring.io/quickstart)を参考にゆっくり進めてみようと思います。

#事前準備

統合開発環境は、 [IntelliJ IDEA](https://www.jetbrains.com/idea/), [Spring Tools](https://spring.io/tools), [Visual Studio Code](https://code.visualstudio.com/docs/languages/java), [Eclipse](https://www.eclipse.org/downloads/packages/)が人気らしいですね。
私は、`Visual Studio Code（以下VSCode）`を使用します。

Javaの開発をするための開発キットは、[AdoptOpenJDK](https://adoptopenjdk.net/)のversionは、8か11がオススメみたいです。
OpenJDK11を導入する方法を[Java開発環境構築](https://qiita.com/morioheisei/items/ef8eb5d75c07b4d280f4#openjdk-11%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に記載していますので、未だの人はそちらを参考にしてみてください。

#1.SpringBoot projectを始めよう！

まずは、[spring initializr](https://start.spring.io/)にアクセスします。
![スクリーンショット_2020-06-29_14_37_13-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/ff19d509-7b8c-7c84-6281-597f37c962c4.png)

**ProjectはMavenを選択します。**

> プログラムが実行できるように、ソースコードの解析やプログラミング言語を機械語にコンパイルをしてくれるもの。

参考URL：[知識ゼロからAnt と Maven と Gradle について勉強する。-ビルドの定義からツールの特徴まで](http://wild-data-chase.com/index.php/2019/04/06/post-699/)

**Languageは、Javaを選択します。**

**SpringBootは、2.3.1を選択します。(2020/6/30現在)**

公式では、`versionは定期的に変わるので一番新しいversionを選んでください。（ただし、SNAPSHOTは選択しないでください）`と書かれています。



そして、`ADD DEPENDENCIES`ボタンをクリック。
![スクリーンショット_2020-06-29_13_14_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/f0c15cc9-e6c0-e793-4385-2891fc4511cb.png)

webと入力してください。

![スクリーンショット 2020-06-29 13.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/ce73e44d-c1a0-8199-10e5-86e5f5440c61.png)



そして、`Spring Web`を選択してください。

Spring Webとは、
> Spring MVC を使用して、RESTful を含む Web アプリケーションを構築するための設定です。


以下のように表示されていればOKです。
![スクリーンショット_2020-06-29_14_37_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/be235d80-4557-2a77-fb7f-2e9976badee7.png)

最後に`Project Metadata`を編集していきます。

![スクリーンショット_2020-06-29_14_37_13-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/19f49cd5-f9e9-3a24-2c8b-5c8c1231ea73.png)


Group：プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的。
Artifact：プロジェクトの成果物の名前。Artifactと同じ名称を使用することが推奨されているみたいで、こちらを変更するとNameも変更されます。
Name：プロジェクトの表示名。Mavenの場合、mainプログラムのクラス名としても使われます。Artifactと同じ名称を使用することを使用することが推奨されているみたいで、こちらを変更するとArtifactも変更されます。 
Description：プロジェクトの説明を入力します。
Package Name：プロジェクトのパッケージ名。通常は、Groupで指定したパッケージとArtifactで指定した名称で構成されます。（Group名.Artifact名となる）
Packaging：パッケージする方法をJarもしくはWarのいずれかを選択します。

今回はJava11を使用するので、11を選択して`GENERATE`ボタンをクリックします。

![スクリーンショット_2020-06-30_9_50_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/740ae758-dc50-1262-ed89-0a44506d760c.png)

Zipファイルがダウンロードされるので、
![Spring_Initializr_と_メモ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/2a023976-8943-4f2e-aa18-b7f837e5cbc4.png)

そのZipファイルを展開してください。

<img width="173" alt="スクリーンショット 2020-06-30 10.00.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/c0ecde5f-3703-b566-2394-a818d441e52e.png">

準備完了です。

#2.コードを追加しよう！

先ほどのフォルダをVSCodeで開きます。
Java Extension Packのインストールを推奨します。と言われるのでインストールしておきましょう。

![スクリーンショット 2020-06-30 10.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/517f4e03-9c60-c26a-3121-b6a669086660.png)


そして、`src/main/java/com/example/demo`の中にある、`DemoApplication.java`を開きます。
![スクリーンショット 2020-06-30 10.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/6994dc43-7487-576f-9dc9-8b22b657aed4.png)

```java:DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}
```

クラスの上に記述されている@〇〇は、アノテーションと言います。

アノテーションとは注釈の意味であり、あるデータに対して関連する情報を注釈として付ける事であり、
プログラムの中では記述されたコードに注意書きを追加する機能となります。
@SpringBootApplicationというアノテーションを記述することで、Spring Bootの起動クラスとして必要な機能が自動的に組み込まれます。


公式を参考にコードを追加します。

```java:DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

@SpringBootApplication
@RestController
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	@GetMapping("/hello")
	public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
		return String.format("Hello %s!", name);
	}
}
```

@RestControllerというアノテーションを記述することで、クラスをControllerとして認識してくれます。
Viewへ遷移しないため、メソッドの戻り値がそのままレスポンスボディに書き込まれます。（今回は、Hello 〇〇!と返されます）

@GetMappingというアノテーションを記述することで、そのURLでアクセスされた時にメソッドが呼ばれるようになります。
今回は、http://localhost8080/hello とアクセスされた時にhelloメソッドが呼ばれるようになっています。

@RequestParamというアノテーションを記述することで、URLのクエリパラメータを受け取る事が出来ます。
今回は、?name=〇〇とアクセスすると、〇〇に入った値が変数nameに格納されるようになっており、何も指定がない場合は、Worldが格納されます。

#3.実行してみよう！

ターミナルでこのプロジェクトファイルがあるフォルダーに移動します。
そして`./mvnw spring-boot:run`を入力して実行します。

```terminal:ターミナル
$ ./mvnw spring-boot:run

[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------------< com.example:demo >--------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] >>> spring-boot-maven-plugin:2.3.1.RELEASE:run (default-cli) > test-compile @ demo >>>

〜省略〜

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.1.RELEASE)

2020-06-30 11:41:46.106  INFO 64839 --- [           main] com.example.demo.DemoApplication         : Starting Demo

〜省略〜
```

　と表示されたら成功です！

http://localhost:8080/hello にアクセスしてみてください。

![スクリーンショット 2020-06-30 11.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/8f570061-fef3-e74d-1c27-e2a7fd1d8f62.png)

Hello World!と表示されていますね。変数nameにはWorldが入っているからです。

では次に以下のように、URLのhelloの後ろに、`/?name=任意の文字列` を追加してみてください。
http://localhost:8080/hello/?name=tanaka

そしてEnterを押すと、
![スクリーンショット 2020-06-30 11.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/ad42ee4c-5653-8a29-dba5-c0f124f84d06.png)

Hello tanaka!と表示されていますね。変数nameにはtanakaが入っているからです。


#終わりに

今回は公式を参考にゆっくりと進めて行き、Webアプリケーションの土台を作成する事が出来ました。
ご自身でコードを変更してはブラウザで確認するといった学習にご活用いただければと思います。