Spring Boot Webサービスで Hello World する

# Spring Boot Webサービスで Hello World する

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 24.04 で Spring Boot Web アプリケーションを作成して Hello World を出力する方法を紹介します。
![spring-boot_on_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/3f469619-291f-a9fc-26bf-532f87355299.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

ローカル環境の Ubuntu で、Spring Boot Web サービスの JAR ファイル形式のアプリを起動します。

**JAR ファイル形式のアプリを起動**
```mermaid
flowchart LR
    terminal --> app[app.jar]
    subgraph Ubuntu
        subgraph JVM
            subgraph app[app.jar]
                tomcat
            end
        end
    end
style Ubuntu fill:#FFBCA4, stroke:#E0460F
style JVM fill:#DCFFDC, stroke:#2F872F
style app fill:#ECECFF, stroke:#9674DC
style tomcat fill:#FFFFDE, stroke:#B4AE43
```

|要素|概要|
|:--|:--|
|terminal|ターミナル|
|Ubuntu|OS|
|JVM|Java 実行環境|
|app.jar|Java アプリケーション|
|tomcat|Web サーバー|

## 技術トピック

### Spring Boot とは？  

<details>
<summary>こちらを展開してご覧いただけます。</summary>

### [Spring Boot](https://spring.pleiades.io/spring-boot/docs/2.7.8/reference/html/getting-started.html#getting-started)

:::note info
Spring Boot は、Java で Web アプリケーションを開発するためのフレームワークの一つで、Spring Framework をベースにしたライブラリの集合体です。
:::

|特徴|
|:--|
|設定が簡単で、コードを書くだけで Web アプリケーションを作成できます。|
|アプリケーションの自動構成や自動検出などの自動化された機能を備えています。|
|Spring Framework の依存関係を自動的に解決するため、開発者はライブラリの管理に時間を費やすことがありません。|
|多様なデータソースやセキュリティ機能などの多くのライブラリをサポートしているため、柔軟性が高く、多くの用途に使えます。|
|アプリケーションをマイクロサービスとして実行するための Spring Cloud という拡張も提供されています。|

|メリット|
|:--|
|開発者はアプリケーションのビジネスロジックに集中でき、煩雑な設定やセットアップに時間を費やすことがなくなります。|
|Spring Boot の自動化された機能により、開発者はコードをより迅速に開発し、より迅速に反復してビルド、テスト、デプロイを行うことができます。|
|柔軟性が高く、豊富なライブラリを備えているため、多様な用途に対応できます。|
|Spring Cloud を使用することで、アプリケーションをマイクロサービスとして実行するための拡張機能を提供し、スケーラビリティと堅牢性を向上できます。|

</details>

## 開発環境

+ Windows 11 Home 23H2 を使用しています。

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  
:::

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/cd0c4a607d451dbf5430)

```sh
> wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/cd0c4a607d451dbf5430)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04 LTS
Release:        24.04
Codename:       noble
```

Java JDK [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/4d11e94a2389758759cd)

```sh
$ java -version
openjdk version "11.0.23" 2024-04-16
OpenJDK Runtime Environment (build 11.0.23+9-post-Ubuntu-1ubuntu1)
OpenJDK 64-Bit Server VM (build 11.0.23+9-post-Ubuntu-1ubuntu1, mixed mode, sharing)
```

Maven [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/f4cdc4039158153365fb)

```sh
$ mvn -version
Apache Maven 3.8.7
Maven home: /usr/share/maven
Java version: 11.0.23, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.15.153.1-microsoft-standard-wsl2", arch: "amd64", family: "unix"
```

</details>

:::note warn
この記事では基本的に Ubuntu のターミナルで操作を行います。**Vim を使用してコピペする方法**を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
:::

https://qiita.com/studio_meowtoon/items/7771ad48676926e41463

## 作成する Web アプリケーションの仕様

|No|エンドポイント|HTTPメソッド|MIME タイプ|
|:--|:--|:--|:--|
|1|/api/data|GET|application/json|

:::note info
**/api/data** というエンドポイントに対して HTTP GET リクエストを送信すると、JSON データがレスポンスされるシンプルな Web サービスを実装します。
**{"message":"Hello World!"}**
:::

## Hello World を表示する手順

### プロジェクトの作成

プロジェクトフォルダを作成します。  
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。

```sh
$ mkdir -p ~/tmp/hello-spring-boot
$ cd ~/tmp/hello-spring-boot
```

### アプリケーションクラスの作成

アプリケーションクラスを作成します。

```sh
$ mkdir -p src/main/java/com/example/springboot
$ vim src/main/java/com/example/springboot/Application.java
```

ファイルの内容

```java:Application.java
package com.example.springboot;

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

@SpringBootApplication
public class Application {

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

<details>
<summary>説明を開きます。</summary>

:::note info
Spring Boot を使用して Web アプリケーションを作成するため Application クラスを作成しています。  

@SpringBootApplication アノテーションは、Spring Boot の自動設定を有効にするために必要です。これにより、Spring Boot はクラスパスに基づいて自動的に必要な設定を検出し、アプリケーションを自動構成します。  

main メソッドはアプリケーションを起動するために必要なもので、SpringApplication.run() メソッドを呼び出して、Application クラスを渡します。このメソッドは、Spring Boot アプリケーションを起動し、必要な設定をロードし、アプリケーションを実行します。  

また、このコードは Spring Boot アプリケーションを起動するための最小限のコードであり、アプリケーションの構成やルーティングのような詳細な設定は、別途追加する必要があります。  
:::

</details>

### コントローラークラスの作成

コントローラークラスを作成します。

```sh
$ mkdir -p src/main/java/com/example/springboot/controller
$ vim src/main/java/com/example/springboot/controller/HelloController.java
```

ファイルの内容

```java:HelloController.java
package com.example.springboot.controller;

import java.util.Map;

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

@RestController
@RequestMapping("/api")
public class HelloController {

    @GetMapping("/data")
    public Map<String, String> getData() {
        Map<String, String> map = Map.of("message", "Hello World!");
        return map;
    }
}
```

<details>
<summary>説明を開きます。</summary>

:::note info
Spring Boot アプリケーションにおける REST API エンドポイントを定義するためのクラスを作成しています。  

@RestController アノテーションが付与された HelloController クラスを定義しています。 @RestController アノテーションは、クラスが RESTful なエンドポイントを定義することを示します。  

@RequestMapping アノテーションは、HTTP リクエストに応じてこのエンドポイントに到達するための URL パスを定義します。この場合、リクエストパスは **/api** エンドポイントにマッピングされます。  

@GetMapping アノテーションが付与された getData メソッドは、HTTP GETリクエストが **/data** エンドポイントに送信されたときに、Map 型のオブジェクトを返します。  

Map オブジェクトは、キーと値のペアを格納するデータ構造で、この場合は "message" というキーに "Hello World!" という文字列を関連付けています。  

返された Map オブジェクトは JSON 形式でシリアル化され、HTTP レスポンスのボディに埋め込まれます。  

このコードを実行すると、**/api/data** への GET リクエストが受信され、"Hello World!" という JSON レスポンスを返します。  
:::

</details>

### pom.xml の作成

pom.xml ファイルを作成します。

```sh
$ vim pom.xml
```

ファイルの内容

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>hello-spring-boot</artifactId>
    <version>1.0</version>
    <name>hello-spring-boot</name>

    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
```

<details>
<summary>説明を開きます。</summary>

:::note info
Maven プロジェクトのプロジェクトオブジェクトモデル (POM) です。プロジェクトの情報、依存関係、ビルド設定などが含まれています。

各項目は以下のとおりです。

|項目|内容|
|:--|:--|
|groupId|プロジェクトのグループIDを定義します。|
|artifactId|プロジェクトのアーティファクトIDを定義します。|
|version|プロジェクトのバージョンを定義します。|
|dependencies|依存関係のリストを定義します。この例では、Spring Boot の Web スターターを含む **spring-boot-starter-web** が定義されています。|
|build|プロジェクトのビルド設定を定義します。この例では、ビルド時に Spring Boot の **spring-boot-maven-plugin** を使用することが指定されています。また、finalName を定義しています。これは、生成されるアプリケーションのファイル名に使用されます。|

なお、この POM の中には**親 POM** が指定されており、**Spring Boot の依存関係を自動的に管理**するための設定が含まれています。
:::

</details>

### プロジェクトの構成

プロジェクトのファイル構成を表示してみます。

```sh
$ tree
.
├── pom.xml
└── src
    └── main
        └── java
            └── com
                └── example
                    └── springboot
                        ├── Application.java
                        └── controller
                            └── HelloController.java
```

<details>
<summary>説明を開きます。</summary>

|No|ファイル|内容|
|:--|:--|:--|
|1|pom.xml|Maven プロジェクトの設定ファイルであり、プロジェクトの依存関係やビルド設定を定義します。|
|2|Application.java|Spring Boot アプリケーションのエントリーポイントであり、アプリケーションの起動時に実行されます。主に、アプリケーションの設定や構成、Spring のコンポーネントスキャンを行うために使用されます。|
|3|HelloController.java|Spring MVC アプリケーションのコントローラーであり、HTTP リクエストを受信し、それに対するレスポンスを返します。特定の URL パスにマッピングされたメソッドを提供し、クライアントとの間でデータの受け渡しを行うために使用されます。|

:::note info
Spring Boot アプリを構成するために作成したファイルは、今回の例では3つだけです。これらのファイルを組み合わせることで、Spring Boot アプリケーションを構築することができます。
:::

</details>

### アプリを起動

アプリを起動します。  
※ アプリを停止するときは ctrl + C を押します。

```sh
$ mvn spring-boot:run
```

<details>
<summary>説明を開きます。</summary>

:::note info
**spring-boot:run** このコマンドは、Maven を使って Spring Boot アプリケーションをビルドし、ビルドされたアプリケーションを実行します。ビルドが完了した後、Spring Boot が埋め込み Tomcat サーバーを起動し、Web アプリケーションを実行します。つまり、Spring Boot アプリケーションを**ローカルで実行するためのコマンド**です。
:::

</details>

:::note info
ここまでの手順で、Spring Boot アプリを開発モードで起動することができました。
:::

### アプリの動作確認

別ターミナルから curl コマンドで確認します。

```sh
$ curl -v http://localhost:8080/api/data -w '\n'
```

出力

```sh
* Host localhost:8080 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
*   Trying [::1]:8080...
* Connected to localhost (::1) port 8080
> GET /api/data HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Sun, 14 Jul 2024 11:21:30 GMT
<
* Connection #0 to host localhost left intact
{"message":"Hello World!"}
```

:::note info
ここまでの手順で、ターミナルに **{"message":"Hello World!"}** と表示され、**JSON データ**を取得することが出来ました。
:::

### アプリのビルド

Java アプリをビルドします。  
※ target/app.jar が作成されます。

```sh
$ mvn clean package
```

実行します。  
※ アプリを停止するときは ctrl + C を押します。

```sh
$ java -jar target/app.jar
```

:::note info
ここまでの手順で、Spring Boot アプリの JAR ファイルをビルド・起動することができました。
:::

## まとめ

Ubuntu に構築したシンプルな Java 開発環境で、Spring Boot Web サービスを実行することができました。

:::note warn
実際の業務での Spring Boot の使用ケースでは、構成ファイルなどが追加されるため、ここで示したようなシンプルな構成とは異なる場合があります。しかしながら、最小構成の例を学ぶことで、Spring Boot がどのような構成が必要なのかを理解することができます。
:::

どうでしたか？ WSL Ubuntu で、Spring Boot Web アプリケーション開発環境を手軽に構築することができます。ぜひお試しください。今後も Java の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

## 推奨コンテンツ

https://qiita.com/studio_meowtoon/items/9c07e20b4124d8c5f972

## 関連記事

他の **REST API フレームワーク**と比較してみましょう！

https://qiita.com/studio_meowtoon/items/de843e5ce499825bd13d