🗄️
DDDアーキテクチャ・設計 2026年4月4日

リポジトリ(Repository)

📁 概念 👁 -- 閲覧

リポジトリ(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章