애그리게이트의 예시
실무에서 `Circle`과 같은 부모 클래스가 `List<User> members`를 멤버 변수로 가지는 경우는 많이 볼 수 있다. 이 경우에 Circle과 User를 각각 하나의 애그리게이트로 볼 수 있다.
class Circle {
private final List<User> members;
}
애그리게이트 경계가 무너진 경우
이때 Circle이 User를 인스턴스로 직접 가지고 있게 되면, 다음과 같이 Circle 애그리게이트 내부(여기서는 Circle Repository)에서 User 데이터에 직접 접근할 수 있게 된다.
public class CircleRepository implements ICircleRepository {
(...생략...)
@Override
public void save(Circle circle) throws SQLException {
(...생략...)
try (PreparedStatement userCircleStatement = connection.prepareStatement(saveUserCircleQuery)) {
userCircleStatement.setString(2, circle.getId().getValue());
// circle 레포지토리에서 user 데이터를 변경하고 있음
for (User member : circle.getMembers()) {
userCircleStatement.setString(1, member.getId().getValue());
userCircleStatement.executeUpdate();
}
}
}
}
애그리게이트 경계를 구분하는 방법
그 해결책은 부모클래스가 인스턴스가 아닌 자식 클래스의 아이디를 보유하는 것이다. 이 경우 User 인스턴스를 복원하기 위해서는 UserId로 User 레포지토리에서 find를 호출하는 방법이 있다.
class Circle {
private final List<UserId> members;
}
'DDD > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
Specification 객체 정의와 활용 - 「도메인 주도 설계 철저 입문」 13장 (1) (0) | 2025.01.13 |
---|---|
애그리게이트 활용 (feat. 노티피케이션 객체) - 「도메인 주도 설계 철저 입문」 12장 (2) (3) | 2025.01.03 |
애그리게이트란 - 「도메인 주도 설계 철저 입문」 12장 (1) (0) | 2024.12.17 |
도메인 규칙을 코드로 제대로 표현하는 법 - 「도메인 주도 설계 철저 입문」 11장 (4) (0) | 2024.12.12 |
테스트 커버리지 높이는 법 - 「도메인 주도 설계 철저 입문」 11장 (3) (1) | 2024.12.11 |