모두를 위한 DDD

도메인 모델, 보편 언어, 바운디드 컨텍스트를 포함한 DDD의 전략 개념들을 알아보자

김승수
오토피디아
5 min readJun 7, 2023

--

들어가며

대부분의 소프트웨어는 현실에 존재하는 특정한 문제를 해결하기 위해 존재합니다. 만약 해결하려는 문제가 아주 복잡하다면 그 문제를 해결하는 소프트웨어도 복잡해질 수 밖에 없습니다. 개발자는 소프트웨어를 잘 설계하여 이러한 복잡성을 통제해야 합니다. 설계 요소에는 어떤 데이터를 어떤 데이터베이스에 어떻게 저장할 지, 네트워크를 어떻게 설계할 지, API를 REST, GraphQL 중 어떤 형식으로 설계할 지 등 기술과 관련된 것들이 있습니다.

도메인 주도 설계(Domain Driven Design DDD)는 가장 중요한 설계 요소는 기술적인 것이 아니라, 사용자의 활동이나 업무에 해당하는 비즈니스 도메인 자체인 자체라고 주장합니다. 비즈니스 도메인을 깊게 이해하고 이로부터 좋은 도메인 모델을 정제해야 성공적인 설계를 통해 도메인의 복잡성을 잘 다룰 수 있습니다.

그렇다고 DDD가 개발자들을 위한 것만은 아닙니다. 소프트웨어 제품을 개발하는데 개발자 뿐만 아니라 기획자, 디자이너 및 기타 다양한 이해관계자가 많아지면서 이들간의 원활한 커뮤니케이션이 매우 중요해졌습니다. DDD를 통해 팀 전체가 비즈니스 도메인을 이해하는 것의 중요성을 인지하고 도메인 모델을 공유하며, 보편 언어로 소통함으로써 프로젝트의 성공에 기여할 수 있습니다.

일반적으로 DDD를 검색해 보면 하면 엔티티, 값 객체, 애그리게잇, 도메인 서비스 등 구현에 관련된 전술 개념들에 관한 글들이 많습니다. 물론 이들도 DDD의 일부이고 훨씬 더 실체화 된 개념이기 때문에 받아들이고 적용하기 쉽지만, DDD의 본질은 좋은 도메인 모델을 설계하는데 있습니다. 이 글에서는 좋은 도메인 모델을 설계하고 유지하는 방법인 DDD의 전략 개념에 초점을 맞춰 DDD를 설명하려고 합니다. 따라서 개발자 뿐만 아니라 소프트웨어 제품 개발에 참여하는 모든 사람들이 글의 대상 독자가 될 수 있습니다.

이 글의 구성은 에릭 에반스의 도메인 주도 설계를 바탕으로 하였습니다.

핵심 개념

도메인 모델

왼쪽은 한반도의 지형을 나타낸 지도이고, 오른쪽은 한반도의 주요 광물 자원 분포를 나타낸 지도입니다. 모두 실제로 현실에 존재하는 한반도라는 대상(도메인)을, 풀고자 하는 문제에 따라 단순화(추상화)하여 나타낸 것(모델) 입니다.

한반도의 지형 기복 및 단면도 출처. 대한민국 국가지도집
한반도의 주요 금속 광물 자원 분포도 출처. 대한민국 국가지도집

도메인 모델을 통해 도메인 바라보기

모든 제품은 제품을 사용하는 사용자의 활동이나 관심사와 관련되어 있습니다. 사용자가 제품을 사용하는 대상 영역이 바로 제품(소프트웨어)의 도메인 입니다. 닥터차 서비스의 경우에는 차량 정비/수리 영역이 도메인이 됩니다. 사용자에게 도움이 되는 제품을 만들기 위해 개발자는 도메인과 관련된 지식 체계에 집중해야 합니다. 그러나 개발자가 배워야 할 도메인 지식이 너무 어렵거나 많을 수 있고, 그 중 일부는 소프트웨어가 해결하고자 하는 문제와 관련이 없을 수도 있습니다. 예를 들어 외장 수리 견적 서비스를 만드는 메이커는 덴트 작업의 종류와 비용에 대해서는 알아야겠지만, 덴트에서 사용되는 퍼티(자동차 외판의 굴곡을 메울때 사용하는 제품)의 구성 성분까지 알아야 할 필요는 없습니다. 따라서 메이커는 풀고자 하는 문제에 관련된 정보를 단순화하고 구조화하여 도메인 모델을 만들고, 모델을 토대로 도메인을 이해하고 문제 자체에 집중해야 합니다.

도메인 모델의 예시

오토피디아 부품유통팀의 업무를 예시로 도메인 모델을 구축하는 과정을 조금 더 구체적으로 설명해 보겠습니다. 부품유통팀에서는 사고 차량의 사진을 보고 차량을 수리하는데 필요한 부품 목록을 찾아 견적을 작성합니다. 그리고 이 견적의 부품 목록을 여러 부품 공급처(도매상)들에서 매입합니다.

부품유통팀에서 작성한 부품 견적을 가장 많은 이익을 남기도록 매입하는 방법을 찾아주는 제품을 만든다고 생각해 봅시다. 이 도메인에는 다음과 같은 사건들이 발생합니다.

  • 동일한 부품을 여러 공급처에서 서로 다른 가격으로 제공.
  • 각 부품은 센터가(정가)가 존재하며, 공급처에서는 정가보다 저렴한 가격에 부품을 제공.
  • 보험사에 매입 내역의 정가를 기준으로 금액을 청구하면, 보험사는 할인 계약에 따라 청구액을 할인하여 금액을 지급.
  • 할인 계약은 보험사 별로 맺어지며, 부품을 매입한 매입처에 따라 다른 할인율을 적용하여 지급액을 계산.

예를 들어 센터가가 1만원인 부품 A가 있습니다. 이 부품 A 10개를 포함하는 견적이 작성 되었습니다. 공급처1에서는 부품 A를 개당 5천원에, 공급처B에서는 부품 B를 개당 8천원에 제공합니다. 이 견적은 햇살화재에서 처리될 예정입니다. 우리가 햇살화재와 맺은 할인 계약은 공급처1에서 매입 시에 40%, 공급처2에서 매입 시에 5%의 할인율을 적용합니다. 따라서 부품 A 10개를 공급처1에서 매입하면 매입액이 5만원, 지급액이 6만원이므로 1만원의 이익이, 공급처2에서 매입하면 매입액이 8만원, 지급액이 9만5천원이므로 1만5천원의 이익이 발생하므로 공급처2에서 매입해야 합니다.

최적 매입 방법 계산 과정

간단한 예시를 들었지만, 한 견적에 몇십개의 부품이 포함될 때도 있고, 한 공급처의 특정 부품에 대한 재고가 부족할 수도 있으며, 부품의 센터가와 공급처들의 판매 가격이 계속 변경되는 점을 고려하면 매번 수동으로 최적의 매입 방법을 찾는 것이 쉽지 않을 것입니다.

도메인으로부터 주요 개념(객체)을 찾아 정리해 봅시다.

더 많은 내용을 확인하려면 오토피디아 블로그를 방문해 주세요!

--

--

김승수
오토피디아

백엔드 개발자 | 오토피디아 공동창업자