애그리게이트란?
애그리게이트는 변경의 단위이다. 11장에서 프로그래밍했던 User나 Circle과 같은 객체가 바로 애그리게이트이다.
출처 :「도메인 주도 설계 철저 입문」
애그리게이트의 특징
애그리게이트는 경계와 루트를 갖는다. 애그리게이트의 경계는 애그리게이트에 포함되는 대상을 결정하는 경계이고, 애그리게이트의 루트는 애그리게이트에 포함되는 특정 객체다. 외부에서 애그리게이트를 다루는 조작은 모두 루트를 거쳐야 한다.
변경은 애그리게이트 루트를 통해서만 - 예시 (1) User
User 애그리게이트의 루트는 User 클래스이다. 따라서 사용자명 변경도 루트인 User에 요청하는 형태여야 한다.
이를 위해서 `changeName`과 같은 메소드를 만들면 null 체크 등과 같은 유효성 검사를 할 수 있다는 장점도 있다.
public class Main {
public static void main(String[] args) {
User user = new User("test-id", "CurrentName");
UserName userName = new UserName("NewName");
// NG
// user.setName(userName);
// OK
user.changeName(userName);
}
}
변경은 애그리게이트 루트를 통해서만 - 예시 (2) Circle
Circle에 멤버를 추가할 때도 마찬가지이다. Circle에 대한 조작은 Circle 애그리거트의 루트인 Circle을 통해서만 이루어져야 하므로 다음 코드는 애그리게이트 규칙을 위반하는 코드이다.
circle.members.add(member);
바람직한 방법은 먼저 Circle 클래스의 `members` 프로퍼티는 private으로 변경하고, 다음과 같이 `join`이라는 메서드를 추가하는 것이다. 이 경우에 멤버 추가시 늘 Circle 클래스를 통하게 되고, 최대 인원 초과 여부를 확인하게 된다.
public class Circle {
private final CircleId id;
private User owner;
private List<User> members;
private CircleName name;
public void join(User member) {
if (member == null) throw new IllegalArgumentException("member cannot be null");
if (members.size() >= 30) {
throw new CircleFullException(id);
}
members.add(member);
}
}
'DDD > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
도메인 규칙을 코드로 제대로 표현하는 법 - 「도메인 주도 설계 철저 입문」 11장 (4) (0) | 2024.12.12 |
---|---|
테스트 커버리지 높이는 법 - 「도메인 주도 설계 철저 입문」 11장 (3) (1) | 2024.12.11 |
엔티티 중복 확인은 도메인 서비스인가 앱 서비스인가 - 「도메인 주도 설계 철저 입문」 11장 (3) (2) | 2024.12.10 |
Entity Factory 패턴 - 「도메인 주도 설계 철저 입문」 11장 (2) (1) | 2024.11.22 |
DDD 프로젝트 폴더 구조 - 「도메인 주도 설계 철저 입문」 11장 (1) (1) | 2024.11.20 |