DDD, Clean Architecture and Hexagonal 1
Published:
DDD 도메인 드리븐 디자인에 대하여 내가 느끼고 이해한 내용을 정리하려고 합니다.
도메인은 무엇인가?
내가 인지하고 사용하고 있던 Domain은 DB테이블과 직접 맵핑되는 클래스 즉, DB 테이블의 컬럼들을 모아둔 클래스라고 인지하고 사용하고 있었다.
이번 DDD 설명 세미나에 참석하면서 알게된 DDD방법론에서의 Domain은 목표, 핵심주제를 뜻하고 내가 인지하고 있던 Domain은 Entity로 사용된다는 것을 알게되었다.
그럼 도메인? 목표, 핵심주제란 무엇일까?
내가 어떠한 서비스의 신청, 등록, 결제등을 제공하는 프로젝트를 만든다고 했을 때
여기서 목표, 핵심주제는 서비스 신청, 등록 및 결제 프로세스를 제공하는 것입니다.
이 서비스의 신청, 등록 및 결제 프로세스를 제공하는 것이 바로 DDD에서의 핵심 도메인이 됩니다.
그렇다면 여기서 DDD 도메인 드리븐 디자인의 구조를 알아봅시다.
- 도메인 모델 : 도메인 모델은 소프트웨어가 해결하고자하는 문제의 영역을 모델링합니다. 이 모델은 해당 도메인의 주요 개념, 규칙, 엔티티, 값, 서비스 등을 포함합니다.
- 유비쿼터스 언어 : 이는 개발자와 도메인 전문가 간의 소통을 위해서 사용되는 공통 언어입니다. 유비 쿼터스 언어는 도메인 모델을 표현하고, 모든 이해당사자가 동일한 용어를 사용하여 의사소통하는데 도움을 줍니다.
- 컨텍스트 경계 : 컨텍스트 경계는 특정 도메인 모델이 적용되는 범위를 정의합니다. 이 경계 내에서 도메인 모델과 유비쿼터스 언어는 일관된 의미를 가지지만, 경계를 넘어서면 의미가 달라질 수 있습니다.
- 애그리거트 : 애그리거트는 도메인 모델의 한 부분으로, 연관된 객체들의 집합입니다. 각 애그리거트는 단일 루트 엔티티를 가지며, 이 루트를 통해 애그리거트의 다른 부분에 접근합니다.
- 리포지토리 : 리포지토리는 애그리거트의 지속성을 관리하며, 애그리거트를 DB와 분리하여 도메인 모델에 집중할 수 있게 합니다.
- 서비스 : 특정 엔티티나 값 객체에 속하지 않은 도메인 로직을 처리하는 객체입니다. 서비스는 도메인의 핵심 기능을 구현하는데 사용됩니다.
- 도메인 이벤트 : 도메인 내에서 발생하는 중요한 사건을 나타내며, 이벤트 주도 아키텍쳐에 활용될 수 있습니다.
- 애플리케이션 계증 : 도메인 계층과 사용자 인터페이스 또는 외부 시스템 간의 상호작용을 책임집니다. 이 계층은 도메인 로직을 실행하고 결과를 전달합니다.
- 인프라스트럭처 계층 : 데이터베이스 접근, 메시징 시스템 등과 같은 기술적인 세부 사항을 처리합니다.
DDD의 구조는 이처럼 글로만 보았을 때 조금 이해하기 어려운 부분들이 많습니다.
이러첨 어려운 도메인을 분류하고 이해하는데 도움을 주는 개념적 분류방식이 존재합니다.
종류로는 ‘핵심 도메인(Core Domain)’, ‘핵심 하위 도메인(Core Subdomain)’, ‘지원 도메인(Supporting Domain)’이 있고, 각각의 역할과 중요성은 다음과 같습니다.
핵심 도메인 (Core Domain):
- 이는 비즈니스에 가장 중요한 부분입니다.
- 핵심 도메인에는 비즈니스의 핵심 로직과 이 비지니스의 목표,주제가 포함됩니다.
핵심 하위 도메인 (Core Subdomain):
- 핵심 도메인의 일부분이지만, 별도로 관리되고 개발되는 영역입니다.
- 이들은 핵심 도메인을 지원하지만, 자체적으로는 프로젝트의 주요 비즈니스라고하지는 않습니다.
지원 도메인 (Supporting Domain):
- 이는 비즈니스의 주요 목적과는 직접적으로 관련이 없지만, 필요한 부가적인 기능을 제공하는 영역입니다.
- 예를 들어, 로깅, 모니터링, 인증 시스템과 같은 기능이 여기에 속합니다. 지원 도메인은 중요하지만, 핵심 도메인만큼의 자원과 주의를 필요로 하지 않습니다.
자 그렇다면 내가 만들려고 하는 프로젝트에서 핵심 도메인과, 핵심 하위 도메인, 지원 도메인을 하나하나 분리해봅시다.
핵심 도메인 (Core Domain)
- 구성 요소:
- 서비스 신청: 사용자가 서비스를 신청할 수 있는 핵심 기능.
- 가맹점 등록: 다른 회사들이 가맹점으로 등록하는 과정.
- 결제: 서비스 사용에 대한 결제 처리.
- 결제 내역: 결제 관련 정보와 이력 관리
핵심 하위 도메인 (Core Subdomain)
- 구성 요소:
- 메일링: 서비스 신청, 가맹점 등록, 결제 확인 등과 관련된 메일 발송.
- API를 활용한 정보 동기화: 외부 시스템과의 정보 동기화를 통한 통합 서비스 제공.
지원 도메인 (Supporting Domain)
- 구성 요소:
- JPA: 데이터 접근과 ORM(Object-Relational Mapping)을 담당.
- Java Mail SMTP: 메일링 기능에 사용되는 메일 서버 연동.
- security : 보안 및 권한관리 (보안을 중요시 여기는 프로젝트에서는 핵심 도메인으로 두어 다른 프로젝트로 구성합니다.)