도메인 주도 설계 방법론(Domain-Driven Design: DDD)은 크게 두 가지 주요 부분으로 나눌 수 있다.
- 전략적 설계
- What과 Why 질문에 대한 답을 찾는 것
- 어떤 소프트웨어를 만드는지, 왜 그 소프트웨어를 만드는지에 대한 해답을 찾는 것
- 전술적 설계
- How 라는 방법에 대한 것
- 소프트웨어 각각의 구성 요소가 구현되는 방법을 찾는 것
이번 장에서는 기업이 존재하는 이유와 추구하는 목표가 무엇이며, 그 목표를 달성하기 위한 전략을 논의한다.
효과적인 솔루션을 설계하고 구축하기 위해서는 그것의 바탕이 되는 문제를 이해해야 하고, 해결하고자 하는 문제를 이해하려면 그것이 존재하는 맥락을 이해해야햔다.
즉, 그 조직의 비즈니스 전략과 소프트웨어를 만들면서 얻고자 하는 가치를 이해해야 한다.
비즈니스 도메인이란?
비즈니스 도메인은 기업의 주요 활동 영역을 정의한다. (회사가 고객에게 제공하는 서비스)
- 페덱스: 배송 서비스
- 스타벅스: 커피
- 월마트: 소매업체
기업은 여러 비즈니스 도메인을 운영할 수 있으며, 비즈니스 도메인을 자주 변경할 수 있다는 점도 주목해야한다.
하위 도메인
기업은 비즈니스 도메인의 목표를 달성하기 위해 여러가지 하위 도메인(subdomain)을 운영해야한다.
하위 도메인은 비즈니스 활동의 세분화된 영역으로 전체 시스템의 하나의 구성요소로, 각각의 하위 도메인은 회사의 비즈니스 도메인에서 목표를 달성하기 위해 서로 상호작용해야 한다.
- 스타벅스
- 훌륭한 커피
- 좋은 위치의 부동산
- 직원 관리
- 재정 관리
하위 도메인 중 어느 것도 자체적으로 수익을 낼 수 없기 때문에, 회사가 비즈니스 도메인에서 경쟁하려면 이 모든 것이 함께 필요하다.
하위 도메인의 유형
하위 도메인은 서로 다른 전략적 비즈니스 가치를 가진다.
도메인 주도 설계에서 하위 도메인은 핵심, 일반, 지원 세가지 유형으로 구분한다.
핵심 하위 도메인
핵심 하위 도메인(core subdomain)은 회사가 경쟁업체와 다르게 수행하고 있는 것을 의미한다.
- 새로운 재품이나 서비스
- 기존 프로세스를 최적화하여 비용을 줄이는 것 등
- 우버: 승차 공유 서비스
- 구글: 검색 순위 알고리즘
- 구글 애즈는 많은 수익을 내는 하위 도메인에 있는 별도의 비즈니스 도메인
- 검색 엔진을 통해 트래픽을 유도함
복잡성
누구나 구현할 수 있는 핵심 하위 도메인은 일시적인 경쟁 우위만 제공하므로, 핵심 하위 도메인은 자연스럽게 복잡해진다.
회사의 핵심 비즈니스는 높은 진입장벽이 있어야 경쟁력을 유지할 수 있다.
경쟁 우위의 원천
핵심 하위 도메인에 반드시 기술이 들어가야하는 것은 아니며, 회사의 경쟁 우위는 다양한 원천에서 나올 수 있다.
- 모든 비즈니스 문제가 알고리즘이나 기술 솔루션으로 해결되지 않음
- 온라인으로 제품을 판매하는 보석 제조 업체: 보석의 디자인이 회사의 경쟁력
- 수동 사기 탐지를 전문으로 하는 회사: 분석가가 수행하는 작업
일반 하위 도메인
일반 하위 도메인(generic subdomain)은 모든 회사가 같은 방식으로 수행하는 비즈니스 활동을 말한다.
핵심 하위 도메인 처럼 복잡하고 구현하기 어려우나, 회사에 경쟁력을 제공하지 않는다.
- 이미 실무에서 검증된 솔루션으로 널리 이용 가능
- 모든 회사에서 사용하고 있어 더 이상 혁신이나 최적화가 필요 없음
대표 적인 예시로 아래와 같은 것 들이 있다:
- 사용자 인증 및 권한 부여 등
- 온라인으로 제품을 판매하는 보석 제조 업체의 온라인 소핑몰 자체
지원 하위 도메인
지원 하위 도메인(supporting subdomain)은 회사의 비즈니스를 지원하는 활동을 말하며, 핵심 하위 도메인과 달리 어떠한 경쟁 우위도 제공하지 않는다.
지원 하위 도메인은 대부분 비즈니스 로직이 간단하다.
- 데이터 입력 화면과 ETL(extract, transform, load)
- CRUD 인터페이스
회사에 어떠한 경쟁 우위도 제공하지 않으므로 높은 진입장벽이 필요하지 않다.
하위 도메인 비교
다른 각도에서 차이점을 살펴보고, 전략적인 소프트웨어 설계 의사결정에 미치는 영향을 살펴본다.
경쟁 우위
- 핵심 하위 도메인: 경쟁 우위 제공
- 경쟁사와 차별화하기 위한 회사의 전략
- 일반 하위 도메인: 경쟁 우위의 원천이 될 수는 없음
- 일반적인 솔루션
- 경쟁 업체가 동일한 솔루션을 활용하므로 경쟁 우위를 제공할 수 없음
- 지원 하위 도메인: 진입 장벽이 낮으며, 경쟁 우위도 제공할 수 없음
- 경쟁력에 영향을 주지 않음
- 일반적인 솔루션을 사용하는 것을 선호
회사가 해결할 수 있는 문제가 더 복잡할수록 더 많은 비즈니스 가치를 제공할 수 있지만, 복잡한 문제는 소비자에게 서비스를 제공하는 것에 국한되지는 않는다.
- 비즈니스 최적화는 낮은 운영 비용으로 경쟁 우위를 얻을 수 있다.
복잡성
조금 더 기술적인 관점에서 하위 도메인의 유형에 따라 복잡성의 수준이 다르고, 소프트웨어를 설계할 때 비즈니스 요구사항의 복잡성을 수용할 수 있는 도구와 기술을 선택해야하므로, 견고한 소프트웨어 솔루션을 설계하기 위해 하위 도메인을 식별하는 것이 반드시 필요하다.
- 지원 하위 도메인: 일반적으로 비즈니스 로직이 매우 간단
- 기본적인 ETL 작업과, CRUD 인터페이스
- 입력의 유효성 검증 또는 다른 구조의 데이터로 변환하는 정도
- 일반하위 도메인: 훨씬 더 복잡
- 지식 가용성 관점에서 ‘알려진 미지’에 해당(모른 다는 사실을 알고있음)
- 지식 자체는 쉽게 구할 수 있음
- 업계에서 인정하는 모범 사례를 사용하거나 전문 컨설턴트를 고용하여 맞춤형 솔루션을 설계할 수 있음
- 핵심 하위 도메인: 복잡함
- 회사의 수익성이 좌우되므로 경쟁업체가 최대한 모방하기 어려워야함
- 전략적으로 핵심 하위 도메인으로 복잡한 문제를 해결하려고함
이러한 특성으로 복잡성은 하위 도메인을 구별하는 기준으로 활용될 수 있다.
- 하위 도메인을 부업으로 전환할 수 있는가? -> 핵심 하위 도메인
- 외부 솔루션을 연동하는 것 보다 자체 솔루션을 구현하는 것이 더 간단하고 저렴한가? -> 지원 하위 도메인
또 다른 방법으로 코드로 구현해야 하는 비즈니스 로직의 복잡성을 기준으로 삼을 수 있다.
- 데이터 입력을 위한 CRUD 인터페이스와 유사한가? -> 지원 하위 도메인
- 복잡한 알고리즘 또는 비즈니스 프로세스 규칙과 변하지 않는 속성에 의해 조정되는 비즈니스 프로세스를 구현해야 하는가? -> 핵심 하위 도메인
- 기능 자체를 구현하기보다 일반적인 솔루션을 연동하는 편이 더 간단하거나 저렴한가? -> 일반 하위 도메인
- 자체 구현이 더 간단하고 저렴한가? -> 지원 하위 도메인
변동성
- 핵심 하위 도메인: 자주 변경될 수 있다.
- 한 번의 시도로 문제가 해결될 수 있다면 경쟁자들도 빠르게 따라잡을 수 있기 때문에 경쟁 우위에서 좋은 위치는 아닐 것
- 다양한 구현 방법을 시도하고 개선하고 최적해야 핵심 하위 도메인에 대한 솔루션을 찾을 수 있음
- 지원 하위 도메인: 자주 변경되지 않는다.
- 어떠한 경쟁 우위를 제공하지 않기 때문에 투자한 노력에 비해 아주 작은 비즈니스 가치를 제공
- 일반 하위 도메인: 시간이 지남에 따라 변경될 수 있다.
- 보안 패치, 버그 수정
- 일반적인 문제에 대한 새로운 솔루션으로 대체
솔루션 전략
하위 도메인은 기본적인 구성요소이므로 하나를 제거하면 전체 구조가 무너질 수 있다.
하위 도메인 가각의 고유한 속성을 활용하면 서로 다른 유형의 하위 도메인을 구현하기 위한 가장 효율적인 전략을 선택할 수 있다.
- 핵심 하위 도메인: 사내에서 구현되어야 한다.
- 솔루션을 구매하거나 외부에서 도입 가능한 경우 경쟁업체들이 똑같이 할 수 있기 때문에 우위 개념을 약화시킨다.
- 핵심 하위 도메인 구현은 전략적인 투자이므로 하청은 현명하지 않다.
- 절차를 무시하고 대충 진행하는 것은 위험하며 장기적으로 치명적이다.
- 유지보수가 불가능한 코드는 회사의 목표를 지원할 수 없다.
- 조직의 가장 숙련된 인재는 핵심 하위 도메인에서 일하도록 업무가 할당되어야 한다.
- 사내에서 핵심 하위 도메인을 개발하면 더 빠르게 변경하고 발전시킬 수 있기 때문에 더 짧은 시간에 경쟁 우위를 갖출 수 있다.
핵심 하위 도메인의 요구사항은 자주, 지속적으로 변경될 것으로 예사오디므로 솔루션은 유지보수가 가능하고 쉽게 개선될 수 있어야 한다. 따라서 핵심 하위 도메인은 가장 진보된 엔지니어링 기술로 구현해야한다.
- 일반 하위 도메인: 어렵지만 이미 문제가 해결된 것들
- 사내에서 구현하는 데 시간과 노력을 투자하는 것 보다 이미 만들어진 제품을 구입하거나 오픈소스 솔루션을 채택하는 것이 비용 면에서 더 효율적
- 지원 하위 도메인: 경쟁 우위가 없음
- 사내에서 지원 하위 도메인을 구현하지 않는 것이 합리적
- 일반 하위 도메인과 달리 솔루션이 없는 경우가 있고, 이러한 경우 직접 구현
- 비즈니스 로직이 단순하고 변경의 빈도가 적기 때문에 원칙을 생략하고 적당히 진행하기 쉬움
지원 하위 도메인에는 정교한 디자인 패턴이나 고급 엔지니어링 기술이 필요 없다. 인력 관점에서도 고도로 숙련된 기술이 필요하지 않기 때문에 새로운 인재를 양성할 수 있는 좋은 연습 기회를 제공한다.
하위 도메인 유형 | 경쟁 우위 | 복잡성 | 변동성 | 구현 방식 | 문제 |
---|---|---|---|---|---|
핵심 | 예 | 높음 | 높음 | 사내 개발 | 흥미로움 |
일반 | 아니오 | 높음 | 낮음 | 구매/도입 | 해결됨 |
지원 | 아니오 | 낮음 | 낮음 | 사내 가발/하청 | 뻔함 |
하위 도메인 경계 식별
하위 도메인과 해당 유형으로 식별하면 설계와 관련된 의사결정에 상당한 도움이 된다.
하위 도메인과 그 유형은 기업의 비즈니스 전략에 따라 정의되며, 이를 동일한 분야에서 다른 회사와 경쟁하기 위해 자신을 차별화하는 방법으로 대다수의 소프트웨어 프로젝트에서 하위 도메인은 어떤 식으로든 이미 존재한다. 이미 존재하는 하위 도메인을 식별하고 분류하려면 도메인 분석을 직접 수행해야 한다.
회사의 부서와 기타 조직 단위는 좋은 출발점이다.
하위 도메인 정제
하위 도메인을 식별하기 위한 문제는 세부사항에 있으므로 비즈니스 기능의 복잡한 내용에 숨겨진 중요한 정보를 놓치지 말아야한다.
- 고객 서비스 부서
- 헬프데스크 시스템: 일반 하위 도메인
- 교대 근무 관리 및 일정: 지원 하위 도메인
- 전화 시스템: 일반 하위 도메인
- 상담 사례 라우팅: 핵심 하위 도메인
과거 비슷한 상담 사례를 성공적으로 처리한 상담원에게 상담을 전달할 수 있는 알고리즘은 데이터를 분석하여 알고리즘을 설계해야하고, 경쟁업체보다 더 나은 고객 서비스를 제공할 수 있게 하므로 핵심 하위 도메인으로 볼 수 있다.
응집된 유스케이스를 하위 도메인으로
기술적 관점에서 하위 도메인은 상호 연관되고 응집된 유스케이스의 집합과 유사하다.
- 유스케이스 집합
- 동일한 행위자(actor)
- 비즈니스 엔티티(business entity)
- 두 요소 모두 밀접하게 관련된 데이터의 집합을 다룸
세분화된 하위 도메인을 찾는 것을 중단하는 시점을 결장하기 위한 지침으로 응집된 유스케이스의 집합인 하위 도메인이라는 정의를 사용할 수 있다.
위 유스케이스는 작업 중인 데이터 및 관련된 행위자와 밀접한 연관이 있으므로, 모든 유스케이스는 신용카드 결제 하위 도메인을 형성한다.
핵심 하위 도메인은 가장 중요하고 변동성이 있고 복잡하므로, 경계를 식별하기 위해 큰 노력을 기울여야한다.
이를 통해 일반 및 지원 기능 모두를 추출하고 훨씬 더 집중하고 있는 기능에 시간을 투자할 수 있게 한다.
하지만 지원 및 일반 하위 도메인의 경우 이러한 정제 작업을 완화해도 괜찮다.
- 의사 결정을 내리는 데 도움이 될 수 있는 새로운 통찰이 나오지 않으면 중단하는 것이 좋다.
위처럼 헬프 데스크 시스템의 하위 도메인을 추가로 정리한다고 전략적으로 유용한 정보가 나오지 않으므로, 하위 도메인을 크게 나눠서 이미 만들어져 있는 도구를 솔루션으로 사용한다.
핵심에 집중
하위 도메인을 식별할 때 하위 도메인이 모두 필요한지 여부를 고려해야한다.
하위 도메인은 소프트웨어 설계 의사결정을 내리는 프로세스의 어려움을 쉽게 해결하도록 돕는 도구로, 모든 조직에는 경쟁 우위를 제공하기는 하지만 소프트웨어와는 아무 관련이 없는 비즈니스 기능이 많이 존재한다.
하위 도메인을 찾을 때 소프트웨어와 관련되지 않은 비즈니스 기능을 식별하고, 그 자체로 인정하며, 작업 중인 소프트웨어 시스템과 관련된 비즈니스에 집중하는 것이 중요하다.
도메인 전문가란?
도메인 전문가는 모델링하고 코드로 구현할 비즈니스의 모든 복잡성을 알고 있는 주제 전문가이다.(소프트웨어 비즈니스 도메인에 대한 권위자)
비즈니스 지식의 근원이 되는 비즈니스 문제를 처음 파악한 사람들로, 시스템 분석가와 엔지니어는 비즈니스 도메인의 멘탈 모델을 소프트웨어 요구사항과 소스코드로 변환한다.
일반적으로 도메인 전문가는 요구사항을 제시하는 사람 또는 소프트웨어의 최종 사용자이며 소프트웨어는 그들의 문제를 해결해야한다.
결론
비즈니스가 운영되는 영역과 고객에 제공하는 서비스는 모두 비즈니스 도메인과 함께 시작한다.
비즈니스 도메인에서 성공하고 기업이 경쟁업체와 차별화하는 데 필요한 구성 요소를 확인했다.
- 핵심 하위 도메인
- 흥미로운 문제들
- 기업이 경쟁자로부터 차별화하고 경쟁 우위를 얻는 활동
- 일반 하위 도메인
- 해결된 문제들, 모든 회사가 같은 방식으로 하고 있는 일
- 혁신이 필요하지 않음
- 직접 개발하기 보다는 기존 솔루션을 사용하는 것이 더 효과적
- 지원 하위 도메인
- 분명한 해결책이 있는 문제들
- 사내에서 구현해야할 수 있지만 경쟁 우위를 제공하지는 않음
도메인 전문가는 비즈니스의 주제 전문가로 회사의 비즈니스 도메인 또는 하나 이상의 하위 도메인에 대한 심층적인 지식을 가지고 있으며 프로젝트 성공에 매우 중요한 역할을 한다.