집계 루트 란 무엇입니까?


447

리포지토리 패턴을 올바르게 사용하는 방법에 대해 머리를 숙이고 있습니다. 집계 루트의 중심 개념이 계속 나타납니다. 집계 루트가 무엇인지에 대한 도움을 얻기 위해 웹과 스택 오버플로를 모두 검색 할 때 기본 정의가 포함되어야하는 페이지에 대한 토론과 죽은 링크를 계속 찾습니다.

리포지토리 패턴의 맥락 에서 집계 루트 란 무엇입니까?


16
다음 사례 연구를 검토하십시오. 효과적인 집계 디자인 1 부 : 단일 집계 모델링 dddcommunity.org/wp-content/uploads/files/pdf_articles/… 2 부 : 집계가 함께 작동 하도록 dddcommunity.org/wp-content/uploads/files/pdf_articles/… 3 부 : 발견을 통한 통찰력 얻기 dddcommunity.org/wp-content/uploads/files/pdf_articles/…
Ben Vitale

답변:


310

리포지토리 패턴의 맥락에서 집계 루트는 클라이언트 코드가 리포지토리에서로드하는 유일한 개체입니다.

리포지토리는 하위 객체에 대한 액세스를 캡슐화합니다. 호출자의 관점에서 루트가로드되는 동시에 또는 실제로 필요할 때 (지연 한로드와 같이) 자동으로로드됩니다.

예를 들어 Order여러 LineItem개체 에 대한 작업을 캡슐화 하는 개체 가있을 수 있습니다 . 클라이언트 코드는 LineItem객체를 직접 로드하지 않으며 객체 Order가 포함 된 객체 만 도메인의 해당 부분에 대한 집계 루트가됩니다.


21
가설 상, 클라이언트 코드가 다른 목적을 위해 LineItem을 필요로한다면, 별도의 집계를 형성 할 것입니까 (주문 객체와 관련이없는 다른 객체가 있다고 가정)?
Ahmad

20
@Ahmad, 다른 집계는 광고 항목을 읽기 전용 데이터로 참조 할 수 있지만 변경할 수는 없습니다 . 다른 집계가이를 변경할 수있는 경우 광고 주문의 불변 항목 (또는 광고 항목)을 보호 할 수 없습니다.
Jeff Sternal

4
lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… 예를 살펴보십시오 . 이 예에서 고객은 주문에 변하지 않습니다. 그러나 고객이 또 다른 집계 루트가 될 수 있습니까? 아니면 여기에 기본적인 이해가 부족합니까?
Ahmad

3
@Jeff 당신은 "그들은 그것들을 바꿀 수 없다"고 말했다.
Neil Barnwell

4
@ Neil : 사용 가능한 언어 메커니즘을 사용하여 예를 들어 데이터를 나타내는 불변 클래스를 작성하여 시행합니다.
Jeff Sternal

206

에반스 DDD에서 :

AGGREGATE는 데이터 변경을 목적으로하는 단위로 취급되는 관련 개체의 클러스터입니다. 각 AGGREGATE에는 근과 경계가 있습니다. 경계는 AGGREGATE 내부의 내용을 정의합니다. 루트는 AGGREGATE에 포함 된 단일의 특정 ENTITY입니다.

과:

루트는 외부 객체가 [.]에 대한 참조를 보유 할 수있는 AGGREGATE의 유일한 멤버입니다.

이는 집계 루트가 저장소에서로드 할 수있는 유일한 오브젝트임을 의미합니다.

예는 Customer엔터티와 엔터티를 포함하는 모델 Address입니다. 우리는 Address모델과 관련된 엔터티가 없으면 모델에서 직접 엔터티에 액세스 하지 않습니다 Customer. 그래서 우리는 말할 수 Customer있고 Address함께 집합체를 형성합니다. 그리고 그것은 Customer집합체 루트입니다.


57
Eric Evans의 업데이트 : 집계 루트는 트랜잭션 / 동시성에 대한 일관성 경계이며 외부 엔티티가 다른 집계의 하위 엔티티에 대한 참조를 보유 할 수 없음을 강조합니다.
Brian Low

3
그래서 그 말은 영원히 나를 혼란스럽게합니다. Each AGGREGATE has a rootThe root is the only *member* of the AGGREGATE-이 verbage를 루트가 집계에 속성입니다 것을 의미한다. 그러나 모든 예제에서 다른 방법은 다음과 같습니다. 루트에는 집계 속성이 포함됩니다. 당신은 명확히 할 수 있습니까?
Sinaesthetic

1
내 언어를 제대로 이해하기 위해 Customer클래스가 집계 루트 또는 Customer 인스턴스로 간주 됩니까?
Joe

1
일반적으로 고객 주문 라인 항목 패러다임에서 고객은 총계 루트가됩니다. 고객의 인스턴스는 해당 집계 루트의 인스턴스입니다. Customer라는 집계 루트에 대해 말할 때 고객의 인스턴스를 구성하는 고객의 논리적 구성에 대해 이야기합니다. 고객 모음은 모음 일뿐입니다.
이브라힘 말 루프

111

집계 루트는 간단한 아이디어를위한 복잡한 이름입니다.


일반적인 아이디어

잘 설계된 클래스 다이어그램은 내부를 캡슐화합니다. 이 구조에 액세스하는 지점을이라고 aggregate root합니다.

여기에 이미지 설명을 입력하십시오

솔루션 내부는 매우 복잡 할 수 있지만이 계층의 사용자는을 사용 root.doSomethingWhichHasBusinessMeaning()합니다.


이 간단한 클래스 계층 구조를 확인하십시오. 여기에 이미지 설명을 입력하십시오

차를 어떻게 타고 싶니? 더 나은 API 선택

옵션 A (어떻게 작동하는지) :

car.ride();

옵션 B (사용자는 클래스 inernals에 액세스 할 수 있음) :

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

그 옵션 A가 더 좋다고 생각하면 축하합니다. 당신은 뒤에 주요 이유가 있습니다 aggregate root.


집계 루트는 여러 클래스를 캡슐화합니다. 기본 개체를 통해서만 전체 계층 구조를 조작 할 수 있습니다.


17
예를 좋아하지만 고객이 엔진을 참조해야하는 시나리오를 찾는 데 어려움을 겪고 있습니다. 엔진이 자동차 뒤에 캡슐화되어있는 것 같습니다. 이것에 대해 좀 더 자세히 설명해 주시겠습니까?
emragins

제 생각에는 엔진 자체가 자동차 전용 모델 안에 있어야합니다 (예 : 3000cc 엔진이 장착 된 BMW 시리즈 5). 이 모델링에서 엔진은 자동차의 구성 요소입니다.
Parama Dharmika

1
@ParamaDharmika는 그런 식으로 모델링 할 수 있습니다. 그것은 고객과 자동차의 '고급'에 달려 있습니다. 기본 모델에서는 car루트 를 집계 할 수 있어야 합니다. 도면에서와 같은 상황을 허용 할 수도 있습니다. 올바른 솔루션은 비즈니스 응용 프로그램 모델에 따라 다릅니다. 경우에 따라 다를 수 있습니다.
Marcin Szymczak

1
@MarcinSzymczak 맞습니다. 솔루션이 도메인 모델 자체에 의존한다는 것에 더 동의 할 수 없었습니다
Parama Dharmika

실제로 휠은 타이어 (및 기타 부품)를 포함하는 집합체입니다. 규칙에 따라 휠 집계가 Car Root-Aggregate를 통해서만 액세스 할 수 있어야하는 경우 엔진도 Car Root Aggregate 내에 포함되며 자동차 외부에서는 액세스 할 수 없습니다. 그것은 Car 인스턴스의 영역에 있습니다. 자동차 소유자 (고객)는 자신의 자동차 상황을 제외하고는 엔진을 참조하지 않습니다.
이브라힘 말 루프

35

컴퓨터 엔터티가 있다고 가정하면이 엔터티는 소프트웨어 엔터티 및 하드웨어 엔터티 없이도 살 수 없습니다. 이들은 Computer도메인의 컴퓨터 부분에 대한 미니 생태계 인 집합체를 형성 합니다.

집계 루트는 집계 내부의 모선 엔터티 (이 경우 Computer)이며 저장소가 집계 루트 인 엔터티 만 작동하도록하는 것이 일반적이며이 엔터티는 다른 엔터티를 초기화합니다.

집계 루트를 집계의 시작점으로 고려하십시오.

C # 코드에서 :

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

하드웨어도 ValueObject 일 수 있음을 명심하십시오 (자체적으로 ID가없는 경우).


6
where T : IAggregateRoot-이것은 나의 하루를 만들었습니다
Cristian E.

그 말은 약간 모순적입니다. 제 생각에는 이것이 이것을 배우려고 할 때 혼란 스럽습니다. 당신은 컴퓨터가 집합이라고 말하지만, 루트는 집합 내부에 모회사가 될 것입니다. 그렇다면이 예제에서 집합 내의 "모성"엔터티는 어느 것입니까?
Sinaesthetic

미래의 인사!. 그 사람의 의미는 컴퓨터 자체가 집계 루트이고 컴퓨터와 컴퓨터 내부의 모든 것이 집계라는 것입니다. 또는 더 명확하게는, 그 자체가 사례는 집계 루트이고 전체 컴퓨터는 집계 (RGB 조명, 하드웨어, 전원 공급 장치, OS 등 "컴퓨터를 구성하는 모든 것의 집합")입니다.
Kenpachi

IAggregateRoot 기술은 다음 Microsoft 설명서에 나와 있습니다. docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson

16

데이터베이스 우선 접근 방식을 따르는 경우 루트는 일반적으로 일대 다 관계의 1면에있는 테이블입니다.

가장 일반적인 예는 사람입니다. 각 사람은 많은 주소, 하나 이상의 급여 명세서, 송장, CRM 항목 등을 가지고 있습니다. 항상 그런 것은 아니지만 9/10 배입니다.

우리는 현재 전자 상거래 플랫폼에서 작업하고 있으며 기본적으로 두 가지 루트가 있습니다.

  1. 고객
  2. 판매자

고객은 연락처 정보를 제공하고 거래를 할당하며 거래는 품목을 얻는 등

판매자는 제품을 판매하고 사람들에게 연락하며 페이지 정보, 특별 행사 등을 제공합니다.

이들은 각각 고객 및 판매자 저장소에 의해 처리됩니다.


8
데이터베이스 우선 접근 방식을 따르는 경우 도메인 기반 디자인을 연습하지 않고 데이터 기반 디자인을 따르는 것입니다.
Sinaesthetic

5
사람들이 문제를 해결하거나 배우기위한 Q & A 포럼입니다. 그것은 당신을 찌르지 않았습니다. 정의에 따르면 DDD는 다른 무엇보다 사고 방식이며 많은 사람들에게 혼란을 주므로 DDD를 배우는 사람들이 디자인 방법론의 잠재적 인 혼란을 완화하기 위해 노력하고 있습니다.
Sinaesthetic

12

디나 :

리포지토리 컨텍스트에서 집계 루트는 상위 엔터티가없는 엔터티입니다. 그것은 존재, 그것이 부모의 정체성에 의존하는 0, 하나 또는 많은 어린이 엔티티를 포함합니다. 그것은 저장소에서 일대 다 관계입니다. 이러한 아동 단체는 일반 집계입니다.

여기에 이미지 설명을 입력하십시오


1
그래서, 당신이 자동차 판매자라면, 자동차는 그 자체로 총 루트가 될까요? 아직 고객이없는 많은 자동차를 가질 수 있기 때문에
JorgeeFG

2
@ JogeeFG 진정한 대답은 아무도 단서가 전혀 없다는 것입니다. 충돌하는 정보가 너무 많습니다.
Mardoxx

3
하위 엔터티는 집계가 아니라 집계 루트가 제어하는 ​​집계의 구성원이되는 엔터티입니다. "집계"는 엔티티 의 논리적 그룹입니다.
Sinaesthetic

@JorgeeFG 실제로 디자인하려는 경계 컨텍스트에 따라 다릅니다. 당신이 자동차 판매자라면, Carshop과 같은 것이 집합 루트가되고, 그 아래에서 자동차를 따라갑니다.
jokab

8

A로부터 깨진 링크 :

골재 안에는 골재 뿌리가 있습니다. 총계 루트는 총계 내의 다른 모든 엔티티 및 가치 개체에 대한 상위 엔터티입니다.

리포지토리는 집계 루트에서 작동합니다.

자세한 내용은 여기를 참조하십시오 .


4
감사합니다. 그것은 내가 지속적으로 겪었던 가장 흔하고 실망스러운 깨진 링크입니다.
Dinah

또한 표현은 거꾸로 보입니다. 뿌리가 어떻게 aggreate 내에 있고 동시에 부모가 될 수 있습니까?
Sinaesthetic

1
집계 루트는 루트 클래스입니다. 일반 집계는 항상 집계 루트 내에 포함됩니다. 위에 제시된 다이어그램 사용 ... 고객은 집합 루트입니다. 고객은 하나 이상의 자동차를 소유 할 수 있습니다. 자동차는 고객과 관련하여 집계됩니다. 자동차에는 엔진이 있습니다. 엔진은 Car Aggregate에 포함 된 Aggregate입니다. 고객을 총체적 루트로 만드는 것은 자동차 또는 자동차의 구성 요소에 대한 액세스가 항상 자동차를 소유 한 고객을 통해 이루어진다는 모델의 가정입니다.
이브라힘 말 루프

8

집합 은 무언가의 수집을 의미합니다.
루트<html>웹 페이지 문서의 노드 와 같은 모든 것에 액세스 할 수있는 트리의 최상위 노드와 같습니다 .
블로그 유추, 사용자는 많은 게시물을 가질 수 있고 각 게시물은 많은 댓글을 가질 수 있습니다. 따라서 사용자를 가져 오면 모든 관련 게시물과 해당 게시물의 추가 의견에 액세스하는 루트 역할을 할 수 있습니다 . 이들은 모두 수집 또는 집계 라고합니다


1

집계는 액세스 사고 집계 루트를 제한하여 불변량을 보호하고 일관성을 유지하는 곳입니다. 집계는 데이터베이스 관계가 아닌 프로젝트 비즈니스 규칙 및 변형을 기반으로 설계해야합니다. 리포지토리를 주입해서는 안되며 쿼리는 허용되지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.