파이썬으로 살펴보는 아키텍처 패턴 - 7장 (애그리게이트와 일관성 경계)

이동욱

2021/11/24

애그리게이트와 일관성 경계


모든 것을 스프레드 시트에서 처리하지 않는 이유


불변 조건, 제약, 일관성


애그리게이트란?


애그리게이트를 선택하기


하나의 애그리게이트 = 한 저장소


NOTE: 저장소가 애그리게이트만 반환해야 한다는 규칙은 애그리게이트가 도메인 모델에 접근할 수 있는 유일한 통로여야 한다는 관계를 강제로 지키게 하는 핵심 규칙이다. 이 규칙을 어기지 않도록 주의해야 한다.

def add_batch(
    ref: str, sku: str, qty: int, eta: Optional[date],
    uow: unit_of_work.AbstractUnitOfWork,
):
    with uow:
        product = uow.product.get(sku=sku)
        if not product:
            product = model.Product(sku=sku, batches=[])
            uow.products.append(model.Batch(ref, sku, qty, eta))
        product.batches.append(model.Batch(ref, sku, qty, eta))
        uow.batches.add(model.Batch(ref, sku, qty, eta))
        uow.commit()


def allocate(
    orderid: str, sku: str, qty: int,
    uow: unit_of_work.AbstractUnitOfWork,
) -> str:
    line = OrderLine(orderid, sku, qty)
    with uow:
        batches = uow.batches.list()
        if not is_valid_sku(line.sku, batches):
            raise InvalidSku(f"Invalid sku {line.sku}")
        batchref = model.allocate(line, batches)
        uow.commit()
    return batchref

정리


애그리게이트와 일관성 경계

-> 도메인에 속한 것을 바꿀 수 있는 방식을 제한하면 시스템을 더 쉽게 추론할 수 있다.

-> 애그리게이트의 역할은 관련된 여러 객체로 이루어진 그룹에 적용할 불변 조건에 대한 비즈니스 규칙을 관리하는 것이다.

-> 자신이 담당하는 객체 사이와 객체의 비즈니스 규칙 사이의 일관성을 검사하고, 어떤 변경이 일관성을 해친다면 이를 거부하는 것도 애그리게이트의 역할이다.

-> 동시성 검사 구현 방법을 고민하다 보면 결국에는 트랜잭션과 락에 도달하게 된다. 애그리게이트를 제대로 선택하는 것은 여러 분의 도메인을 개념적으로 잘 조직화하는 것 뿐 아니라 성능에 대한 문제이기도 하다.

참고 문헌


>> Home