본문 바로가기

DDD/도메인 주도 설계 철저 입문

애그리게이트의 경계 구분하는 법 - 「도메인 주도 설계 철저 입문」 12장 (3)

 

애그리게이트의 예시

실무에서 `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;
}