장미정원
DDD 이해하고 활용하기 (이벤트 스토밍 워크숍) 본문
개요
DDD (Domain Driven Design)는 비즈니스 영역을 의미하는 도메인을 중심으로 하는 개발 방식입니다. DDD에 대해 자세하게 알아보기 전에 DDD에 대해 자주 하는 오해가 있는 것 같은데요. DDD를 구현하려면 이러이러한 구조를 따라야해! 가 아닌 도메인에 대한 문제를 해결하기 위해 도메인과 비즈니스 로직에 초점을 맞춰 개발할 수 있게 도와주는 도구입니다.
DDD의 목표는 낮은 결합도, 높은 응집도 입니다. DDD를 통해 도메인 간의 경계를 나눠 응집도 높은 애플리케이션을 설계할 수 있게 도와줍니다.
Ubiquitous Language
DDD의 특징 중 하나는 유비쿼터스 언어를 사용하는 것입니다. 유비쿼터스 언어는 프로젝트에 참여하는 모든 이해 관계자들이 사용하는 비즈니스 도메인 용어를 의미합니다. 쉽게 말해서 모두 함께 사용할 비즈니스 용어를 정하는 것입니다. 이렇게 비즈니스 용어를 통일함으로써 약속이 생기고 커뮤니케이션에서 발생하는 문제점을 방지할 수 있습니다.
용어
DDD의 중요한 용어로는 Bounded Context, Context Map, Aggregate가 있습니다.
- 바운디드 컨텍스트: 응집도가 높은 도메인끼리 경계를 구성하여 각 경계에 응집도를 높히는 것
- 컨텍스트 맵: 바운디드 컨텍스트로 나눈 경계의 관계를 보여주는 맵
- 애그리케이트: 여러 도메인을 묶어 하나의 큰 도메인으로 관리, 데이터의 변경 단위 (Entity, Value Object로 구성)
설계 순서
DDD의 설계 순서는 크게 Strategic Design(전략적 설계 - 개념설계), Tactical Design(전술적 설계 - 구체설계)로 나눌 수 있습니다.
Strategic Design - 전략적 설계
프로젝트의 이해 관계자들이 모여 유비쿼터스 언어를 사용해 도메인에 대해 이야기를 나누며(이벤트 스토밍) 이를 통해 도메인들의 경계인 바운디드 컨텍스트를 정의하고 경계들의 관계를 컨텍스트 맵으로 정의합니다.
이벤트 스토밍에 대해서는 아래서 다시 다루겠습니다.
Tactical Design - 전술적 설계
전략적 설계에서 개념적인 부분을 설계했다면 전술적 설계에서는 구현에 가깝게 모델링하는 것입니다. 전략적 설계에서 만든 각 도메인 별 컨텍스트 맵을 참고하여 애그리케이트, 엔티티등을 설계합니다.
이벤트 스토밍 워크숍
이벤트 스토밍은 프로젝트의 모든 이해관계자들이 모여 각자의 생각을 나누며 도메인 이벤트를 중심으로 도메인에 대한 이해를 높히는 활동입니다. 꼭 DDD를 구현할 때 진행하는 것은 아니고 복잡한 도메인을 빠르게 학습하기 위하 활동입니다.
준비물은 벽, 종이, 포스트잇, 팬, 간식만 있으면 됩니다.
이벤트 스토밍은 각각의 의미를 가진 색상의 포스트잇을 붙히며 모든 이해관계자가 공통된 도메인 지식을 갖도록 합니다.
1. 도메인 이벤트(주황색) 흩뿌리기
우선 주황색 포스트잇에 도메인에서 발생할 수 있는 이벤트를 작성하여 붙힙니다.
이벤트는 과거형으로 작성하고 이벤트가 발생한다는 것은 상태가 변경되었다는 것을 의미합니다.
2. 타임라인 순서대로 정리하기
전 단계에서 수많은 도메인 이벤트들이 벽에 붙었을 것입니다. 다 작성 하였다면 도메인 이벤트들을 타임라인 순서대로 정렬합니다. (왼쪽에서 오른쪽으로 시간 순서, 위 아래로 평행한 시간 표현)
핫 스팟(자주색)
도메인 이벤트를 작성하면서 발생한 궁금증, 불만 사항 등등을 작성합니다. 포스트잇에 작성해서 가까운 곳에 붙히고 그 자리에서 당장 토론은 하지 않습니다! (빠른 진행)
커맨드(파란색)
도메인에서 특정 주체가 요청하는 행위입니다. 커멘드라는 행위를 하여 도메인 이벤트를 발생시킵니다.
액터(노란색), 시스템(분홍색)
액터는 커맨드를 발생시는 주체입니다. 구체적인 페르소나를 정해 작성합니다. 시스템은 외부 시스템, 내부 시스템, MS등등 책임을 전가할 수 있는 모든 것을 의미합니다.
정책(보라색)
말 그대로 비즈니스 정책입니다. 특정 조건에 따라 발생하는 커맨드라고 생각할 수도 있습니다.
애그리게이트(노란색)
커맨드와 도메인 이벤트가 처리하는 데이터입니다.
바운디드 컨텍스트 나누기
지금까지 정리했던 포스트잇들을 응집도 있게 묶어주는 단계입니다. 이렇게 나눠진 바운디드 컨텍스트들은 각각의 마이크로 서비스로 개발될 수 있습니다.
컨텍스트 매핑
나눠진 바운디드 컨텍스트들의 관계를 설정해주는 과정입니다. 이 단계에서 외부 시스템을 도출하거나 추가해야할 도메인 이벤트 등등을 확인하며 전반적으로 검토합니다.
마무리
여기까지 이벤트 스토밍이 마무리 되었다면 참여한 이해 관계자들 모두 충분한 도메인 지식을 갖게 되었을 것입니다. 이제 결과를 구현할 아키텍처를 선정하여 코드로 표현할 수 있습니다.
레이어드, 클린, 헥사고날 아키텍처 등등을 고민해볼 수 있으며, 나눠진 바운디드 컨텍스트를 기준으로 마이크로 서비스로 나눠 개발을 진행해볼 수도 있습니다.
'DEVELOP' 카테고리의 다른 글
당신이 프로젝트에서 놓치고 있는 것 (10) | 2024.10.23 |
---|