반응형
애그리거트란?
- 관련된 객체를 하나로 묶은 군집
- 도메인이 커질수록 개발할 도메인 모델도 커지면서 엔티티와 밸류가 많아질수록 모델은 점점 복잡해진다.
- 개별 도메인 모델에만 집중하다 보면 큰 수준에서 모델을 이해하지 못해 큰 틀에서 모델을 관리 할 수 없게 된다.
- 도메인 모델을 개별 객체뿐만 아니라 상위 수준에서 모델을 볼 수 있어야 이해하는데 도움이 된다.
- 그러므로 애그리거트로 관련된 객체를 묶어 전체적인 모델의 이해를 돕는다.
애그리거트 구성할때 주의할점!
- 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다.
- 각 애그리거트는 독립적이며 자기 자신만 관리할 뿐 다른 애그리거트를 관리하지 않는다.
- 함께 생성되고 제거되는 구성요소는 한 애그리거트에 속할 가능성이 높다.(같은 라이프 사이클)
- 함께 변경되는 빈도가 높은 객체는 한 애그리거트에 속할 가능성이 높다.
- 'A가 B를 갖는다' 로 설계할때 반드시 A와 B가 애그리거트에 속한다는것은 아니다.
- 예를 들어 상품에 리뷰가 달릴수 있지만 함께 생성되지 않고 변경되지 않는다.
- 게다가 리뷰를 작성하는 주체는 고객이다.
- 대체로 다수의 애그리거트는 한개의 엔티티 객체만 갖는 경우가 많다.
- 두 개 이상의 엔티티로 구성되는 애그리거트는 드물게 존재
애그리거트 루트 엔티티
- 애그리거트에 속한 모든 객체는 일관된 상태를 유지하려면 애그리거트 전체를 관리할 주체가 필요하다.
- 이 전체를 관리하고 책임지는 주체를 루트 엔티티라고 한다.
- 애그리거트에 속한 객체는 루트 엔티티에 직접 또는 간접적으로 속한다.
도메인 규칙과 일관성
- 애그리거트 루트는 애그리거트가 제공해야 할 도메인 기능을 구현한다.
- 애그리거트 루트가 아닌 다른 객체가 애그리거트에 속한 객체를 직접 변경하면 안된다.
- 이는 애그리거트 루트가 강제하는 규칙을 적용할 수 없어 모델의 일관성을 깨는 원인이 된다.
- 도메인 기능을 실행할때 필요한 기능을 서비스에서 구현할 수 있지만, 이렇게 되면 동일한 로직을 여러 서비스에서 구현할 가능성이 높아진다.
- 도메인 모델에 대해 다음 두 가지를 습관적으로 적용해야한다.(최대한 외부에서 데이터를 변경할 수 없도록)
- set 메서드를 공개(public) 범위로 만들지 않는다.
- 밸류 타입은 불변으로 구현한다. (밸류 타입은 변경 메서드를 private로 설정해 애그리거트 루트를 통해서만 수정이 가능하도록 설계)
애그리거트 루트의 기능 구현
- 만약 애그리거트 루트에서 모든 변경 메소드를 사용하지 않고 내부에 한 클래스를 별도로 분리 하였을땐 해당 클래스의 필드를 변경하는 기능을 위임하는 방식으로 구현한다.
public class Order {
private Address address;
private void updateAddress(Address newAddress) {
address.update(newAddress);
}
}
public class Address {
private string value;
protected void update(Address newAddress) {
this.value = newAddress.getValue;
}
}
- 한 애그리거트안에 있는 클래스들은 보통 한 패키지에 속해있기 때문에 해당 예시 코드에서 Address의 변경 기능을 protected 범위로 한정해서 외부에서 변경을 제한해야한다.
트랜잭션 범위
- 트랜잭션 범위는 작을수록 좋다.
- 한 트랜잭션에서 한 테이블을 수정하는 것과 세 개의 테이블을 수정하는것은 성능에서 차이가 발생한다.
- 테이블을 수정할때는 충돌방지를 위해 잠그는 대상이 한개지만 수정 테이블이 많아질수록 잠금 대상이 많아지기 때문에 전체적인 성능을 떨어트린다.
- 동일하게 한 트랜잭션에서는 한 개의 애그리거트만 수정해야 한다.
- 이는 애그리거트에서 다른 애그리거트를 변경하지 않는다는것을 뜻한다.
- 만약 한 트랜잭션에 두 개 이상의 애그리거트를 변경해야 한다면 다른 애그리거트를 직접 수정하지 말고 서비스에서 두 애그리거트를 수정해야 한다.
반응형
'DDD' 카테고리의 다른 글
엔티티(Entity)와 밸류(Value)란? (0) | 2021.09.14 |
---|---|
BOUNDED CONTEXT 간 통합 (0) | 2021.09.14 |
BOUNDED CONTEXT 간 관계 (0) | 2021.09.14 |
좋은 의존성을 구성하라! (0) | 2021.09.14 |
도메인 모델과 BOUNDED CONTEXT란? (0) | 2021.09.13 |