Spring Boot サンプルアプリケーション
このプロジェクトは、Spring Bootを使用したWebアプリケーションのバックエンド実装サンプルです。 ドメイン駆動設計 (DDD) とオニオンアーキテクチャを採用し、堅牢で保守性の高いコードベースを目指しています。
- 言語: Java 17
- フレームワーク: Spring Boot 3.x
- ビルドツール: Gradle
- アーキテクチャ: Onion Architecture, DDD
- データベース: PostgreSQL
- マイグレーション: Flyway
- ORM: MyBatis
開発を始めるための手順です。
- Java 17 以上がインストールされていること
- Docker および Docker Compose がインストールされていること
-
データベースと監視ツールの起動 ローカル開発環境用のデータベース (PostgreSQL) と監視ツール (Prometheus) を起動します。
docker compose up -d
-
アプリケーションの起動 Gradleラッパーを使用してアプリケーションを起動します。
./gradlew bootRun
起動後、
http://localhost:8080でアクセス可能です。
日々の開発で使用する主なGradleタスクの説明です。
このプロジェクトでは、テストの粒度や目的に応じて複数のタスク定義しています。
| タスク名 | 説明 | 実行コマンド |
|---|---|---|
test |
単体テストを実行し、単体テストのカバレッジレポートを生成します。外部依存(DBなど)を含まないテストです。 | ./gradlew test |
integrationTest |
統合テストを実行します。DBなどの外部リソースと接続して動作確認を行います。 | ./gradlew integrationTest |
fitnessTest |
適応度関数テスト (ArchUnit) を実行します。パッケージ依存関係などのアーキテクチャルールを守れているかチェックします。 | ./gradlew fitnessTest |
e2eTest |
E2Eテスト (Cucumber) を実行します。Gherkinで記述された自然言語シナリオを実行し、エンドツーエンドの動作を確認します。実行後、Cluecumberレポートが生成されます。 | ./gradlew e2eTest |
allTest |
**全テスト(単体・結合)**を実行し、統合されたカバレッジレポートを生成します。 | ./gradlew allTest |
コードの品質を保つために、以下の静的解析ツールを導入しています。
- Spotless: コードフォーマットの統一
- Checkstyle: コーディング規約のチェック (Google Checks準拠)
- SpotBugs: バグの可能性の検知
- PMD: 不要なコードや非効率な記述の検知
これらのチェックを一括で行うには、以下のコマンドを実行します。
./gradlew checkコミット前には必ずこのコマンドを実行し、エラーがないことを確認してください。
コードのフォーマットを自動修正するには、以下のコマンドを実行します。
./gradlew spotlessApplypsql -h localhost -p 5432 -U sampleapp sampleapp
Flywayを使用してデータベースの管理を行います。 Gradleプラグインは現在環境依存の問題があるため、Dockerイメージを使用した実行方法を推奨します。
| タスク名 | 説明 | 実行コマンド |
|---|---|---|
flywayMigrate |
DBマイグレーションを実行します。 | bootRun時に自動実行されます。手動の場合は下記参照。 |
flywayClean |
DBの全テーブル・オブジェクトを削除(ドロップ)します。 | 下記コマンド参照 |
flywayInfo |
現在の適用状況を確認します。 | 下記コマンド参照 |
手動実行コマンド (Docker使用)
プロジェクトルートで実行してください。
マイグレーション (Migrate)
docker run --rm --network host -v $(pwd)/src/main/resources/db/migration:/flyway/sql flyway/flyway:11 -url=jdbc:postgresql://localhost:5432/sampleapp -user=sampleapp -password=password migrate全削除 (Clean)
docker run --rm --network host -v $(pwd)/src/main/resources/db/migration:/flyway/sql flyway/flyway:11 -url=jdbc:postgresql://localhost:5432/sampleapp -user=sampleapp -password=password -cleanDisabled=false clean状況確認 (Info)
docker run --rm --network host -v $(pwd)/src/main/resources/db/migration:/flyway/sql flyway/flyway:11 -url=jdbc:postgresql://localhost:5432/sampleapp -user=sampleapp -password=password infodocker run --rm --network host -v $(pwd)/src/main/resources/db/migration:/flyway/sql flyway/flyway:11 -url=jdbc:postgresql://localhost:5432/sampleapp -user=sampleapp -password=password infoCucumberを使用したE2Eテストの実施方法について説明します。
-
テストの実行
./gradlew e2eTest
-
レポートの確認 (Cluecumber) テスト完了後、以下のパスにHTML形式の詳細レポートが生成されます。
build/reports/cluecumber/index.htmlブラウザで開くことで、シナリオごとの実行結果や統計情報を確認できます。
-
テストの書き方
- シナリオ (Featureファイル):
src/e2eTest/resources/features配下に.featureファイルを作成し、Gherkin記法でシナリオを記述します。 - ステップ定義 (Step Definitions):
src/e2eTest/java/com/example/samplebootapp/e2e配下のJavaクラスで、Cucumberのアノテーション (@Given,@When,@Then等) を使用してステップの実装を行います。
- シナリオ (Featureファイル):
開発環境 (dev プロファイル) では、OpenAPI (Swagger UI) を利用してAPI仕様を確認・実行できます。
- Swagger UI (画面): http://localhost:8080/swagger-ui.html
- ブラウザでAPI仕様の閲覧や、実際のリクエスト送信が可能です。
- OpenAPI YAML定義: http://localhost:8080/v3/api-docs.yaml
- API仕様のYAMLファイルを取得できます。自動生成ツールなどに取り込む際に利用します。
- OpenAPI JSON定義: http://localhost:8080/v3/api-docs
Note
本番環境 (prod プロファイル) では、セキュリティのためこれらのエンドポイントは無効化されています。
Prometheusを使用してアプリケーションの稼働状況を確認できます。
- 上記「起動手順」に従い、
docker compose up -dと./gradlew bootRunを実行してください。 - ブラウザで http://localhost:9090 にアクセスします。
- Status > Targets メニューで、
spring-boot-appの State がUPになっていることを確認してください。 - Graph タブでメトリクス名(例:
http_server_requests_seconds_count)を入力してExecuteを押すと、グラフや値を確認できます。
コードの変更をHotSpotの確認を行うには、(git-truck)[https://github.com/git-truck/git-truck] を使う。 git-truckを使うには、事前にnpmをインストールしておく必要がある。
git-truckのインストールコマンドは以下の通り。
npm install -g git-truckgit-truckの使用方法は以下の通り。
git truck上記のコマンドを実行すると、ブラウザにgit-truckのUIが表示されます。
主なディレクトリの役割です。
src/main/java: プロダクションコードcom.example.samplebootappdomain: ドメイン層 (ビジネスロジック、エンティティ)usecase: ユースケース層 (アプリケーションロジック)infrastructure: インフラストラクチャ層 (DBアクセス、外部API連携)presentation: プレゼンテーション層 (Web API コントローラー)
src/test/java: 単体テストコードsrc/integrationTest/java: 統合テストコードsrc/fitnessTest/java: アーキテクチャテストコードsrc/e2eTest/java: E2Eテストコード (Cucumber Step Definitions)src/e2eTest/resources: E2Eテストリソース (Cucumber Features)doc: プロジェクトのドキュメント (API仕様、アーキテクチャ詳細など)docker: Docker関連の設定ファイル