【設計】repositoryについて

はじめに

今回は、DDDにおけるrepositoryについて書いていこうと思います。
repositoryを利用することで、ワンクッション置くことができ、変更しやすいシステムになります。

repositoryとは

repositoryとは、システム内で使用するデータを永続化させるものです。
データを保存したいときに直接DBにデータを書き込むのではなく、repositoryを使用してデータを書き込むようにします。

エンティティやVO、サービスなどと違いドメインを表すものではありませんが、システムで必要になるデータ保存処理を持っています。
データ保存や取得の処理をサービスなどに書こうとすると、多くの処理がDBへのアクセスなどになってしまうことがあります。
なので、それらの処理を分離して書く場所がrepositoryです。
repositoryには、データ処理に関するものだけを書くべきであり、ドメインに関することはサービスに書くべきです。(データ取得時のチェックなど)

repositoryのインタフェースと実装クラス

repositoryはインターフェースを実装して、実際のデータアクセス処理を書いていきます。
インタフェースを作っておくことで、MySQL→PostgreSQLに変更する際もそれ用の実装クラスを作っておいて、使用する実装クラスを変更します。
ex)

  • TransactionRepository(インターフェース)
    save()
    get()

    • TransactionMySQLRepository(MySQLでデータを取得する実装クラス)
      save()
      get()

    • TransactionPosgreRepository(PostgreSQLでデータを取得する実装クラス)
      save()
      get()

repositoryにインターフェースを使用することで、テスト効率化を行うことができます。
テスト用にインターフェースを実装したrepositoryクラスを作成してテストを行います。
DBにデータを保存するのではなく、プログラムのオブジェクト内(メモリ内)にデータを保存するようにするとDBを用意する手間が省けます。

レポジトリでは以下のようなメソッドの振る舞いを行います。

  • save() : 保存

  • update〇〇() : 更新

  • delete(): 削除

  • find(): 取得

おわりに

今回はrepositoryについて書きました。
ドメインオブジェクトからデータ保存などに関する処理を分離できるので、より洗練されたシステムになりそうだと思いました。

この記事が気に入ったらサポートをしてみませんか?