본문 바로가기
DDD

[Aggregate] 규칙 : 일관성 경계

by kooangelo 2024. 9. 3.

 

규칙: 진짜 고정자를 일관성 경계 안에 모델링하라

바운디드 컨텍스트(2)에서 애그리게잇을 찾으려면 모델의 진짜 고정자(Invariant)를 이해해야 한다.
이를 알아야만 주어진 애그리게잇으로 묶어야 할 객체가 무엇인지 결정할 수 있다.

고정자(Invariant)는 언제나 일관성을 유지해야만 한다는 비즈니스 규칙이다.
일관성에는 여러 종류가 있다. 
그중 한 가지는 트랜잭션적 일관성 consistency인데, 이는 즉 각적이고 원자적이라 간주된다. 
또 한 가지로 결과적 일관성 eventual consistency이 있다.
고정자에 관한 논의는 트랜잭션적 일관성과 관련이 있다. 

일관성 경계는 어떤 오퍼레이션이 수행되든 상관없이 경계 안의 모든 대상이 특정 비즈니스 고정자 규칙 집합을 준수하도록 논리적으로 보장해준다. 이 경계 밖의 일관성은 애그리게잇과 무관하다.

그러므로 애그리게잇은 트랜잭션적 일관성 경계와 동의어다.

전형적인 영속성 메커니즘을 사용하면 단일 트랜잭션을 사용해 일관성을 관리한다.
트랜잭션이 커밋하는 시점에서 하나의 경계 안에 속한 모든 것이 반드시 일관성을 유지해야 한다.
올바르게 설계된 애그리게잇은 단일 트랜잭션 내에서 완벽한 일관성을 유지하면서,
비즈니스적으로 요구되는 모든 방식과 그 고정자에 맞춰 수정될 수 있어야 한다.

또한 바르게 설계된 바운디드 컨텍스트는 어떤 상황에서든 한 트랜잭션당 한 애그리게잇 인스턴스만을 수정한다.
더 중요한 점은 트랜잭션 분석을 진행하지 않으면 애그리게잇 설계를 올바르게 판단할 수 없다는 점이다.

한 트랜잭션당 한 애그리게잇 인스턴스를 수정하도록 제한한다는 점이 너무 엄격하게 느껴질 수 있다.
그러나 이는 경험 법칙에 따른 것으로 대부분의 상황에선 이를 목표로 해야 한다.
이는 애그리게잇을 사용하는 가장 중요한 이유이기 때문이다.

애그리게잇이 일관성에 초점을 두고 설계돼야 한다는 사실은, 사용자 인터페이스는 단일 커맨드가 단 하나의 애그리게잇 인스턴스상에서만 수행되도록 매 요청마다 집중해야 함을 의미한다. 사용자의 요구사항이 너무 일을 수행하려 한다면 애플리케이션이 한 번에 여러 인스턴스를 수정하도록 강요하게 된다.

 - Implementing Domain-Driven Design 도메인 주도 설계 구현, 반 버논 p457~458