Sprint Bootの環境を構築したときのメモ

# 背景・目的
今まで、Sprint Bootについてあまり触ってきませんでした。どのような特徴があるのかを[ドキュメント](https://spring.io/projects/spring-boot)を基に整理しようと思います。

# まとめ
下記に特徴をまとめます

|特徴|説明|
|:--|:--|
|Spring Boot|Springを使ったアプリケーションを高速開発するためのもの<BR>SpringのFramworkを駆使したアプリケーションを素早く作成できる|
|Spring | Springのコア部分|

# 概要
[Sprint Boot](https://spring.io/projects/spring-boot)を基に整理します。

- Spring Bootを使用すると、製品グレードのSpringベースのアプリケーションがすぐに作成できる
- 最小限の労力で始めることができる
- ほとんどのSpring Bootアプリは、最小限のSpring構成が必要

## 特徴
- スタンドアロンのSpring アプリケーションを作成する
- WARファイルは、不要。Tomcat、Jetty、Undertowを直接組み込んでいる
- シンプルなビルド設定を抵抗するために、「Stater」と呼ばれる依存関係を提供
- Springご3rd Party ライブラリーを可能な限り自動で構成する
- メトリクス、ヘルスチェック、外部構成などプロダクトレベルの機能を提供する
- コード生成は一切不要で、XMLの構成も不要

### Spring Bootのアプリケーション開発
下記に大別されます。
- Spring Boot CLI
    - Spring Bootを使うためのCLI
- Spring Boot Suite
    - Spring の専用開発ツール
    - VSCode用が用意されている
- Spring Initializer
    - Spring InitalizerはWebサイト
    - ここで作成するアプリの設定を行うと、そのプロジェクトをダウンロードできる

### Spring Bootのプロジェクトの基本構成
Mavenの場合は、下記のとおりとなります。
```
src         // ソースファイル等が配置される
|---main
|     |--- java  // Javaコードを配置する
|     |--- resource // アプリケーションに必要な、ファイルを配置する
|             |----- static //　静的ファイルを配置する。例）CSS、HTML、JS等
|             |----- template // テンプレートファイルを配置
|             |----- application.properties
|---test
target      // 作成されるアプリケーションファイル等が配置される
```

## Springについて
そもそも、Springについても知識を持ち合わせていないので、整理します。
### Why Spring
[Why Spring](https://spring.io/why-spring)を基に整理します。

- Springは、Javaプログラミングを迅速に、簡単に、安全に誰でも作れる
- Springは、スピード、シンプルさ、生産性にフォーカスした世界で最も一般的なJava Framework

#### Spring is everywhere
- Springの柔軟なライブラリは、世界中の開発者から信頼されている
- Springは、何百万ものエンドユーザに素晴らしい体験を提供している
- Springは、Alibaba、Amazon、Google 、MS等のビッグテックからの貢献もある


#### Spring is flexible
- Springは、柔軟で包括的な拡張機能と3rd Partyのライブラリにより開発者は、ほとんどのアプリケーションを開発できる
- Spring FrameworkのコアとなるInversion of Control (IoC) and Dependency Injection (DI)の機能は、幅広い範囲の機能と関数を提供する
- セキュア、リアクティブ、クラウドベースのWebのマイクロサービス、企業向けの複雑なストリーミングであれ、Springは役立つツールを保持している

#### Spring is productive
- Spring BootはJavaプログラミングのタスクへのアプローチを変えて、体験を革新的に変える
- Spring BootとSpring Cloudの豊富なサポートライブラリ、サーバ、パターン、テンプレを組み合わせて、マイクロサービスベースのアーキテクチャ全体をデプロイする

#### Spring is fast
- デフォルトで高速起動、高速シャットダウン、最適化された実行が実現する

#### Spring is secure
- セキュリティ問題に迅速かつ責任を持って対処してきた
- Springのコミッターはセキュリティ専門家と協力し、報告された脆弱性を修正してテストする

#### Spring is supportive
- コミュニティは大きく、グローバル、多様性

### What Spring can do?
- マイクロサービス
    - 独立している
    - 本番環境レベルの機能を迅速に提供する
- Reactive
    - 非同期非ブロッキングアーキテクチャ
- Cloud
    - プラットフォームに関係なくサービスを接続して拡張する
- Web apps
    - あらゆるデータストアに接続された高速で安全かつ応答性の高いWebアプリケーションのためのフレームワーク
- サーバレス
    - 需要に応じて、スケールアップする
- Event Driven
    - ビジネスイベントに反応する
    - ストリーミングデータに基づいてリアルタイムに操作する
- Batch
    - 自動化されたタスク

## Maven
### pom.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>3.3.1</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>sampleapp</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>sampleapp</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

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

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
```

### project
- 基本的な情報。変更することはありません
- ルートになります
#### parent
- pom.xmlの継承に関する設定
- Mavenでは、既にあるpom.xmlを継承して、新たに作成できる
- 上記の例では、org.springframework.bootのspring-bbot-starter-parentのpomが継承されている

#### properties
- ビルドに必要な設定を記載する
- 上記の例では、java.versionの17を指定している


#### dependencies
- プロジェクトで利用するライブラリ等の情報を記載する
- さらに下記を記載する
    - groupId
        - 上記では、下記が指定されている
            - org.springframework.boot
                - Webアプリを作成する際に必要となる
            - spring-boot-starter-test
                - ユニットテストに関するライブラリ
    - artifactId
    - version
    - scope

#### modelVersion
- Mavenのバージョン

#### groupId
- グループIDのタグ
#### artifactId
- アーティファクトID

#### version
- バージョン名のタグ

#### name
- プロジェクト名

#### description
-　説明

#### buildとplugins
- プログラムのビルド時に利用される機能などの情報
- 上記では、下記が指定されている
    - org.springframework.boot
    - spring-boot-maven-plugin

# 実践
## 前提
下記を利用しています。
- Mac
- VSCode
- Homebrew

## 環境の準備
### JDKのインストール
JDKは、Amazon Corretto 17をインストールします

1. [Amazon Corretto JDKのインストーラー(https://docs.aws.amazon.com/ja_jp/corretto/)のページに遷移します
1. Corretto17の画面に遷移します
1. ナビゲーションペインで、「Downloads」をクリックします
1. Mac OSのインストーラーをダウンロードします
1. ダウンロードしたファイルをクリックします
1. インストーラーが起動するので、インストールします
1. 下記のコマンドを実行し、インストールを確認します
    ```
    $ /usr/libexec/java_home --verbose
    Matching Java Virtual Machines (1):
        17.0.11 (x86_64) "Amazon.com Inc." - "Amazon Corretto 17" /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
    /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
    $ 
    ```
1. 環境変数をセットします
    ```
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
    ```
1. バージョンを確認します
    ```
    $ java --version
    openjdk 17.0.11 2024-04-16 LTS
    OpenJDK Runtime Environment Corretto-17.0.11.9.1 (build 17.0.11+9-LTS)
    OpenJDK 64-Bit Server VM Corretto-17.0.11.9.1 (build 17.0.11+9-LTS, mixed mode, sharing)
    $
    ```
### Mavenのインストール
1. Homebrewでmavenをインストールします
    ```
    $ brew install maven
    ```
1. インストールの確認
    ```
    $ mvn -v 
    Apache Maven 3.9.8 (36645f6c9b5079805ea5009217e36f2cffd34256)
    Maven home: /usr/local/Cellar/maven/3.9.8/libexec
    Java version: 17.0.11, vendor: Amazon.com Inc., runtime: /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
    Default locale: ja_JP, platform encoding: UTF-8
    OS name: "mac os x", version: "14.5", arch: "x86_64", family: "mac"
    $ 
    ```

### VSCodeに Spring Boot Extension Packをインストール
1. VSCodeを起動します。
1. ナビゲーションペインで、「拡張機能」アイコンをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/13c4ae30-a4d2-a2c6-0475-6adb6ec5f857.png)
1. 検索ウインドウに 「Spring Boot Extension Pack」を入力し検索します
1. 対象プラグインを選択し、「インストール」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6283a333-81ea-c74a-539d-ef16f2e0e654.png" width=400 />

1. インストール後、VSCodeを再起動します

### Extension Pack for Javaをインストール
1. ナビゲーションペインで、「拡張機能」アイコンをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/13c4ae30-a4d2-a2c6-0475-6adb6ec5f857.png)
1. 検索ウインドウに 「Extension Pack for Java」を入力し検索します
1. 対象プラグインを選択し、「インストール」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f8bff809-bef5-94a1-cb4f-674e54261a92.png)

1. インストール後、VSCodeを再起動します

## 実装する
### プロジェクトの作成
1. VSCodeで「表示」＞「コマンドパレット」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/652ca1d3-f99e-7c96-2d36-ab3d1996ac50.png)

1. コマンドパレットの入力バーに「spring initializr maven」と入力し、選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aa7fa623-35f2-408a-b288-1b36d91f8fc3.png)
1. 最新バージョンの3.3.1を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bfa067c3-1f3b-f0eb-f979-e91f84bfe4b9.png)

1. 「Java」を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f9d2c783-4852-cb88-0239-c2d8993a617c.png)
1. GroupIdに「com.example」を入力（選択）し、Enterをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3a34925e-1407-d9d4-9381-a7074b111bed.png)

1. アーティファクトIDに「sampleapp」を入力し、Enterをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/236b6d15-f19f-8db0-e34d-0bb498dbcfbf.png)

1. パッケージ化に「Jar」を選択し、Enterをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8813ade7-d3e8-33ac-3008-ffca629ba294.png)

1. Javaのバージョンを「17」を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0c13bfc7-df8a-7982-1670-118217ac5634.png)

1. 「spring web」を入力し検索し、「Spring Web web」を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/da8466e6-19df-57ca-a076-99fc0c195c70.png)

1. 「Selected 1dependency」を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0177db7c-5892-e2cc-932f-a526bbc4ba0f.png)

1. 保存するためにダイアログが起動されるので、フォルダを選択し、「Generate into this folder」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5b55c42a-1878-3894-9a29-57730918e589.png)

1. VSCodeの「ファイル」＞「フォルダーをワークスペースに追加」をクリックし、作成されたフォルダを選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0a1adb9c-14df-de68-6cd0-4bb89825f774.png)

1. 追加されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2fdc7dff-c341-5619-ac93-bafa45076362.png)

1. JAVA PROJECTSにも追加されています
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7a720064-7cf6-a040-720a-703512a8cf92.png)

## Spring Boot Dashboard
1. ナビゲーションペインの「Spring Boot Dashboard」アイコンをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e456a930-a004-429c-ed2f-ecb1e3c8df54.png)

1. APPS、BEANS、ENDPOINT MAPPINGSが表示されます
1. APPSの「sampleAppApplication」を選択します
1. 下記のコードが表示されました
    ```
    package com.example.sampleapp;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SampleappApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SampleappApplication.class, args);
    	}
    
    }
    ```
1. APPSで「実行」ボタンをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/42a7fd36-c87a-6312-55f0-2cb61d1d19a4.png)
1. Spring が実行されました。
    ```
    $  cd /Users/XXXX/git/spring/sampleapp ; /usr/bin/env /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home/bin/java @/var/folders/0q/3t1v6lb91qj08tz8t9s
    qyp5m0000gn/T/cp_37dhc661wrdwo8a54ua9nys11.argfile com.example.sampleapp.SampleappApplication 
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
    
     :: Spring Boot ::                (v3.3.1)
    
    2024-07-09T22:29:17.845+09:00  INFO 14879 --- [sampleapp] [           main] c.e.sampleapp.SampleappApplication       : Starting SampleappApplication using Java 17.0.11 with PID 14879 (/Users/XXXX/git/spring/sampleapp/target/classes started by XXX in /Users/XXXX/git/spring/sampleapp)
    2024-07-09T22:29:17.848+09:00  INFO 14879 --- [sampleapp] [           main] c.e.sampleapp.SampleappApplication       : No active profile set, falling back to 1 default profile: "default"
    2024-07-09T22:29:18.625+09:00  INFO 14879 --- [sampleapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
    2024-07-09T22:29:18.637+09:00  INFO 14879 --- [sampleapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2024-07-09T22:29:18.637+09:00  INFO 14879 --- [sampleapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.25]
    2024-07-09T22:29:18.679+09:00  INFO 14879 --- [sampleapp] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2024-07-09T22:29:18.680+09:00  INFO 14879 --- [sampleapp] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 787 ms
    2024-07-09T22:29:18.979+09:00  INFO 14879 --- [sampleapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
    2024-07-09T22:29:18.988+09:00  INFO 14879 --- [sampleapp] [           main] c.e.sampleapp.SampleappApplication       : Started SampleappApplication in 1.468 seconds (process running for 7.057)
    
    ```
### サンプルコードの解説
#### アノテーション
- アノテーションを付与することで、Spring Bootで起動するアプリケーションと認識し、必要な設定ファイルなどを自動的に組み込んでくれます
    ```
    @SpringBootApplication
    ```
#### SpringApplicationクラス
- SpringApplicationクラスは、Spring Bootアプリケーションの基本的なクラス
- 引数に、実行クラスのClassインスタンスと、パラメータを渡す
    ```
    SpringApplication.run(SampleappApplication.class, args);
    ```
# 考察
今回、Spring Bootの特徴を簡単に整理し、環境構築してみました。今後も試してみたいと思います。

# 参考
https://spring.io/projects/spring-boot