🔍
集約の境界を見つけるスキル
どこからどこまでを1つの集約にするかを判断する実践手順。「整合性を誰が保証するか」を問い続ける
目的
どこからどこまでを1つの集約にするかを判断し、整合性境界を正しく引く。
手順
1. 候補となるEntityを列挙する
対象ドメインに登場するEntityをすべて書き出す。
例:ECサイト
- Order(注文)
- OrderItem(注文明細)
- Customer(顧客)
- Product(商品)
- ShippingAddress(配送先)
2. 「同時に変更される」かを確認する
同一トランザクションで整合性を保つ必要があるものが、同じ集約に属する。
問い:「OrderItemを追加するとき、Orderの何かも同時に変わるか?」
→ YES(合計金額が変わる)→ OrderとOrderItemは同じ集約
→ NO → 別の集約でよい
3. 集約ルートを決める
外部からの操作の入り口となるEntityが集約ルート。
問い:「外部からOrderItemを直接取得・変更する必要があるか?」
→ NO(必ずOrderを経由する)→ Orderが集約ルート
4. 集約間の参照はIDだけにする
// ❌ 別集約への直接参照
type Order struct {
Customer *Customer // Customer集約を丸ごと持つ
}
// ✅ IDのみ
type Order struct {
CustomerID CustomerID
}
5. 集約を小さく保つ
迷ったら小さい方を選ぶ。大きな集約はロック競合とパフォーマンス問題の原因になる。
問い:「CustomerとOrderは同じ集約か?」
→ 「注文するとき顧客の何かが同時に変わるか?」→ NO
→ 別集約。OrderはCustomerIDを持つだけでよい
チェックリスト
- 集約の外部からメンバーEntityを直接変更していないか
- 1トランザクションで複数集約を変更していないか(していたらイベント化を検討)
- 別集約への参照がオブジェクト参照ではなくIDになっているか
- 集約が大きくなりすぎていないか(目安:5つ以上のEntityは見直す)
- 集約ルートを経由しないとメンバーを変更できない構造になっているか
判断に迷ったときの問い
「これを同時に変更しなければ、業務が壊れるか?」
YESなら同じ集約。NOなら別集約で結果整合性を使う。
関連概念
- 1. 🔍集約の境界を見つけるスキル
- 2. 🩺貧血ドメインモデルを診断・修正するスキル
- 3. 🗺️コンテキストマップを描くスキル
- 4. 🔲境界づけられたコンテキスト
- 5. 🗺️サブドメイン(コア・サポート・汎用)
- 6. 🗾コンテキストマップ
- 7. ⬡六角形アーキテクチャ(ポートとアダプター)
- 8. 🪪エンティティ(Entity)
- 9. ⚙️ドメインサービス(Domain Service)
- 10. 💎値オブジェクト(Value Object)- IDDD
- 11. 📣ドメインイベント(Domain Event)
- 12. 🫧集約(Aggregate)
- 13. 📐集約の設計原則(Vernon の4ルール)
- 14. 🗄️リポジトリ(Repository)
- 15. 🏭ファクトリ(Factory)
- 16. 📦モジュール(Module)
- 17. 🎛️アプリケーションサービス(Application Service)
- 18. 🔌境界づけられたコンテキストの統合
- 19. ⚡CQRS(コマンドクエリ責任分離)
- 20. 📜イベントソーシング(Event Sourcing)
- 21. 🩸貧血ドメインモデル(Anemic Domain Model)
- 22. 🪶アプリケーションサービスを薄く保つ
出典: 実践ドメイン駆動設計(Vaughn Vernon)第10章