🔍
Tips #スキル #DDD #集約 #設計 📚 実践ドメイン駆動設計

集約の境界を見つけるスキル

どこからどこまでを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なら別集約で結果整合性を使う。

関連概念

出典: 実践ドメイン駆動設計(Vaughn Vernon)第10章