Spring Boot プロジェクト作成ワークショップ
このワークショップについて
やること
JSON を返却するミニマムな API を例に、プロジェクト構成・作り方について説明します。
- プロジェクトの作り方(Spring Initializr)
- シンプルな API の実装
- DI について
- bean について
- Controller -> Service -> Util と呼び出す API 構成
- application.yaml の機能いろいろ
- プロファイル
- 環境変数読み込み
- jar デプロイ
やらないこと
- 認証(Spring Security)
- DB アクセス
事前準備
- JDK 21 以上がインストールされていること
- Maven がインストールされていること
- curl コマンドが使えること
プロジェクトの作成
- Spring Initializr にアクセス
- 以下のように設定して「Generate」をクリック
- Project: Maven Project
- Language: Java
- Spring Boot: 4.0.0 (最新安定版)
- Project Metadata
- Group: dev.mikoto2000.workshop
- Artifact: projectcreate
- Name: projectcreate
- Package name: dev.mikoto2000.workshop.projectcreate
- Packaging: Jar
- Java: 21
- Dependencies:
- Spring Web
- Spring Boot DevTools
- Lombok
- ダウンロードした zip ファイルを解凍
各依存関係の説明
- Spring Web: Web アプリケーションを作成するための基本的な機能を提供。RESTful API の作成に必要なライブラリが含まれる
- Spring Boot DevTools: 開発効率を向上させるためのツール。コード変更時の自動再起動やライブリロード機能を提供
- Lombok: ボイラープレートコード(getter/setter、コンストラクタなど)を自動生成するためのライブラリ。コードの可読性と保守性を向上させる
プロジェクトの構成
プロジェクトのディレクトリ構成は以下のようになります。
各ファイル・ディレクトリの説明
src/main/java: Java ソースコードを配置するディレクトリsrc/main/resources: アプリケーションの設定ファイルや静的リソースを配置するディレクトリsrc/test/java: テストコードを配置するディレクトリpom.xml: Maven のプロジェクト設定ファイル。依存関係やビルド設定が記述されているREADME.md: プロジェクトの説明や使用方法を記述するファイル.gitignore: Git で管理しないファイルやディレクトリを指定するファイルmvnw/mvnw.cmd: Maven Wrapper スクリプト。Maven がインストールされていない環境でもプロジェクトをビルドできるようにする
エンドポイントを作る
設計
- エンドポイント:
/api/calc-age?birthDay=1990-01-01 - HTTP メソッド: GET
- クエリパラメータ:
birthDay(ISO 8601 形式の生年月日、例: 1990-01-01) - レスポンス形式: JSON
- レスポンス内容:
{ "age": 33 }(現在の年齢)
実装手順
1. DTO の作成
src/main/java/dev/mikoto2000/workshop/projectcreate/calcage/dtoディレクトリにCalcAgeResponse.javaファイルを作成- 以下のコードを
CalcAgeResponse.javaに追加
2. Service クラスの作成
src/main/java/dev/mikoto2000/workshop/projectcreate/calcage/serviceディレクトリにCalcAgeService.javaファイルを作成- 以下のコードを
CalcAgeService.javaに追加
@Service とは
@Serviceアノテーションは、Spring Framework においてサービス層のクラスを示すために使用される- サービス層は、ビジネスロジックを実装する場所であり、コントローラー層とデータアクセス層の間の仲介役
@Serviceアノテーションを付与することで、依存性注入(DI)によって他のクラスから利用できるようにする- (依存性注入(DI)によって他のクラスから利用できるクラス = Bean)
Bean とは
- Spring コンテナによって管理されるオブジェクトのこと
@Serviceアノテーションを使用することで、CalcAgeServiceクラスが Spring の Bean として登録される- これにより、他のクラスから
CalcAgeServiceを注入して利用できるようになる - Spring はアプリケーションの起動時に Bean をスキャンし、必要に応じてインスタンスを生成・管理する
@Controller、@Repository、@Componentなどのアノテーションも同様に Bean を定義する(Spring にインスタンスを管理してもらう)ために使用される
3. コントローラークラスの作成
src/main/java/dev/mikoto2000/workshop/projectcreate/calcage/controllerディレクトリにCalcAgeController.javaファイルを作成- 以下のコードを
CalcAgeController.javaに追加
@RestController とは
@RestControllerアノテーションは、Spring Framework において RESTful Web サービスのコントローラークラスを示すために使用される- クライアントからの HTTP リクエストを受け取り、適切なサービスメソッドを呼び出してレスポンスを生成する役割を果たす
DI(Dependency Injection)について
@Autowiredアノテーションを使用して、Spring コンテナからCalcAgeServiceのインスタンスを自動的に注入- これを依存性注入(Dependency Injection, DI)と呼ぶ
- これにより Spring が管理する Bean として
CalcAgeServiceを利用できるようになる CalcAgeServiceのインスタンスは、Spring が管理するため、コード内で直接インスタンス化する必要がない- また、DI により、テスト時にモックオブジェクトを注入することも容易になる
Spring が管理する Bean 工場からインスタンスを貰い受けて利用するイメージ。
ステップアップ Tips
- コンストラクタの
@Autowiredは省略可能 - Lombok の
@RequiredArgsConstructorと組み合わせるとさらにコードを簡潔にできる
プロジェクトの実行
- ターミナルを開き、プロジェクトのルートディレクトリに移動
- 以下のコマンドを実行してアプリケーションを起動
- ブラウザまたは curl コマンドでエンドポイントにアクセス
アプリケーションの設定
application.yaml の作成
src/main/resourcesディレクトリからapplication.propertiesを削除し、application.yamlファイルを作成- 以下のコードを
application.yamlに追加 - 以下のコードを
application-local-logging.yamlに追加 - 以下のコードを
application-prod-logging.yamlに追加
これにより、 src/main/resources ディレクトリの構成は以下のようになります。
プロファイルの切り替え
プロファイルが active: local と設定されているため、デフォルトではアプリケーション起動時に application-local-logging.yaml の設定が適用され、ログレベルが DEBUG に設定される。
起動時に、例えば prod プロファイルを指定すると、 application-prod-logging.yaml の設定が適用され、ログレベルが WARN に設定される。
環境変数の利用
application.yaml で server.port が ${CREATEPROJECT_SERVER_PORT:8080} と設定されているため、環境変数 CREATEPROJECT_SERVER_PORT が設定されていればその値がポート番号として使用され、設定されていなければデフォルトで 8080 が使用される。
まとめ
このように、Spring Boot では application.yaml を使用してアプリケーションの設定を柔軟に管理できる。
プロファイルを活用することで、開発環境と本番環境で異なる設定を簡単に切り替えることができる。
また、環境変数を利用することで、デプロイ先の環境に応じた設定を動的に変更することが可能となる。
DB やクラウドのエンドポイントなど、環境ごとに異なる設定が必要な場合に特に有用です。
例えば、以下のように環境依存の要素ごとにファイルを分けることもできる。
アプリケーションのビルドとデプロイ
- ターミナルを開き、プロジェクトのルートディレクトリに移動
- 以下のコマンドを実行してアプリケーションをビルド
- ビルドが成功すると、
targetディレクトリにprojectcreate-0.0.1-SNAPSHOT.jarファイルが生成される - 以下のコマンドを実行してアプリケーションを起動(デフォルトプロファイル(local))
- ブラウザまたは curl コマンドでエンドポイントにアクセス
プロファイルを指定して起動する場合は、以下のように --spring.profiles.active オプションを使用する。
これにより、 prod プロファイルが有効になり、 application-prod-logging.yaml の設定が適用される。
local で起動した場合と、 prod で起動した場合で、ログレベルが異なることを確認できる。
まとめ
このワークショップでは、Spring Boot を使用してシンプルな JSON API を作成する方法を学びました。 プロジェクトの作成からエンドポイントの実装、設定ファイルの管理、そしてアプリケーションのビルドとデプロイまでの一連の流れを理解できたと思います。 これらの基本的な知識を活用して、より複雑なアプリケーションの開発に挑戦してみてください。