このリポジトリは、Housework Hub (HwHub) の バッチ処理基盤 を提供します。
主に以下のような 定期実行ジョブ を担当します:
- 家事タスクの定期生成
- 家事タスクの再計算
- 招待の期限切れ処理
- その他、非同期・定期実行系の業務処理
実行基盤:
- Spring Boot + Spring Batch
- ECS Fargate
- EventBridge Scheduler によるスケジューリング
flowchart LR
Scheduler["EventBridge Scheduler"]
ECSBatch["ECS (Batch Task)"]
RDS["RDS (MySQL)"]
S3Knowledge["S3 (Knowledge)"]
ClaudeAPI["Claude API"]
Scheduler --> ECSBatch
ECSBatch --> RDS
ECSBatch --> S3Knowledge
ECSBatch --> ClaudeAPI
src/main/java/com/hwhub/batch
├── application/
│ └── service/ # サービス層(ビジネスロジックの実行)
├── config/ # 各種設定クラス
├── domain/ # ビジネスルール
│ ├── enums/ # コードマスタ由来の Enum(※編集禁止)
│ ├── model/ # ドメインモデル
│ └── repository/ # リポジトリIF
└── infrastructure/ # 外部接続実装(DB, S3等)
├── ai/ # AI関連実装
├── mybatis/
│ ├── converter/ # Entity ⇔ Domain Modelの変換
│ ├── generated/ # MBG自動生成(※編集禁止)
│ │ ├── entity/
│ │ └── mapper/
│ ├── custom/ # 手書きEntity/Mapper(JOIN用など)
│ │ ├── entity/
│ │ └── mapper/
│ └── repository/ # リポジトリ実装
└── s3/ # AWS S3操作実装
構成方針は バックエンドと同一思想(DDD + レイヤード) です。
- Java 21
- Docker
- MySQL(backend と同じ DB を使用)
特定のジョブを指定して実行:
./gradlew bootRun --args='--spring.batch.job.name=invitationExpireJob'
./gradlew bootRun --args='--spring.batch.job.name=houseworkTaskGenerateJob'
./gradlew bootRun --args='--spring.batch.job.name=houseworkTaskRecalcJob'
./gradlew bootRun --args='--spring.batch.job.name=householdCleanupJob'
./gradlew bootRun --args='--spring.batch.job.name=notificationAggregationJob'
./gradlew bootRun --args='--spring.batch.job.name=inquiryAiReplyJob'---`
- invitationExpireJob:招待の期限切れ処理
- houseworkTaskGenerateJob:家事タスクの定期生成
- houseworkTaskRecalcJob:家事タスクの再計算
- householdCleanupJob:世帯の削除
- notificationAggregationJob:通知イベントの集約
- inquiryAiReplyJob:問い合わせへのAI自動返信
実際の値は STG/本番では Secrets Manager から供給します。
| 変数名 | 説明 | ローカル設定箇所 |
|---|---|---|
| SPRING_DATASOURCE_URL | DB接続URL | application-dev.yml |
| SPRING_DATASOURCE_USERNAME | DBユーザー名 | application-dev.yml |
| SPRING_DATASOURCE_PASSWORD | DBパスワード | application-dev.yml |
| CLAUDE_API_KEY | Anthropic Claude API Key | .env |
| KNOWLEDGE_S3_BUCKET | ナレッジS3バケット名 | .env |
ローカル開発用の .env ファイルは .env.example をコピーして作成してください。
# UT(単体テスト)
./gradlew test統合テスト(PR時にCIで実行、ローカルでも実行可能):
./gradlew integrationTest全テスト実行(UT+統合テスト):
./gradlew clean test integrationTest統合テストについて:
- Testcontainers を使用してMySQLコンテナを自動起動
- Flywayマイグレーションが自動適用される
- PRのCIパイプラインで自動実行される
カバレッジレポート:
./gradlew test jacocoTestReport出力先:
build/reports/jacoco/test/html/index.html
- main ブランチ push 時:
- テスト実行
- JaCoCo カバレッジ計測
- GitHub Pages にレポート公開
- コンテナイメージは ECR に push
- ECS タスク定義を更新
- EventBridge Scheduler が TaskDefinition + Container Override でジョブを起動
1 つの TaskDefinition を使い、Scheduler 側で:
- Container override.command
を上書きして、実行ジョブを切り替えています。
デプロイ先の環境はEphemeral STGとしているためPull Request前にterraform applyし環境を立ち上げておくこと
- main ブランチに push
- GitHub Actions が:
- build
- test
- docker build & push
- ECS タスク定義更新 ※Schedulerは最新を参照
- EventBridge Scheduler の実行履歴
- ECS タスクの CloudWatch Logs
- 失敗時は CloudTrail の RunTask エラーを確認
- バッチは 冪等性前提 で設計すること
- 途中失敗時に再実行しても問題ない設計にすること