Spring Boot プロジェクト作成ハンズオン
このハンズオンについて
やること
JSON を返却するミニマムな API を例に、プロジェクト構成・作り方について説明します。
- プロジェクトの作り方(Spring Initializr)
- シンプルな API の実装
- DI について
- bean について
- Controller -> Service と呼び出す API 構成
- application.yaml の機能いろいろ
- プロファイル
- 環境変数読み込み
- jar デプロイ
やらないこと
- 認証(Spring Security)
- DB アクセス
事前準備
- JDK 21 以上がインストールされていること
- curl コマンドが使えること
プロジェクトの作成
- Spring Initializr にアクセス
- 次のように設定して「Generate」をクリック
- Project: Maven
- Language: Java
- Spring Boot: 4.0.2 (最新安定版)
- Project Metadata
- Group: dev.mikoto2000.workshop
- Artifact: projectcreate
- Name: projectcreate
- Package name: dev.mikoto2000.workshop.projectcreate
- Packaging: Jar
- Configuration: YAML
- 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 のプロジェクト設定ファイル。依存関係やビルド設定が記述されている.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": 36 }(現在の年齢)
実装手順
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に追加
LocalDate.now() を直書きするのは本来 NG ですが、今回はシンプルな例を示す目的でこのようにしています。
実際には、テスト時に任意の日時を指定できる工夫が必須です。
(詳細は「Spring Boot テスト入門」参照。)
@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)について
CalcAgeControllerは、@RestControllerアノテーションにより、Spring によって管理されるコントローラークラスとして登録される- コンストラクタの仮引数と同型の
CalcAgeServiceに@Serviceアノテーションがついている - そのため、Spring コンテナから
CalcAgeServiceのインスタンスが自動的に注入される- これを依存性注入(Dependency Injection, DI)と呼ぶ
- コンストラクタがひとつだけの場合、
@Autowiredアノテーションを省略できる - これにより Spring が管理する Bean として
CalcAgeServiceを利用できるようになる CalcAgeServiceのインスタンスは、Spring が管理するため、コード内で直接インスタンス化する必要がない- また、DI により、テスト時にモックオブジェクトを注入することも容易になる
Spring が管理する Bean 工場からインスタンスを貰い受けて利用するイメージです。
プロジェクトの実行
- ターミナルを開き、プロジェクトのルートディレクトリに移動
- 次のコマンドを実行してアプリケーションを起動
- ブラウザまたは curl コマンドでエンドポイントにアクセス
アプリケーションの設定
これからアプリケーションの設定を進めます。 次の挙動ができるように設定ファイルを記述します。
- 待ち受けポートはデフォルト 8080, 環境変数があればその値で上書き
- ローカル環境ではログレベル DEBUG
- プロダクション環境ではログレベル INFO
application.yaml の作成
src/main/resources/application.yamlファイルを開くapplication.yamlを次のコードに置き換え- 次のコードを
application-local-logging.yamlに追加 - 次のコードを
application-prod-logging.yamlに追加
これにより、 src/main/resources ディレクトリの構成は次のようになります。
プロファイルの切り替えについて
プロファイルが active: local と設定されているため、デフォルトではアプリケーション起動時に application-local-logging.yaml が適用される。
起動時に、例えば prod プロファイルを指定すると、 application-prod-logging.yaml の設定が適用され、ログレベルが INFO に設定される。
実際に切り替える方法は、次の章の動作確認で説明します。
環境変数の利用
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 を作成する方法を学びました。 プロジェクトの作成からエンドポイントの実装、設定ファイルの管理、そしてアプリケーションのビルドとデプロイまでの一連の流れを理解できたはずです。 これらの基本的な知識を活用して、より複雑なアプリケーションの開発に挑戦してみてください。