caffeine-library/Domain-Driven-Design

[question] Aggregate 루트의 Repository

Closed this issue · 2 comments

질문

6장부터 AGGREGATE 에 대한 개념이 자주 언급되고 있습니다.
AGGREGATE 내에 있는 Entity 또는 VO 객체들은 루트를 통해서만 접근이 가능하며, 그렇기 때문에 대체로 Aggregate Root Entity 위주로 Repository가 생성되는 것을 확인할 수 있습니다.

7장에 있는 책의 예제에서는 Aggregate 루트에 해당되는 Entity는 모두 각각에 대한 Repository를 가지고 있었는데요.
(Handling Event 엔티티는 초기에는 Repository가 없었지만 리팩터링 과정에서 추가되었죠.)

Aggregate 루트의 Repository가 없는 경우가 있을지 문득 궁금해졌습니다.
일단 간접참조로 타 에그리거트 끼리 id로 연결돼있는 경우는 Repository가 사실상 필수적일 듯하고, 직접참조로 연결돼있다 하더라도 매우 기능이 적은 애플리케이션이 아닌 이상 findBy와 같은 검색 쿼리는 필요할 것이라 생각이 들었어요.
그럼 AGGREGATE의 루트 엔티티는 무조건 Repository를 가지고 있는게 좋은 패턴이라 봐도 무방한 걸까요?

연관 챕터

#35

p.177 에서 Handling Event직접 참조할 지, 간접 참조할 지에 대한 내용이 나오는데 정리해보면

  1. 직접 참조 : 조회가 적다면 유지보수가 용이하고 Handling Event 의 추가가 빠르다. - Repository O
  2. 간접 참조 : 조회가 많을 경우 유리하다. - Repository X

책에선 이후에 Handling Event를 추가할 때의 부하를 줄이기 위해 2.간접 참조 에서 1.직접 참조로 변경했죠.
만약 추가 시의 부하(혹은 아예 없어지거나)보다 조회가 매우 빈번히 일어나면 다시 역으로 돌아갈 수도 있겠다는 생각이 드네요. (거의 없겠지만..?)

Repository가 필요없는 경우도 가능

  • 경합성이 없는 경우나 우선순위가 낮은경우
    • 단, 불변성을 지켜야 하는 경우에 경합 문제를 처리할 수 있도록 DB 락 등 Repository가 필요할 수 있음.
      • 요구사항 문제없이 잘 작성할 수 있도록.
  • 굳이 직접참조를 해야 할 필요가 없는 경우
  • 조회가 많은 경우나 간접참조가 유리한 경우
    • 간접 참조도 Repository가 결국은 필요하지 않을까?
      • Repository 만드는 비용이 크진 않으니 만들어두고 정 필요없으면 없애는것도?