Skip to content

アプリケーション開発環境セットアップ手順書

概要

本ドキュメントは、Case Study Cargo Tracker のアプリケーション開発環境をセットアップする手順を説明します。

テスト駆動開発(TDD)のゴールは 動作するきれいなコード です。それを実現するためには ソフトウェア開発の三種の神器 が必要です。

今日のソフトウェア開発の世界において絶対になければならない 3 つの技術的な柱があります。 三本柱と言ったり、三種の神器と言ったりしていますが、それらは

  • バージョン管理
  • テスティング
  • 自動化

の 3 つです。

— https://t-wada.hatenablog.jp/entry/clean-code-that-works


1. 前提条件

以下のツールがインストールされていることを確認してください。

ツール バージョン 確認コマンド
Java 25.x java -version
Gradle 9.x(Wrapper で自動取得) ./gradlew -v
Docker 24.x 以上 docker -v
Docker Compose 2.x docker compose version
Git 最新 git -v
Node.js 22.x LTS node -v
npm 10.x npm -v

Java のインストール

SDKMAN を使用すると複数バージョンの管理が容易です。

# SDKMAN のインストール
curl -s "https://get.sdkman.io" | bash

# Java 25 のインストール
sdk install java 25-open

# バージョン確認
java -version

公式サイトから直接ダウンロードする場合:

  • https://jdk.java.net/25/

Docker のインストール

Docker Desktop をインストールします。

  • Windows: https://docs.docker.com/desktop/install/windows-install/
  • macOS: https://docs.docker.com/desktop/install/mac-install/
# バージョン確認
docker -v

docker compose version

Node.js のインストール

コミット前の品質チェック(husky + lint-staged)と Gulp タスクランナーに Node.js が必要です。

  • https://nodejs.org/
# バージョン確認
node -v

npm -v

2. プロジェクトの取得

リポジトリのクローン

git clone https://github.com/k2works/case-study-cargo-tracker.git
cd case-study-cargo-tracker

Node.js 依存パッケージのインストール

npm install

Note: husky(Git Hooks)が prepare スクリプトで自動的にセットアップされます。


3. サブシステム一覧

Case Study Cargo Tracker は以下のサブシステムで構成されています。

システム ディレクトリ 説明 ポート (DB / App)
cargo-tracker apps/cargo-tracker 国際貨物輸送管理システム本体 5432 / 8080

4. 技術スタック

バックエンド

カテゴリ 技術 バージョン
言語 Java 25.x
フレームワーク Spring Boot 4.0.5
Web Spring MVC 7.x
セキュリティ Spring Security 7.x
ビルドツール Gradle 9.x(Groovy DSL)
O/R マッパー MyBatis 4.0.1 (mybatis-spring-boot-starter)
API ドキュメント springdoc-openapi (Swagger UI) 3.0.2
データベース(開発) H2 2.x(インメモリ、PostgreSQL 互換モード)
データベース(本番) PostgreSQL 16.x
マイグレーション Flyway 10.x
テスト JUnit 5 / Mockito 5 / AssertJ 3 5.x / 5.x / 3.x
統合テスト Testcontainers 1.20.4
Docker クライアント docker-java 3.7.0
API E2E テスト MockMvc + Testcontainers (PostgreSQL) -
アーキテクチャテスト ArchUnit 1.4.1
ブラウザ E2E テスト Playwright 1.44+
品質管理 Checkstyle / SpotBugs / JaCoCo -

フロントエンド

カテゴリ 技術 バージョン
テンプレートエンジン Thymeleaf 3.x
テンプレートセキュリティ thymeleaf-extras-springsecurity6 -
CSS フレームワーク Bootstrap 5.3.3
動的 UI htmx 2.0.4
Webjars ロケーター webjars-locator-lite 1.0.1

インフラストラクチャ

カテゴリ 技術
コンテナ Docker / Docker Compose
CI/CD GitHub Actions
タスクランナー Gulp 5.x(Node.js)

5. プロファイル構成

開発効率を高めるため、複数のプロファイルを使い分けます。

プロファイル データベース Docker 用途
default H2(インメモリ) 不要 日常開発・即座起動
product PostgreSQL 16 必要 本番互換テスト

default プロファイル(推奨:日常開発)

Docker なしで即座に起動できます。

cd apps/cargo-tracker
./gradlew bootRun

product プロファイル(本番互換)

# PostgreSQL コンテナを起動
docker compose up -d postgres

# product プロファイルで起動
cd apps/cargo-tracker
./gradlew bootRun --args='--spring.profiles.active=product'

6. 開発サーバーの起動

タスクランナー経由(推奨)

# 開発サーバー起動(default プロファイル)
npx gulp dev

# TDD モード(テスト自動再実行)
npx gulp tdd

# タスク一覧を表示
npx gulp --tasks

Gradle 直接実行

cd apps/cargo-tracker

# default プロファイルで起動
./gradlew bootRun

# TDD モード(テストを常に再実行)
./gradlew test --continuous

アクセス確認

サービス URL 説明
アプリケーション http://localhost:8080 メインアプリケーション
Swagger UI http://localhost:8080/swagger-ui/index.html API ドキュメント
H2 コンソール http://localhost:8080/h2-console データベース管理(default プロファイル)
ヘルスチェック http://localhost:8080/actuator/health ヘルスチェック
MkDocs http://localhost:8000 プロジェクトドキュメント

7. Docker Compose のセットアップ

データベースコンテナの起動

# PostgreSQL を起動
docker compose up -d postgres

# コンテナの状態確認
docker compose ps

Docker Compose の便利なコマンド

# PostgreSQL を起動
docker compose up -d postgres

# コンテナの停止と削除
docker compose down

# ログを確認
docker compose logs -f postgres

# PostgreSQL に接続
docker compose exec postgres psql -U cargo_tracker -d cargo_tracker

MkDocs ドキュメントサーバーの起動

# MkDocs サーバー起動(ポート 8000)
docker compose up -d mkdocs

# ブラウザでアクセス
# http://localhost:8000

8. テストの実行

全テスト実行

cd apps/cargo-tracker

# テスト実行(カバレッジレポート付き)
./gradlew test jacocoTestReport

テストの種類

テスト種別 ツール 説明 手順書
単体テスト JUnit 5 + Mockito ドメインロジック・ユースケースのテスト -
統合テスト JUnit 5 + Testcontainers PostgreSQL を使用した統合テスト -
API E2E テスト MockMvc + Testcontainers REST API・Controller の結合フロー検証 手順書
アーキテクチャテスト ArchUnit ヘキサゴナルアーキテクチャのレイヤー依存関係検証 -
ブラウザ E2E テスト Playwright ブラウザ自動テスト(UI・JS 含む) 手順書
# API E2E テストのみ実行
./gradlew test --tests "com.example.cargotracker.e2e.*"

# ブラウザ E2E テスト(アプリ起動中に別ターミナルで)
cd apps/e2e && npm test

テストカバレッジ

# テストを実行してカバレッジレポートを生成
./gradlew test jacocoTestReport

# レポートの表示
# apps/cargo-tracker/build/reports/jacoco/test/html/index.html

9. コード品質管理

静的コード解析ツール

ツール 目的 コマンド
Checkstyle コーディング規約の検証 ./gradlew checkstyleMain
SpotBugs バグパターン検出 ./gradlew spotbugsMain
JaCoCo テストカバレッジ ./gradlew jacocoTestReport

品質チェックの実行

cd apps/cargo-tracker

# 品質チェックのみ
./gradlew check

# すべてのテストと品質チェック
./gradlew build

コード複雑度の基準

指標 閾値 説明
循環的複雑度 10 分岐・ループの複雑さ
ファイルサイズ 500 行 1 ファイルの最大行数
メソッドサイズ 150 行 1 メソッドの最大行数
パラメータ数 7 メソッドの最大パラメータ数

レポートの確認

品質チェック後、以下のディレクトリにレポートが生成されます。

ツール レポートパス
Checkstyle apps/cargo-tracker/build/reports/checkstyle/
SpotBugs apps/cargo-tracker/build/reports/spotbugs/
JaCoCo apps/cargo-tracker/build/reports/jacoco/test/html/
テスト結果 apps/cargo-tracker/build/reports/tests/test/

10. ディレクトリ構造

case-study-cargo-tracker/
├── .husky/                          # Git Hooks (Husky)
│   └── pre-commit                   # コミット前品質チェック
├── apps/
│   └── cargo-tracker/               # メインアプリケーション
│       ├── build.gradle             # Gradle ビルドスクリプト(Groovy DSL)
│       ├── settings.gradle          # Gradle 設定
│       ├── Dockerfile               # アプリコンテナイメージ
│       ├── config/                  # 品質管理ツール設定
│       │   ├── checkstyle/          # Checkstyle 設定
│       │   └── spotbugs/            # SpotBugs 除外フィルタ
│       └── src/
│           ├── main/
│           │   ├── java/com/example/cargotracker/
│           │   │   ├── shipper/                   # 荷主コンテキスト
│           │   │   │   ├── domain/                # ドメイン層
│           │   │   │   ├── application/           # アプリケーション層
│           │   │   │   └── infrastructure/        # インフラストラクチャ層
│           │   │   ├── booking/                   # 予約コンテキスト
│           │   │   │   ├── domain/
│           │   │   │   ├── application/
│           │   │   │   └── infrastructure/
│           │   │   └── shared/                    # 共有カーネル
│           │   │       ├── domain/model/           # 共有ドメインモデル
│           │   │       └── infrastructure/
│           │   │           ├── config/             # SecurityConfig, OpenApiConfig
│           │   │           └── web/                # HomeController
│           │   └── resources/
│           │       ├── application.yml            # 開発設定(H2)
│           │       ├── application-product.yml    # 本番設定(PostgreSQL)
│           │       ├── db/migration/              # Flyway マイグレーション
│           │       ├── mapper/                    # MyBatis マッパー XML
│           │       └── templates/                 # Thymeleaf テンプレート
│           └── test/
│               ├── java/com/example/cargotracker/
│               │   ├── support/                   # テスト共通基盤
│               │   │   └── PostgreSQLIntegrationTestBase.java
│               │   └── e2e/                       # API E2E テスト
│               │       └── AuthE2ETest.java
│               └── resources/
│                   └── application-test.yml       # テスト用プロファイル
├── apps/
│   └── e2e/                         # ブラウザ E2E テスト(Playwright)
│       ├── package.json
│       ├── playwright.config.ts
│       └── src/
│           ├── fixtures.ts
│           ├── pages/               # Page Object Model
│           └── tests/               # テストスペック
├── docs/                            # MkDocs ドキュメント
├── ops/                             # 運用スクリプト(Gulp タスク)
├── docker-compose.yml               # Docker サービス定義
└── package.json                     # Node.js 依存関係(Gulp, Husky)

11. 命名規則

要素 規則
テーブル名 snake_case(複数形) shippers, bookings
カラム名 snake_case shipper_id, created_at
クラス名 PascalCase ShipperController, BookingId
フィールド名 camelCase shipperId, requestedPickupDate
パッケージ名 ドット区切り小文字 com.example.cargotracker.shipper.domain

12. Git 規約

コミットメッセージ

Conventional Commits に従います。

タイプ 説明
feat 新機能
fix バグ修正
docs ドキュメントのみの変更
style コードの意味に影響しない変更
refactor バグ修正でも機能追加でもないコード変更
perf パフォーマンス改善
test テストの追加・修正
chore ビルドプロセス・補助ツールの変更

スコープ

サブシステムを示すスコープを使用します。

feat(shipper): 荷主登録機能を実装する
feat(booking): 貨物予約登録機能を実装する
fix(booking): 重量バリデーションのバグを修正する
docs: IT1 計画を更新する

Git Hooks(Husky + lint-staged)

コミット時に自動で品質チェックが実行されます。

セットアップ

npm install 実行時に Husky は自動的にセットアップされます(prepare スクリプト)。

# 手動でセットアップする場合
npm run prepare

pre-commit フック

staged な Java ソースファイルがある場合、以下のチェックが自動実行されます。

ツール 目的
Checkstyle コーディング規約の検証
SpotBugs バグパターン検出

実装上は .husky/pre-commit から lint-staged を起動し、apps/cargo-tracker/src/**/*.java が staged に含まれると node ops/scripts/pre_commit_gradle_check.mjsapps/cargo-tracker./gradlew check を実行します。いずれかのチェックが失敗すると、コミットがブロックされます。

フックをスキップする場合

緊急時にフックをスキップしてコミットする場合(非推奨):

git commit --no-verify -m "メッセージ"

Warning: フックのスキップは緊急時のみ使用してください。品質チェックを通過しないコードはチームに影響を与える可能性があります。


13. セットアップの確認

すべてのセットアップが完了したら、以下のコマンドで動作確認を行います。

# 1. Node.js 依存パッケージのインストール
npm install

# 2. ビルド確認
cd apps/cargo-tracker
./gradlew build -x test

# 3. テスト実行
./gradlew test

# 4. 品質チェック
./gradlew check

# 5. 開発サーバー起動(default プロファイル / H2 使用)
./gradlew bootRun

アクセス確認

サービス URL 説明
アプリケーション http://localhost:8080 メインアプリケーション
Swagger UI http://localhost:8080/swagger-ui/index.html API ドキュメント
H2 コンソール http://localhost:8080/h2-console データベース管理ツール(dev のみ)
ヘルスチェック http://localhost:8080/actuator/health ヘルスチェック
MkDocs http://localhost:8000 プロジェクトドキュメント

14. CI/CD

CI/CD による継続的インテグレーション・デプロイを設定しています。

ワークフロー一覧

ワークフロー ファイル トリガー 説明
Backend CI .github/workflows/backend-ci.yml apps/cargo-tracker/** 変更時 品質チェック・テスト・ビルド
Docker Publish .github/workflows/docker-publish.yml タグ push / 手動実行 イメージを ECR に公開
Docs Deploy .github/workflows/docs-deploy.yml main ブランチ push MkDocs を GitHub Pages にデプロイ

Backend CI

バックエンドの変更時に自動実行されます。

実行内容:

  1. Java 25 環境セットアップ
  2. Gradle キャッシュ復元
  3. 品質チェック(Checkstyle、SpotBugs)
  4. テスト実行(単体・統合・アーキテクチャ)
  5. JaCoCo カバレッジレポート生成
  6. ビルド(JAR 生成)
  7. レポートアップロード(GitHub Actions Artifacts)

Docker Image Publish

タグ push 時または手動実行時に、Docker イメージをビルドして ECR に公開します。

# タグによる自動実行
git tag v0.1.0
git push origin v0.1.0

# イメージの取得
docker pull {AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/cargo-tracker:latest

トラブルシューティング

Gradle Wrapper が見つからない

問題: ./gradlew コマンドが実行できない

-bash: ./gradlew: No such file or directory

解決策: apps/cargo-tracker ディレクトリで実行しているか確認する

cd apps/cargo-tracker
./gradlew bootRun

Testcontainers の起動に時間がかかる

問題: 統合テストが初回起動時に非常に遅い

解決策: Singleton コンテナパターンを使用して Docker コンテナを再利用する

// 基底クラスで @Container をクラスレベルで定義
@Testcontainers
abstract class AbstractIntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16")
            .withDatabaseName("cargo_tracker_test");
}

H2 コンソールに接続できない

問題: http://localhost:8080/h2-console にアクセスできない

解決策: application.yml で H2 コンソールが有効になっているか確認する。Spring Boot 4.0 では spring-boot-h2console モジュールとして提供される。

spring:
  h2:
    console:
      enabled: true
      path: /h2-console

pre-commit フックが失敗する場合

cd apps/cargo-tracker

# 品質チェックを手動実行してエラーを確認
./gradlew check

# エラーを修正してから再度コミット

関連ドキュメント