DDD (Domain-Driven Design) 개념에 대해 살펴보면서 특히 도메인 격리 및 지속성 모델과 관련하여 이상한 원칙을 발견했습니다. 기본 이해는 다음과 같습니다.
- 기능 세트를 제공하는 응용 프로그램 계층의 서비스는 기능을 수행하는 데 필요한 리포지토리에서 도메인 개체를 요청합니다.
- 이 저장소의 구체적인 구현은 구현 된 스토리지에서 데이터를 가져옵니다.
- 이 서비스는 비즈니스 논리를 캡슐화하는 도메인 개체에 상태를 수정하는 특정 작업을 수행하도록 지시합니다.
- 서비스는 리포지토리에 수정 된 도메인 개체를 유지하도록 지시합니다.
- 저장소는 도메인 오브젝트를 스토리지의 해당 표시에 다시 맵핑해야합니다.
위의 가정을 감안할 때 다음은 어색한 것 같습니다.
광고 2 ::
도메인 모델은 요청한 기능에 필요하지 않더라도 전체 도메인 객체 (모든 필드 및 참조 포함)를로드하는 것 같습니다. 다른 도메인 객체를 참조하는 경우 해당 도메인 객체와 해당 객체를 차례로 참조하는 등의 작업을 수행하지 않는 한 완전히로드하지 못할 수도 있습니다. 게으른 로딩을 염두에 두어야합니다. 그러나 먼저 리포지토리를 담당해야하는 도메인 개체를 쿼리하기 시작합니다.
이 문제가 발생하면 도메인 개체를로드하는 "올바른"방법은 각 사용 사례에 대해 전용로드 기능이있는 것 같습니다. 그런 다음 이러한 전용 기능은 설계된 사용 사례에 필요한 데이터 만로드합니다. 어색함이 작용하는 위치는 다음과 같습니다. 먼저 리포지토리의 각 구현에 대해 상당한 양의 로딩 기능을 유지해야하며 도메인 객체는 null
해당 필드를 수행하는 불완전한 상태 가됩니다. 값이로드되지 않은 경우 값을 요청한 기능에 필요하지 않기 때문에 후자는 기술적 으로 문제가되지 않습니다. 여전히 어색하고 잠재적 인 위험이 있습니다.
광고 3 .:
리포지토리에 대한 개념이없는 경우 도메인 개체가 구성시 고유성을 제한하는 방법은 무엇입니까? 예를 들어, User
고유 한 사회 보장 번호 (주어진) 를 사용하여 새로 작성하려는 경우, 데이터베이스에 정의 된 고유성 제한 조건이있는 경우에만 저장소에 오브젝트를 저장하도록 요청할 때 가장 빠른 충돌이 발생합니다. 그렇지 않으면, 새로운 User
사회 보장국을 만들기 전에 주어진 사회 보장국에서로 를 찾아서 존재하는 경우 오류를보고 할 수 있습니다. 그러나 제약 조건 검사는 해당 서비스가 속한 도메인 개체가 아닌 서비스에 존재합니다. 방금 도메인 객체가 유효성 검사를 위해 (주입 된) 리포지토리를 사용할 수 있다는 것을 깨달았습니다.
광고 5 .:
도메인 개체가 언더 레이 데이터를 직접 수정하는 것과 비교하여 작업 집약적 인 프로세스로 저장소 개체에 도메인 개체의 매핑을 인식합니다. 물론, 구체적인 스토리지 구현을 도메인 코드에서 분리하는 것은 필수 전제 조건입니다. 그러나 실제로 그렇게 높은 비용이 듭니까?
분명히 ORM 도구를 사용하여 매핑을 수행 할 수있는 옵션이 있습니다. 그러나 종종 ORM의 제한 사항에 따라 도메인 모델을 설계하거나 도메인 객체에서 예를 들어 ORM 주석을 사용하여 도메인에서 인프라 계층으로의 종속성을 도입해야합니다. 또한 ORM에 상당한 계산 오버 헤드가 발생한다는 것을 읽었습니다.
ORM과 유사한 개념이 거의없는 NoSQL 데이터베이스의 경우 도메인 모델에서 어떤 속성이 변경되었는지 추적하는 방법은 save()
무엇입니까?
편집 : 또한 리포지토리가 도메인 개체의 상태 (예 : 각 필드의 값)에 액세스하려면 도메인 개체가 캡슐화를 방해하는 내부 상태를 나타내야합니다.
일반적으로 :
- 트랜잭션 로직은 어디로 갈까요? 이것은 확실히 지속성에 특정한 것입니다. 일부 스토리지 인프라는 인 메모리 모의 리포지토리와 같은 트랜잭션도 전혀 지원하지 않을 수 있습니다.
- 여러 개체를 수정하는 대량 작업의 경우 개체의 캡슐화 된 유효성 검사 논리를 거치려면 각 개체를 개별적으로로드, 수정 및 저장해야합니까? 이는 데이터베이스에서 단일 쿼리를 직접 실행하는 것과 반대입니다.
이 주제에 대한 설명을 부탁드립니다. 내 가정이 맞습니까? 그렇지 않은 경우 이러한 문제를 해결하는 올바른 방법은 무엇입니까?