集約(Aggregate)
定義
集約(Aggregate)とは、一貫性を保って変更されるべきエンティティと値オブジェクトの塊。塊全体を代表する**集約ルート(Aggregate Root)**を通じてのみ外部からアクセスされる。
Order(集約ルート)
├── OrderLine(エンティティ)
├── OrderLine(エンティティ)
└── ShippingAddress(値オブジェクト)
外部から OrderLine に直接アクセスしてはならない。必ず Order を通す。
なぜ重要か
トランザクション境界
集約は一つのトランザクションで変更される単位。1つのコマンドで変更できる集約は1つだけという原則(トランザクション境界)を守ることで、データの整合性が保たれる。
不変条件の保護
集約内の整合性ルール(不変条件)は集約ルートが守る。例:「注文の合計金額は各明細の合計と一致しなければならない」。外部から直接 OrderLine を変更されると、この不変条件が破れる可能性がある。
適用場面
- 「一緒に変わらなければならない」オブジェクト群の設計
- 楽観的ロックの単位(集約ルートにバージョン番号を持たせる)
- リポジトリの管理単位(集約ルート1つにつき1つのリポジトリ)
設計の指針
- 小さく保つ → 本当に一緒に変わる必要があるものだけを含める
- IDでのみ参照する → 集約から別の集約はオブジェクト参照ではなくIDで参照する
- 結果整合性で繋ぐ → 別の集約への影響はドメインイベント経由で行う
関連概念
出典
実践ドメイン駆動設計(Vaughn Vernon)第10章