복잡한 소프트웨어 시스템을 개발할 때 도메인의 지식과 비즈니스 로직에 초점을 맞추는 것 -> 도메인 설계부터 개발까지 전 과정에서 사용하는 용어를 통일(유비쿼터스 언어)시켜 소프트웨어 코드의 구조와 언어를 비즈니스 도메인의 용어와 일치시킴 => 소프트웨어가 비즈니스의 핵심 문제를 해결하는데 집
DDD 장점
복잡한 비즈니스 로직을 효과적으로 처리
도메인 전문가와 개발자 간의 원활한 커뮤니케이션 지원
유지보수성과 확장성이 높은 코드를 작성 가능
비즈니스 로직과 기술적인 구현을 분리 => 코드의 가독성과 재사용성을 높임
DDD 도전과제
초기 학습 곡선이 높고 팀 전체의 이해와 협력이 필요
작은 프로젝트나 간단한 도메인에서는 오히려 과도한 복잡성을 초래
도메인 전문가(현업)와 긴밀하게 협력할 수 있는 환경 필수
시간이 많이 걸림 - 코드를 짜기 전에 알아야 할 것이 많음
DDD와 다른 개발 패턴의 조합
MSA, 이벤트 소싱, CQRS, Hexagonal Architecture, Event-Driven와 같은 패턴과 함께 할 때 강력한 효과를 발휘
DDD 설계
Strategic Design(전략적 설계, 개념 설계) + Tactical Design(전술적 설계, 구체적 설계)
도메인 분석 -> 모델 설계 -> 코드 구현 -> 도메인 경계 정
Strategic Design - Event storming으로 진행
Domain Event 정의
업무 흐름으로 보완
프로세스로 그룹핑
Domain Event를 발생시키는 명령어 매핑
Actor와 External System / Policy, Rule 추가 (Trigger 정의)
Aggregate 추가
Bounded Context 그룹핑
Context Map 추가
Strategic Design 산출물
Domain Model, Domain 분해도, Context Map
Domain 분해도 : 최상위 도메인을 서브도메인으로 나누고 각 서브도메인의 타입을 Core, Support, Generic으로 나눈 것
Tatical Design - 개발을 위한 구체적인 설계 - Layered 설계 적용
데이터 중심 설계에서 벗어나는 것
도메인, 서브도메인, 바운디드 컨텍스트를 구분하고 정의
이를 바탕으로 Aggregate, Entity, Value Object, Repository 등을 구현
Tatical Design 산출물
User story(주체가 사람인 요구사항명세서)
Usercase diagram
Sequence diagram
Class diagram
Data Model
Storyboard(화면설계서)
API 설계서
메시지 설계서
구체적 설계 자세히(Layered 설계 적용) - 패키지 구조 (DDD 적용)
application에 들어가는 dto와 service는 실질적으로 business 로직을 그리는데 사용 (실질적 로직이 사용하는지 아닌지는 의견이 나뉨) @service와 이 계층에서 사용할 dto와 responseDTO가 포함됨
domain에 model, repository, service가 들어가고 model에는 정의된 도메인의 루트도메인과 서브도메인을 모델화한 Entity와 VO 등이 들어가고 루트엔티티가 하나의 도메인 내에 있는 다른 서브엔티티를 수정하도록 구성한다 repository에는 설계서인 interface로 구현한 repository가 들어간다 service에는 domain별로 나눌 수 없는 service구현이 들어가기도 하고 구체적인 코드를 가지기도 한다
infrastructure에는 repository, configuration, messaging 과 같이 외부와 연결된 부분, 설정 등 실질적으로 연결하는 부분과 계층들을 지원하는 부분이 포함된다. repository는 실질적인 코드가 들어가서 JPARepository나 구현코드가 담긴 클래스가 배치된다
presentation에는 ui 혹은 api와 관련된 controller와 requestDTO가 들어간다. requestDTO가 여기에 들어가는 이유는 외부와 정한 값들에 대해서만 사용되어서 application에서 직접적으로 사용되거나 만들어지지 않는 것이어서 여기에 들어간다.
DDD 주요 용어
Domain(도메인) : 소프트웨어가 해결하려는 특정 문제 영역 / 유사한 업무의 집합
Ubiquitous Language(유비쿼터스 언어) : 공유하는 공통 언어 / 코드, 문서 등에서 일관되게 사용
bounded context(바운디드 컨텍스트) : 도메인을 논리적으로 나누는 경계 / 비즈니스 목적별로 난 Context context : 도메인의 사용자, 프로세스, 정책 등을 의미
Entity(엔티티) : 고유 식별자를 가진 객체 VO(Value Object) : 고유 식별자가 없는 불변 객체
Aggregate(애그리거트) : 연관된 엔티티와 VO의 집합 / 특정 비즈니스 규칙을 중심으로 구성
Reoisutiry(리포지터리) : 애그리거트를 저장하고 검색하는데 사용되는 추상화 계층
Domain Service(도메인 서비스) : 엔티티나 VO가 자체적으로 수행할 수 없는 비즈니스 로직을 처리
Factory(팩토리) : 객체 생성 로직을 캡슐화하여 복잡한 객체나 애그리거트의 생성을 책임진다.