개발/일지

[DDD] Repository Pattern 이란

Zziny 2022. 12. 16. 18:08

Repository Pattern

공통적인 데이터 Access & Manipluate 에 집중하여 도메인 모델 계층과 구현 기술을 분리시키는 것을 의미

 

RDB 나 Query 와 같이 어떠한 구현 기술에 종속적이지 않고 도메인에 더욱 집중할 수 있게 되는 패턴

 

Martin Fowler 

A repository performs the tasks of an intermediary between the domain model layers and data mapping, acting in a similar way to a set of domain objects in memory. Client objects declaratively build queries and send them to the repositories for answers. Conceptually, a repository encapsulates a set of objects stored in the database and operations that can be performed on them, providing a way that is closer to the persistence layer. Repositories, also, support the purpose of separating, clearly and in one direction, the dependency between the work domain and the data allocation or mapping.

 

domain 과 data source layer 간에 중재자 역할을 수행하는 것

 

repository 는 영속성 장치에서 쿼리의 결과로 받아온 데이터를 repository 에서는 domain 에서 사용하기 적합하도록 domain 객체로 mapping 하는 역할을 수행한다.

 

꼭 영속성 장치일 필요는 없다.

 

  • Domain Model Layer 에서는 저장하는 방법에 대해서 관심을 갖고,
  • Infrastructure Layer 에서는 실제로 어떻게 저장하는지에 대해서 관심을 갖는다.

 

의존관계 역전 원칙 (DIP, Dependency Inversion Principle)

결국 Repository 는 Jpa 진영에서 DB 와 연결하기 위한 layer 로 부르는 것이 아니라는 것을 알 수 있다.

 

도메인의 관점에서 Repository 는 데이터를 저장하는 backing 을 추상화한 것으로 도메인은 어떻게 Repository 에 저장되는지 관심을 갖지 않는다.

 

오로지 도메인 로직 자체에만 관심을 갖는다.

 

그래서 도메인 관점으로 보자면 Repository 를 두고 infrastructure 에서 이를 JPA 를 사용하던 MyBatis 를 사용해서 DAO 계층을 만들건 중요하지 않게 되는 것이다.

 

DDD 관점의 Repository 는?

DDD 에서는 애그리거트라는 용어가 존재한다.

 

애그리거트는 간략하게 말하자면 하나의 unit, 비즈니스 단위로 취급할 수 있는 오브젝트의 집합이다.

 

예를 들어서 Review 라는 애그리거트가 존재한다고 해보자.

 

그럼 해당 Review 라는 애그리거트에는 다음과 같은 오브젝트가 존재할 것이다.

 

  • Review 에는 글을 쓴 사람인 Reviewer
  • 글의 본문인 Contents
  • 리뷰의 제목인 Title
  • 해당 리뷰의 Tag

 

이외에도 리뷰를 표현하는 다양한 오브젝트가 존재할 것인데, 해당 오브젝트는 리뷰라는 비즈니스 개념 하나를 구성하는 요소들이다.

 

결국 어떤 애그리거트가 저장된다는 소리는 해당 애그리거트에 포함되는 모든 entity 와 value 들에 대해서 transaction consistency 를 보장해야 한다.

 

그래서 일반적으로 DDD 에서는 하나의 Aggregate 를 Repository 의 대상 엔티티로 삼는다.

 

즉 Review 라는 애그리거트가 존재할 때, 해당 애그리거트를 저장하고 로드하는 Repository 는 ReviewRepository 만 존재해야 한다는 소리다.

 

Review 가 Tag 들을 포함하고 있다고 해서 TagRepository 가 존재해서는 안된다는 것이다.

 

 

원문

   Repository와 CQRS