DDD에서 큰 집계를 만드는 방법
계속 읽기 전에 DDD 및 관련 개념에 대해 잘 알고 있다고 가정합니다(소개를 포함하지 않은 점에 대해 죄송합니다. DDD에 대한 소개 기사가 이미 너무 많아서 다른 글을 쓰고 싶지는 않습니다.) .
문제
그렇다면 DDD에 어떤 문제가 있습니까? 대규모 집계 구현(설계가 아닌 구현에 중점). 내가 크다고 말할 때, 나는 그것들이 많은 다른 엔티티나 많은 종속성을 포함한다는 것을 의미하는 것이 아니라 동일한 엔티티의 많은 인스턴스를 포함한다는 것을 의미합니다. 예를 들어 은행 계좌 집계에는 거래라는 하나의 하위 엔터티가 있습니다. 이제 해당 은행 집계에는 해당 엔터티의 수백 또는 수천 인스턴스가 있을 수 있습니다.
내 회사 도메인이
Roads
및 Stops
정도라고 가정해 보겠습니다(예시일 뿐입니다). 둘 다 정체성이 있기 때문에 실체입니다. 이 경우 Road
는 루트 집계이고 Stop
는 해당 집계의 자식 엔터티입니다. 각각 2개 또는 3개의 필드가 있다고 가정해 보겠습니다. 실제로는 중요하지 않습니다. 다음은 Python에서 해당 모델을 빠르게 구현한 것입니다(데이터 클래스를 사용하지 않았으며 이 토론에서 중요하지 않기 때문에 많은 논리가 누락됨).class Road:
id: int
name: str
stops: [Stop]
...
class Stop:
id: int
latitude: int
longitude: int
...
이제 스토리지에서 해당 엔티티를 검색하기 위해 리포지토리를 생성해야 합니다. 몇 가지 SQL 쿼리나 파일 읽기 또는 원하는 것을 선택하면 충분합니다. 이것이 우리의 리포지토리라고 가정해 보겠습니다(인터페이스, 종속성 주입 등은 이 경우와 관련이 없으므로 피합시다).
class RoadRepository:
def get(id: int) -> Road:
...
def save(road: Road) -> None:
...
충분히 쉽죠? 좋아, 우리 모델을 계속 구현하자.
get
방법은 정말 쉽지만 save
방법에는 숨겨진 복잡성이 많이 있습니다. postgres
와 같은 관계형 데이터베이스를 사용하여 엔터티를 저장한다고 가정해 보겠습니다. roads
와 stops
라는 두 개의 테이블이 있고 관계 등이 있다고 가정해 보겠습니다.save
메서드를 구현하려면 모든 하위 엔터티를 업데이트해야 합니다. 그리고 그것이 문제입니다. Road
인스턴스에 345개의 서로 다른 정류장이 있는 경우 어떻게 됩니까? 어떻게 업데이트합니까? 이에 대한 최종 답변은 없지만 몇 가지 제안이 있습니다!솔루션 1
이것은 무차별 대입으로 문제를 해결하는 것과 같습니다. 모든 것을 삭제하고 다시 생성하십시오.
소품
단점
솔루션 2
집계 수준에서 모든 변경 사항을 추적합니다. 이 같은:
class Road:
id: int
name: str
stops: [Stop]
def update_stop(self, stop: Stop):
... some logic to update the list ...
self._changes.append({
'type': 'UPDATE',
'stop': stop,
})
그런 다음 리포지토리에서 해당 변경 사항 목록을 읽고 개별적으로 적용합니다(또는 변경 유형에 따라 대량으로, 예를 들어 삭제, 생성 등을 함께 그룹화할 수 있음).
소품
단점
토론할 시간입니다!
이 문제에 대해 어떻게 생각하세요? 전에 직면한 적이 있습니까? 추가 솔루션이 있습니까? 댓글 달아주시면 상담해드리겠습니다 :)
Reference
이 문제에 관하여(DDD에서 큰 집계를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/antoniogamiz/how-to-create-big-aggregates-in-ddd-1fno텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)