[DDD START] 3장 애그리거트

David Lee·2023년 11월 30일
0

DDD Start

목록 보기
3/12
post-thumbnail

이 포스트는 📔 도메인 주도 개발 시작하기 책을 읽고 공부한 내용을 정리한 포스트입니다.

3장. 애그리거트

3.1 애그리거트

도메인에 대한 개발을 진행할때 상위 수준 개념을 활용해서 전체 모델을 정리하면 전반적인 관계를 이해하는데 도움이 된다.

하지만 상위 수준 개념에 대한 이해 없이 개별 객체 단위만으로 표현된 도메인은 개념파악에 많은 시간을 소요하게 만든다. 결국 주요 도메인 요소의 관계 파악이 어렵다는 점은 코드를 유지보수 및 확장하는 것이 어려워짐을 의미한다.

그렇다면 도메인에 상위 수준 개념개별 객체 단위 둘 다를 표현할 수 있는 방법은 어떤 것일까? 바로 애그리거트다.

애그리거트는 독립성을 갖고 일관성 관리의 기준이 되며, 하나의 애그리거트에 속하는 객체는 유사하거나 동일한 라이프 사이클을 갖는다.

'A가 B를 갖는다'로 설계가능한 요구사항이 있다면 A와 B를 하나의 애그리거트로 묶어 생각할 수 있지만, 관리 주체일관성의 여부, 변경의 영향 등 꼭 하나의 애그리거트로 묶는 것이 아닌 분리해서 사용해야 할 수 있다는 점을 기억해야한다.

3.2 애그리거트 루트

애그리거트는 여러 객체로 구성되기 때문에 애그리거트에 속한 모든 객체가 일관된 상태를 가져야 도메인 규칙을 지킬 수 있다.

애그리거트의 모든 객체가 일관된 상태를 갖기 위해 전체를 관리할 주체가 필요한데, 이 책임을 갖는 것을 애그리거트 루트 엔티티라고 한다.

애그리거트 루트의 핵심 역할은 애그리거트의 일관성을 깨지 않도록 하는 것이다. 이를 위해서 애그리거트 루트에서 애그리거트가 제공해야 할 도메인 기능을 구현하는데 기능을 구현하는 과정에 내부의 다른 객체를 조합하여 기능을 완성한다.

기능을 구현하는 과정에서 트랜잭션의 범위는 작을수록 좋다. 한 트랜잭션에서 한 애그리거트만 수정하는 것이 바람직한 기능 구현 방향이다.
한 트랜잭션에서 두개 이상의 애그리거트가 수정된다는 점은 자신의 책임범위를 넘어 다른 애그리거트의 상태까지 관리한다고 바라볼 수 있기 때문이다.

기술상의 제약이나 팀 표준 선정, UI 구현의 편리 등에 의해서 한 트랜잭션 내에서 두 개 이상의 애그리거트르르 변경하는 것을 고려할 수 있다.

3.3 리포지터리와 애그리거트

애그리거트는 개념상 하나의 도메인 모델을 표현하므로 객체의 영속성을 처리하는 리포지터리는 애그리거트 단위로 존재해야 한다.

애그리거트는 개념적으로 하나이기에 리포지트리는 애그리거트 전체를 저장소에 영속화해야하며 리포지터리는 완전한 애그리거트를 제공해주어야 한다.

3.4 ID를 이용한 애그리거트 참조

애그리거트가 애그리거트를 참조할 때 직접 참조하는 방식은 적합하지 않다. 적합하지 않은 이유는 아래와 같다.

  • 편리함을 오용할 수 있는 가능성이 생기기 때문이다.
    한 애그리거트 내부에서 다른 애그리거트 객체에 접근할 수 있다면 다른 애그리거트의 상태를 쉽게 변경할 수 있게 된다.
    → 한 애그리거트의 책임은 자기 자신으로 한정해야 하지만 직접 참조의 편리함을 활용하다 보면 이를 져버리기 쉽다.
  • 참조와 관련된 성능 고민이 필요하다.
    연관 객체를 함께 보여주어야 하는 경우에는 즉시(eager) 로딩을, 애그리거트 상태 변경을 위해서는 지연(lazy) 로딩을 활용해야하는 상황이 필요하므로 상황에 따른 참조 로딩 고민이 필요하다.
  • 확장에 좋지 않다.
    단일 DB에서 사용자의 증가로 분산 DB를 사용하게 된다면 시스템의 분리가 필요해 단일 기술(JPA)을 사용하기 어렵다.

이러한 어려움은 어떻게 해결할 수 있을까? ID를 이용하여 다른 애그리거트를 참조하는 방식을 사용하는 것이다. ID를 활용한 참조는 애그리거트 간 경계를 명확하게 하고 모델의 복잡도를 낮춰준다.

3.5 애그리거트 간 집합 연관

애그리거트간 1-N과 M-N 연관이 어떻게 진행될까?

  • 1-N 연관
    1-N 연관은 대부분 Set과 같은 Collection을 활용하여 구현한다. 하지만 실제 구현과정에서 DBMS와 연동하여 구현한다면 N 객체를 모두 조회하게 될 수 있다는 문제점을 갖고 있기에 애그리거트간의 1-N 연관을 실제 구현에 반영하지 않는다.

  • M-N 연관
    M-N 연관의 경우 개념적으로 양방향 연관이 존재해도 단방향 연관만을 적용한다. 단방향 연관만을 활용해서 양방향 연관을 기능을 활용한 구현 방식으로 적용한다.

3.6 애그리거트를 팩토리로 사용하기

애그리거트가 갖고 있는 데이터를 이용해서 다른 애그리거트를 생성해야 한다면 애그리거트에 팩토리 메서드를 구현하는 것을 고려하는 것이 좋다.
도메인의 응집도를 높일 수 있고, 데이터의 일부를 직접 제공하면서도 중요한 도메인 로직을 함께 구현할 수 있기 때문이다.

profile
쌓아가기

0개의 댓글

관련 채용 정보