본문 바로가기

책리뷰/도메인 주도 개발 시작하기(DDD핵심 개념 정리부터 구현까지)

도메인 주도 설계(DDD) 애그리거트

728x90
반응형

목차

    애그리거트

    복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데, 

    그 방법이 바로 애그리거트다. 

    애그리거트 장점

    • 모델을 이해하는데 도움을 준다.
    • 일관성을 관리하는 기준이 된다. 
    • 복잡한 도메인을 단순한 구조로 만들어준다.
    • 복잡도가 낮아져서 도메인 기능을 확장하고 변경하는데 필요한 노력이 줄어든다. 

    애그리거트 특징

    • 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다.
    • 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다.
    • 독립된 객체군이며 각 애그리거트는 자기자신을 관리할 뿐 다른 애그리거트는 관리하지 않는다.
    • 경계설정시 기본은 도메인 규칙과 요구사항이다.  

     

     

    애그리거트루트

    도메인규칙을 지키려면 애그리거트에 속한 모든 객체가 정상 상태를 가져야 하는데, 그러려면 전체를 관리할 주체가 필요하다.

    이 책임을 지는 것이 애그리거트 루트 엔티티다.

    배송이 시작되기 전까지만 배송지 정보를 변경할 수 있다면 애그리거트루트의  Order의 changeShippingInfo()메서드는 배송시작여부를 확인하고 충족할 때만 배송지 정보 변경이 가능하다. 

     

    애그리거트 외부에서 애그리거트에 속한 객체를 변경해서는 안된다.

    > 논리적인 데이터 일관성이 깨지고, 여러 응용 서비스에서 중복 구현할 가능성이 높아짐으로 유지보수에 좋지 않다. 

     

    도메인모델에 적용해야할 습관

    • 단순히 필드 변경하는 set메서드를 공개로 만들지 않는다
    • 밸류 타입은 불변으로 구현한다. 

     

    애그리거트 루트 기능구현

    • 애그리거트 내부의 다른 객체 조합해서 기능을 완성한다.

     

    트랜잭션 범위

    • 트랜잭션 범위는 작을 수록 좋다. 
    • 범위가 클수록 잠금 대상이 많아지고 성능에 영향을 끼친다.
    • 한 트랜잭션에서는 한 개의 애그리거트만 수행해야한다. 
    • 두 개 이상의 애그리거트 수정이 한 트랜잭션에 이루어져야 한다면 응용서비스에서 
      두 애그리거트를 수정하도록 구현한다. 

     

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

    다른 애그리거트 참조할 때 ID를 사용해서 참조한다. 

     

    다른애그리거트 직접참조 문제점

    • 다른 애그리거트 상태를 쉽게 변경할 수 있음
    • 애그리거트간 의존 결합도가 높아짐
    • 성능과 관련된 고민이 필요함(JPA 지연로딩, 즉시로딩 어떤거 쓸지..)
    • 확장의 어려움 (트래픽증가시 도메인별로 시스템을 분리하는데 직접 참조시 확장이 어려움)

    ID참조 사용

    • 모든 객체가 참조로 연결되지 않고 한 애그리거트에 속한 객체들만 참조로 연결됨
    • 모델의 복잡도를 낮춰줌
    • 애그리거트간 의존을 제거 > 응집도를 높여줌
    • 구현 복잡도가 낮아짐(응용서비스에서 필요한 애그리거트 로딩하므로 애그리거트 수준에서 지연로딩과 동일한 결과)

     

    애그리거트 팩토리 클래스 사용

    • 도메인 응집도를 높일 수 있다.(도메인 기능은 도메인으로 빼고 응용서비스는 구현에만 )
    • 애그리거트가 갖고 있는 데이터를 이용해 다른 애그리게이트 생성할 경우 팩토리 메서드 고려 

    Store가 Product를 생성할 수 있는지 판단하고 Product를 생성하는 것은 하나의 도메인 기능임

     

    Store 애그리거트에 옮길 수 있음 

    Store의 상태를 확인하지 않고 Product를 생성한다. 

    도메인 응집도가 높아졌다.

    다른 팩토리 클래스로 위임할 수도 있다.

     

     

    728x90
    반응형