リポジトリ(Repository)
定義
リポジトリ(Repository)とは、集約(Aggregate)の永続化と再構築を担うオブジェクト。ドメイン側からはメモリ上のコレクションのように見え、DBやファイルなどの技術的詳細を隠蔽する。
// ドメイン側からの見え方(コレクションのように使う)
interface OrderRepository {
findById(id: OrderId): Order | null
save(order: Order): void
findByCustomer(customerId: CustomerId): Order[]
}
// インフラ側が実装する
class PostgresOrderRepository implements OrderRepository {
// SQLで実装
}
リポジトリは集約ルート1つにつき1つ。OrderLine のリポジトリは作らない。
なぜ重要か
リポジトリがないと:
- ドメインロジックの中にSQL・ORMが混入し、テストが困難になる
- 永続化の方法が変わった(RDB→NoSQL等)ときにドメインに修正が波及する
- クエリロジックが散在し、一貫性が保てなくなる
リポジトリはドメインと技術基盤の境界として機能する。インターフェースはドメイン層が定義し、実装はインフラ層が提供することで、依存関係逆転の原則が実現する。
適用場面
- 集約の保存・取得・削除が必要なすべての場面
- テスト時にインメモリ実装へ差し替えてユニットテストを行う
- クエリロジックを集中管理する(メソッドとして意図を表現する)
リポジトリとファクトリの違い
- リポジトリ:既存の集約を永続化から取り出す(再構築)
- ファクトリ:新しい集約を初期状態で生成する
関連概念
- → 集約
- → ヘキサゴナルアーキテクチャ
- → 三層分離パターン
出典
実践ドメイン駆動設計(Vaughn Vernon)第12章