도메인 기반 디자인이란 무엇입니까?


198

누군가 도메인 기반 디자인이 정확히 무엇인지 간결하게 설명해 주시겠습니까? 나는 그 용어를 꽤 많이 보았지만 그것이 무엇인지 또는 어떻게 생겼는지 이해하지 못한다. 비 도메인 기반 디자인과 어떻게 다릅니 까?

또한 누군가 도메인 개체가 무엇인지 설명 할 수 있습니까? 도메인은 일반 객체와 어떻게 다릅니 까?




이것이 귀하의 질문에 대답합니까? 도메인 기반 디자인 (DDD)이란 무엇입니까?
Satpal

답변:


112

편집하다:

이것이 Google에서 최고의 결과 인 것 같고 아래 내 답변이 그렇지 않으므로이 더 나은 답변을 참조하십시오.

https://stackoverflow.com/a/1222488/1240557

오래된 답변 (완전하지 :))

좋은 소프트웨어를 만들려면 해당 소프트웨어가 무엇인지 알아야합니다. 뱅킹이 무엇인지 잘 이해하지 못하면 뱅킹 소프트웨어 시스템을 작성할 수 없으며 뱅킹 영역을 이해해야합니다.

보낸 사람 : Eric Evans의 도메인 기반 디자인.

이 책은 DDD를 잘 설명합니다.

책의 요약을 등록 및 다운로드 , 또는 직접 요약을 다운로드 .


그 미니 버전은 훌륭한 참고 자료이며, 전체 텍스트 사본으로도 도움이됩니다. 나는 일반적으로 먼저 자세한 내용을 보려면 텍스트로갑니다.
Kyri Sarantakos

15
그래서 나는이 "이 책을 읽어라"라는 대답에서 DDD를 몇 단락으로 요약하는 것이 불가능하다는 답을 얻었습니다. 디자인 철학은 어떻게 그렇게 복잡 할 수 있습니까?
Robin Winslow

나는 그것이 불가능하다고 말하지는 않지만 그것에 대해 읽을 수있는 더 좋은 곳이 있다고 생각했고 Eric Evans 책이 imo의 가장 좋은 출처라고 생각합니다.
Mikael Östberg

6
친애하는 독자 : 나와 같은 Google 검색 결과에서 여기에 도착하여 허용되는 답변을 찾은 것에 실망하여 압도적 인 (사죄, Mikael) 두려워하지 않는다면 여기에 더 만족스러운 설명이 있습니다 : stackoverflow.com/a/1222488 / 1240557
kryger

3
거기에서 링크로 답변을 업데이트했습니다. 그것은 훨씬 더 나은 대답이었습니다. 감사!
Mikael Östberg

41

Domain Driven Design은 문제 도메인 내의 활동, 작업, 이벤트 및 데이터를 솔루션 도메인의 기술 아티팩트로 매핑하는 복잡한 시스템 개발을위한 방법론 및 프로세스 처방입니다.

Domain Driven Design의 강조점은 문제 영역의 추상 모델을 작성하여 특정 기술 세트에서 구현할 수 있도록 문제 영역을 이해하는 것입니다. 방법론으로서의 도메인 중심 설계는이 모델 개발 및 기술 개발로 인해 시스템을 사용하는 사람들의 요구를 충족시키는 동시에 문제 영역의 변화에도 견딜 수있는 시스템을 만드는 방법에 대한 지침을 제공합니다.

도메인 기반 설계의 프로세스 측면에는 도메인 전문가, 문제 도메인을 아는 사람들 및 설계 / 아키텍처 전문가, 솔루션 도메인을 아는 사람들 간의 협업이 포함됩니다. 아이디어는 공유 언어가있는 공유 모델을 가져서 서로 다른 두 가지 관점을 가진이 두 도메인의 사람들이 솔루션에 대해 토론 할 때 실제로 공유 개념을 가진 공유 기술 자료를 논의하고 있습니다.

특정 시스템을 필요로하는 사람들과 시스템을 설계하고 구현하는 사람들 사이의 공유 된 문제 영역 이해의 부족은 성공적인 프로젝트의 핵심 장애인 것 같습니다. 도메인 기반 디자인은이 장애를 해결하는 방법입니다.

그것은 객체 모델을 갖는 것 이상입니다. 문제의 영역 내에서 실제 요구 사항을 발견하고 해당 요구 사항을 충족시키기 위해 적절한 솔루션을 작성할 수 있도록 공유 커뮤니케이션 및 협업 개선에 중점을 둡니다.

도메인 주도 디자인 : 선과 도전 은이 의견에 대한 간략한 개요를 제공합니다.

DDD는 최상위 아키텍처를 발견하고 소프트웨어를 복제해야하는 도메인의 역학 및 역학에 대해 알려줍니다. 구체적으로, 잘 수행 된 DDD 분석은 도메인 전문가와 소프트웨어 설계자 간의 오해를 최소화하고 그에 따른 값 비싼 변경 요청을 줄입니다. 더 작은 컨텍스트에서 도메인 복잡성을 분할함으로써 DDD는 프로젝트 설계자가 부풀린 오브젝트 모델을 설계하지 않아도됩니다. 부풀린 오브젝트 모델은 구현 세부 사항을 처리하는 데 많은 시간이 손실되는 부분입니다. 회의실 화이트 보드의 크기.

또한 짧은 기사 를 제공하는 이 문서의 서비스 아키텍처위한 도메인 기반 설계도 참조하십시오 . 이 문서에서는 도메인 기반 디자인에 대한 다음 축소판 그림 설명을 제공합니다.

Domain Driven Design은 사용 사례와 관련된 비즈니스 현실을 기반으로 모델링을 옹호합니다. 이제는 나이가 들고 과대 광고 수준이 감소함에 따라 DDD 접근 방식이 실제로 문제를 이해하고 솔루션을 공통적으로 이해하도록 소프트웨어를 설계하는 데 실제로 도움이된다는 사실을 잊고 있습니다. 응용 프로그램을 작성할 때 DDD는 도메인 및 하위 도메인과 같은 문제에 대해 이야기합니다. 독립적 인 단계 / 문제 영역을 경계 컨텍스트로 설명하고, 이러한 문제에 대해 이야기 할 공통 언어를 강조하며, 구현을 지원하기 위해 엔티티, 가치 개체 및 집계 루트 규칙과 같은 많은 기술 개념을 추가합니다.

Martin Fowler는 방법론으로서 Domain Driven Design이 언급 된 많은 기사를 작성했습니다. 예를 들어이 기사 BoundedContext 는 Domain Driven Development의 경계 컨텍스트 개념에 대한 개요를 제공합니다.

어린 시절에 우리는 전체 비즈니스의 통합 모델을 구축하도록 권고 받았지만 DDD는 "대형 시스템에 대한 도메인 모델의 전체 통합이 실현 가능하지 않거나 비용 효율적이지 않을 것"이라는 것을 알게되었습니다 1 . 대신 DDD는 큰 시스템을 경계 컨텍스트로 분할합니다. 각 컨텍스트는 통합 모델을 가질 수 있습니다. 본질적으로 MultipleCanonicalModels을 구성하는 방법입니다.


20

먼저 다음을 이해함으로써 도메인 기반 설계 이해할 수 있습니다.

도메인이란 무엇입니까?

시스템이 구축되는 필드입니다. 공항 관리, 보험 판매, 커피 숍, 궤도 비행 등 이름을 지정합니다.

응용 프로그램이 여러 도메인에 걸쳐있는 것은 드문 일이 아닙니다. 예를 들어, 온라인 소매 시스템은 배송 (항목 및 목적지에 따라 적절한 배송 방법 선택), 가격 (예 : 위치 별 프로모션 및 사용자 별 가격 포함) 및 권장 사항 (계산 관련 분야)에서 작업 중일 수 있습니다. 구매 내역 별 제품).

모델이란 무엇입니까?

"문제에 대한 유용한 근사치." -게리 서스 만

Employee 클래스는 실제 직원이 아닙니다. 실제 직원을 모델링합니다. 우리는이 모델이 실제 직원에 관한 모든 것을 포착하지는 않는다는 것을 알고 있습니다. 현재 상황에 관심이있는 내용 만 캡처하기위한 것입니다.

서로 다른 도메인은 동일한 것을 모델링하는 다른 방법에 관심이있을 수 있습니다. 예를 들어, 급여 부서와 인사 부서는 직원을 다른 방식으로 모델링 할 수 있습니다.

도메인 모델이란 무엇입니까?

도메인 모델.

DDD (Domain-Driven Design) 란 무엇입니까?

도메인 모델을 깊이 평가하고이를 구현에 연결하는 개발 방식입니다. DDD는 Eric Evans가 공동으로 개발했으며 처음 개발했습니다.

여기서 추락


12

다음은 Domain Driven Design 에서 확인할 수있는 좋은 기사입니다 . 지원서가 대학 배정보다 심각한 경우. 기본 전제는 엔티티 주위의 모든 것을 구조화하고 강력한 도메인 모델을 가지고 있습니다. 인프라 관련 항목 (이메일 전송, 데이터 유지 등)을 제공하는 서비스와 실제로 핵심 비즈니스 요구 사항을 수행하는 서비스를 차별화하십시오.

희망이 도움이됩니다.


4

TDD & BDD에서와 마찬가지로 귀하 / 팀은 코드 구현보다 시스템의 테스트 및 동작에 가장 중점을 둡니다.

엔터티 / 클래스, 변수, 함수, 사용자 인터페이스 프로세스 등 시스템 분석가, 제품 소유자, 개발 팀 및 코드가 도메인 구동 설계라는 동일한 언어를 사용하여 통신 할 때와 유사한 방식

DDD는 사고 과정입니다. 소프트웨어 디자인을 모델링 할 때는 데이터 구조, 데이터 흐름, 기술, 내부 및 외부 종속성보다는 비즈니스 영역 / 프로세스를주의 중심에 두어야합니다.

DDD를 사용하여 systerm을 모델링하는 방법에는 여러 가지가 있습니다

  • 이벤트 소싱 (이벤트를 단일 진실 소스로 사용)
  • 관계형 데이터베이스
  • 그래프 데이터베이스
  • 기능적 언어 사용

도메인 객체 :

매우 순진한 말로

  • 비즈니스 프로세스 / 흐름에 따라 이름이 있습니다
  • 내부 상태를 완벽하게 제어합니다. 즉 상태를 조작하는 메소드를 노출시킵니다.
  • 항상 사용 맥락에서 모든 비즈니스 변형 / 비즈니스 규칙을 이행하십시오.
  • 단일 책임 원칙을 따릅니다

TDD-

BDD-

DDD - 도메인 개발에 힘 입어
니틴 babariya

DDD-

4

DDD (도메인 중심 디자인)는 프로젝트 요구 사항을 분석하고 이러한 요구 사항의 복잡성을 처리하는 데 유용한 개념으로, 클래스와 테이블 간의 관계를 고려하여 이러한 요구 사항을 분석하고 실제로 디자인은 데이터베이스 테이블을 기반으로합니다. 관계는 오래된 것이 아니지만 몇 가지 문제가 있습니다.

  • 복잡한 요구 사항이있는 큰 프로젝트에서는 이것이 소규모 프로젝트를위한 훌륭한 디자인 방법이지만 유용하지 않습니다.

  • 기술 개념이없는 기술 담당자가없는 경우이 충돌로 인해 프로젝트에 큰 문제가 발생할 수 있습니다.

따라서 DDD는 주요 프로젝트를 도메인으로 간주하고이 프로젝트의 각 부분을 경계 컨텍스트로 유명한 작은 조각으로 분할하고 각 조각이 다른 조각에 영향을 미치지 않는 첫 번째 문제를 처리합니다. 두 번째 문제는 기술 팀원과 기술 담당자는 아니지만 요구 사항에 대한 충분한 지식이있는 제품 소유자 간의 공통 언어 인 유비쿼터스 언어로 해결되었습니다.

일반적으로 도메인에 대한 간단한 정의 는 소유자와 다른 팀을 위해 돈을 버는 주요 프로젝트입니다.


1

다음 PDF가 더 큰 그림을 줄 것이라고 믿습니다. Eric Evans의 도메인 기반 디자인

참고 : 작업 할 수있는 프로젝트를 생각하고 이해 한 내용을 적용하고 모범 사례를 확인하십시오. 또한 마이크로 서비스 아키텍처 디자인 접근 방식으로 능력을 키울 수 있습니다.


0

나는 다른 사람들의 대답을 반복하고 싶지 않기 때문에 일반적인 오해를 설명합니다.

  • 실용 자료 : Scott Millett의 패턴, 원칙 및 도메인 기반 설계 실습
  • 복잡한 비즈니스 시스템을위한 방법론입니다. 비즈니스 전문가와 대화 할 때 모든 기술적 인 문제를 해결합니다.
  • 전체 개발 팀의 비즈니스에 대한 광범위한 이해 (단순화 및 증류 모델)를 제공합니다.
  • 개발자 팀 내에서 또는 다른 팀과의 의사 소통에 사용되는 유비쿼터스 언어 (전체 개발자 팀, 비즈니스 전문가, 비즈니스 분석가 등이 이해하는 언어) 를 사용하여 비즈니스 모델을 코드 모델과 동기화 합니다.
  • 프로젝트 관리와는 아무런 관련이 없습니다 . Agile과 같은 프로젝트 관리 방법에 완벽하게 사용될 수 있습니다.
  • 프로젝트 전체에서 사용하지 않아야합니다.

    DDD는 핵심 하위 도메인에 가장 많은 노력을 집중할 필요성을 강조합니다. 핵심 하위 도메인은 제품 영역에서 성공과 실패의 차이가됩니다. 그것은 제품의 고유 한 판매 지점이며, 제품이 아닌 오히려 건설되는 이유입니다.

    기본적으로 시간과 노력이 너무 많이 걸리기 때문입니다. 따라서 전체 도메인을 하위 도메인으로 분류하고 비즈니스 가치가 높은 도메인에 적용하는 것이 좋습니다. (예 : 이메일과 같은 일반 하위 도메인에는 해당되지 않음)

  • 객체 지향 프로그래밍이 아닙니다. 대부분 문제 해결 방식이며 때로는 도메인 모델에서 OO 패턴 (예 : Gang of Four)을 사용할 필요가 없습니다. 단순히 비즈니스 전문가가 이해할 수 없기 때문에 (공장, 장식 자, ...에 대해 많이 알지 못함). DDD에는 OO 개념과 100 % 일치하지 않는 일부 패턴 (예 : 트랜잭션 스크립트, 테이블 모듈)도 있습니다.

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