Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

実践DDD本 第12章「リポジトリ」~集約の永続化管理を担当~

IDDD本から理解するドメイン駆動設計 第12回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 ドメイン駆動設計(DDD)は、顧客と開発者がビジネスを戦略的に理解し、共通の言葉を用いてシステムを発展させていく設計手法です。前回は集約の生成を担う「ファクトリ」について紹介しました。第12回となる今回は、集約を格納/取得する「リポジトリ」について紹介します。

目次

リポジトリとは

 一般的に「リポジトリ」とはデータの「保管庫」を表します。ソースコードリポジトリであればGitやApache Subversionが有名ですが、DDDにおけるリポジトリは、エンティティ値オブジェクトから構成される集約の格納と取得を担当します。リポジトリは、クライアントへ集約を提供し、背後のデータベースとのやり取りを隠ぺいします。

 通常、集約とリポジトリの関係は一対一になります。例えば「注文」の集約を利用したい場合「注文リポジトリ」を使用します。クライアント側はリポジトリのおかげで、物理的な構成(RDBなのか、NoSQLなのか等)を意識せずに、簡単に集約を操作できます。

リポジトリで集約を操作する流れ

 リポジトリはデータベースにアクセスしたり、ファクトリを利用したりします。その流れを見てみましょう。

リポジトリの役割と流れ
リポジトリの役割と流れ

 「A.新しい集約をデータベースに追加する流れ」の場合、クライアント側からファクトリを呼び出して集約を生成します。そして、リポジトリの追加メソッドを呼び出すことで永続化の対象として登録します。これによってデータベースに集約の情報が挿入されます。

 逆に「B.データベースから集約の情報を取り出し、再構成する流れ」の場合、リポジトリはデータベースにクエリを投げてデータを取り出します。そしてファクトリを使って集約のモデルを再構成し、クライアントに集約を戻します。取り出した集約の変更内容はデータベースへ反映されます。

エヴァンス氏のDDD本におけるリポジトリの説明

 IDDD本では、リポジトリの特徴として以下の説明をDDD本から引用しています。

  1. グローバルアクセスを必要とするオブジェクトの各型に対して、あるオブジェクトを生成し、その型のすべてのオブジェクトで構成されるコレクションが、メモリ上にあると錯覚させることができるようにすること。
  2. よく知られているグローバルインターフェイスを経由してアクセスできるようにすること。
  3. オブジェクトの追加と削除を行うメソッドを提供すること。
  4. ある条件に基づいてオブジェクトを選択し、属性値が条件に一致するような、完全にインスタンス化されたオブジェクトかオブジェクトのコレクションを戻すメソッドを提供すること。
  5. 集約に対してのみ、リポジトリを提供すること。

 この中でも最初の「コレクションがメモリ上にあると錯覚させること」はDDDのリポジトリの特徴をよく表現していると思います。データベースに対する操作(クエリ生成やオブジェクト詰め替え)を意識しなくてよいため、ドメインモデルの操作に集中できます。

リポジトリとDAOの違い

 リポジトリは、データベースを操作するため、従来のDAO(データアクセスオブジェクト)と似ているかもしれません。しかし、DAOがデータ中心指向であるのに対して、リポジトリはオブジェクト指向アプローチである点で異なります。

 そのため、DDDとしては「ドメインモデル」+「リポジトリ」+「データマッパー(Hibernate等)」との相性が良く、逆にDAOでは「トランザクションスクリプト」+「テーブルモジュール」または「テーブルデータゲートウェイ」または「アクティブレコード」との相性が良いとIDDD本では紹介されています。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 青木 淳夫 (株式会社ネクストスケープ)(アオキ アツオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2017年5月時点での登録メンバは52名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:IDDD本から理解するドメイン駆動設計

もっと読む

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5