본문 바로가기

관심사/독후감

최범균 <DDD START! > 4-5장 요약

4장. 리포지터리와 모델 구현

별도 테이블에 저장하는 밸류 매핑

애그리거트에 속한 객체가 밸류인지 엔티티인지 구분하는 방법은 고유 식별자를 갖는지 여부를 확인하는 것이다.

하지만 식별자를 찾을 때 매핑되는 테이블의 식별자를 애그리거트 구성요소의 식별자와 동일한 것으로 착각하면 안된다.

별도 테이블로 저장되고 테이블에 PK가 있다고 해서 테이블과 매핑되는 애그리거트 구성요소가 고유 식별자를 갖는 것은 아니다.

주문 애그리거트의 루트 엔티티와 밸류 다이어그램

보통 주문 애그리거트는 실주문을 의미하는 Order 테이블과 주문 품목을 의미하는 Order Lines 테이블로 구성되어 있다.

여기서 주문 품목(Order Lines)은 밸류이다. Order Lines 테이블도 고유 PK를 갖고 있지만, 주문 애그리거트를 식별하는 고유 식별자는 주문번호이다. (위 다이어그램의 주문 애그리거트 식별자는 order_number이다.)

애그리거트 로딩 전략

애그리거트 내의 모든 연관을 즉시 로딩으로 설정할 필요는 없다. 지연 로딩은 동작 방식이 항상 동일하기 때문에 즉시 로딩처럼 경우의 수를 따질 필요가 없는 장점이 있다.

물론 지연 로딩은 즉시 로딩보다 쿼리 실행 횟수가 많아질 가능성이 더 높다.

따라서 무조건 즉시 로딩이나 지연 로딩으로 설정하기 보다는 애그리거트에 맞게 즉시 로딩과 지연 로딩을 선택해야한다.

5장. 리포지터리의 조회 기능

조회 전용 기능 구현

리포지터리는 애그리거트의 저장소를 표현하는 것으로서 다음 용도로 리포지터리를 사용하는 것은 적합하지 않다.

  • 여러 애그리거트를 조합해서 한 화면에 보여주는 데이터 제공
  • 각종 통계 데이터 제공

첫번째 케이스는 지연 로딩, 즉시 로딩, 연관 매핑 등으로 로직이 복잡해진다.
두번째 케이스는 다양한 테이블을 조인하거나, DBMS 전용 기능을 사용해야 구할 수 있는데, 이 경우도 리포지터리를 활용하기 어렵다.

그래서 위와 같은 경우, 조회 전용 모델을 만드는게 좋다. 그냥 원하는 대로 쿼리를 만들어서 보여주면 된다.

지난글

최범균 <DDD START! > 1장-2장 요약
최범균 <DDD START! > 3장 요약