내가 이해하는 것처럼 주요 요점은 도메인 로직 (Business Logic)을 인프라 (DB, 파일 시스템 등)에서 분리하는 것입니다.
이것은 오해의 기초입니다. DDD의 목적은 "이것은 SQL 서버에 있으므로 BL이 아니어야합니다."와 같이 하드 라인을 따라 사물을 분리하는 것이 아니라 DDD의 목적은 도메인을 분리하고 사이에 장벽을 만드는 것입니다. 도메인 의 내부를 다른 도메인의 내부와 완전히 분리 할 수 있으며 도메인간에 공유 외부를 정의 할 수 있습니다.
"SQL에 있음"을 BL / DL의 장벽으로 생각하지 마십시오. 대신 "이것은 내부 영역의 끝이다"를 장벽으로 생각하십시오.
각 도메인에는 다른 모든 도메인 에서 작동 할 수있는 외부 API가 있어야 합니다. 데이터 스토리지 계층 의 경우 데이터 스토리지 계층에 대해 CRUD (읽기 / 쓰기) 작업이 있어야합니다. 이 수단의 SQL 자체가 정말 장벽없는의 VIEW
및 PROCEDURE
구성 요소입니다. : 당신은 테이블에서 직접 읽어 본 적이해야 외부 소비자로, 우리는 걱정하지 말아야한다는 DDD는 우리에게 구현 세부입니다.
귀하의 예를 고려하십시오.
내가 궁금한 것은 Material Resource Calculation Query와 같은 매우 복잡한 쿼리가있을 때 어떻게됩니까? 그런 종류의 쿼리에서는 SQL이 설계된 종류의 무거운 집합 작업을 사용합니다.
이것은 정확히 SQL에 있어야하는 것이며 DDD를 위반하지 않습니다. 그건 우리가 DDD를 만들 었는지 . SQL에서 계산 하면 BL / DL의 일부 가됩니다 . 당신이 할 일은 별도의 뷰 / 저장 프로 시저 / 무엇을 가지고 있고 비즈니스 로직을 외부 API 와 같이 데이터 계층과 분리 하는 것 입니다. 실제로 데이터 계층은 다른 DDD 도메인 계층이어야하며, 데이터 계층에는 다른 도메인 계층과 작업하기위한 자체 추상화가 있습니다.
DDD 패턴은 도메인 계층을 변경하지 않고 MongoDB에 SQL Server와 같은 동일한 기능이 없다는 것을 알기 때문에 인프라에서 이러한 계산을 수행 할 수도 없습니다.
그것은 또 다른 오해입니다 : 그것은 구현 세부 사항이 다른 도메인 계층을 변경하지 않고 내부적으로 변경 될 수 있다고 말합니다 . 전체 인프라를 교체 할 수 있다고 말하는 것은 아닙니다 .
DDD는 잘 정의 된 외부 API로 내부를 숨기는 것에 관한 것입니다. API의 위치는 완전히 다른 질문이며 DDD는 그것을 정의하지 않습니다. 단순히 이러한 API가 존재 한다는 것을 정의 하며 절대로 변경해서는 안됩니다 .
DDD는 MSSQL을 MongoDB로 임시 대체 할 수 있도록 설정되지 않았습니다.이 두 가지는 완전히 다른 인프라 구성 요소입니다.
대신, DDD가 정의한 것에 대한 비유를 사용합시다 : 가스 대 전기 자동차. 두 차량에는 추진력을 생성하기위한 완전히 다른 두 가지 방법이 있지만 온 / 오프, 스로틀 / 브레이크 및 차량을 추진하는 휠과 같은 API가 있습니다. DDD는 자동차의 엔진 (가스 또는 전기)을 교체 할 수 있어야한다고 말합니다. 자동차를 오토바이로 교체 할 수 있다고 말하는 것은 아니며, MSSQL → MongoDB의 효과입니다.