Replies: 1 comment
-
|
Projection이 아닌 Domain의 Aggregate Root Entity를 전체 로드하는 행위가 변경의 여지를 준다는 부분만으로 저는 설득당해버렸습니다 👍👍 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
본 논의는 CQRS 및 DDD 맥락에서 Command Handler가 Read Model 또는 다른 데이터를 참조해도 되는가, 참조는 어떤 형태로 하는 것이 올바른 가에 대한 질문에서 출발하였습니다.
상황
댓글(comment)를 생성할 때 유저의 id와 닉네임을 가지고 와야 하는데, 다른 Aggregate의 데이터를 가져올 때 전체 Aggregate의 데이터를 전체 다 가져올 필요가 있을까?
최소한의 형태로 프로젝션으로 바로 가져오고 조립만 하는 형태라면, command handler를 가볍게 유지할 수 있다고 생각합니다.
논의와 고민의 결론
다른 Aggregate를 참조할 때 어떤 방식으로 가져와야하는지 구분해야한다고 생각하고, 구분 기준은 "검증의 성격" 이라고 생각합니다.
다른 Aggregate의 동적인 상태나 비즈니스 규칙에 따라(ex. 신고가 10번된 회원은 댓글 달기 금지) command의 허용 여부가 결정되는 경우, 해당 Aggregate는 반드시 전체를 로드하여 내부 도메인 로직을 통해 검증해야합니다.
이 과정에서 저는, 다른 Aggregate의 상태나 규칙이 Command의 허용 여부에
직접적인 영향을 미치는 경우에 한해, 해당 Aggregate의 생명주기 경계 안에서 검증이 이루어져야 한다고 생각합니다.
반면, 댓글 작성자와 같은 Command 수행에 필요한 최소한의 값(value)을 복사하는 경우, Aggregate 전체를 로드하는 것은 오히려 DDD 경계를 침범할 우려가 있다고 생각합니다.
왜 경계를 침범할 수 있다고 생각하는가?
이 말을 직역하면, 다른 Aggregate Root를 로드하는 행위는 곧 그 Aggregate의 불변식(Invariants)을 영향을 미칠 수 있는 권한을 가집니다.
따라서 의도하지 않은 Aggregate Root의 로드 행위는 상태 전이 변경의 여지를 남긴다고 생각합니다.
command-side Snapshot 개념의 도입
본 논의를 토대로 다음과 같은 개념의 도입하면 어떨까 생각합니다.
Command-side Snapshot은 특정 Command 수행을 위해 필요한 최소한의 정보만을 담은 불변 값 객체로, 다른 Aggregate의 상태를 “참조”하는 것이 아니라 “값으로 복사”하는 역할을 수행한다. 이는 UI를 위한 Read Model과 명확히 구분되어야 하며, 조회(Query) 계층에서 재사용되는 순간 Command 모델이 UI 변화에 종속되는 문제가 발생한다. 따라서 Snapshot은 Command 전용으로 제한되어야 한다.
폴더 구조에 대한 형태는 아래와 같은 방식으로 구성하였습니다
더 나아가서: 여러 Aggregate 검증 시 트랜잭션 전략
마지막으로 여러 Aggregate에 대한 검증 또는 변경이 동시에 필요한 경우의 트랜잭션 전략을 생각했습니다. 여러 Aggregate의 상태를 검증만 하고 실제 변경은 하나의 Aggregate에서만 발생하는 경우에는 단일 트랜잭션이 허용될 수 있습니다. 그러나 여러 Aggregate를 동시에 변경해야 하는 경우에는 단일 트랜잭션으로 묶는 방식은 지양되어야 하며, 이벤트 기반의 Saga(Process Manager)를 통해 각 Aggregate를 독립적인 트랜잭션으로 조율하는 방식이 바람직하다고 생각합니다.
Reference
(https://groups.google.com/g/dddcqrs/c/ut793yzu7Tk?utm_source=openai&pli=1)
Beta Was this translation helpful? Give feedback.
All reactions