【設計】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について書きました。
ドメインオブジェクトからデータ保存などに関する処理を分離できるので、より洗練されたシステムになりそうだと思いました。