DDD 원해?!
디디디 원해!
- 회사에서 새로운 기능을 만들게 되면 항상 데이터 설계를 먼저하고 그에 맞춰 로직을 설계하게 된다. 시간이 지난 후 기능을 추가할때면 데이터에 묶여서 원하는 기능을 다 만들지 못하게 되는 문제가 발생하게 될때가 많다.
- 그러다보니 작업을 하면서 이런 문제를 어떻게하면 벗어날 수 있을까라는 고민이 마음 속 한 구석에 계속 있었다. DDD 를 알게되고 도메인을 먼저 정의하고 설계하면 이 문제에서 조금 벗어날 수 있을 거 같았다.
- 또한 회사에서도 일을 하다보면 작업 관련자들끼리 대화를 하면서도 대화가 안될때가 많다. 그 중 대부분의 이유는 같은 언어(용어)를 쓰더라도 다른 의미로 사용할때가 많아서다.
-
단적인 예로 한번은 회사에서
B2B 티켓
이라는 단어를 개발자들은 비즈니스 회원한테만 판매하는 티켓으로 받아들이고 사업부에서는 일반 회원에 판매하는데 티켓명이 B2B 티켓이고 보이는 것만 B2B 용으로 보이는 게 하는 것이였다. 회의를 하면 할수록 서로 이해를 하지 못했고 긴 시간이 지나고 나서야 서로 다른 이야기를 했다는 것을 깨달은 적이 있다. - 이런 경험들이 쌓이면 커뮤니케이션을 할때 언어(용어) 통일이 얼마나 중요한 지 알 수 있다. 도메인 주도 설계를 하면 서로 같은 단어를 다르게 쓰지 않기 위한 “약속”을 한다. 그러면 커뮤니케이션 미스를 줄일 수 있고, 위와 같은 단어를 쓸때 다른 작업자가 잘못 생각할 수 있다는 걸 자각할 수 있을 거 같았다.
- 도메인을 설계할때 하는 이벤트 스토밍은 개발하는 서비스에 대해서 개발자가 혼자 설계하는 것이 아니라 관련된 작업자들 모두가 해당 서비스를 같이 정의한 후 개발이 들어가서 서로 이해가 좀 더 명확한 상태에서 진행한다는 점에서 꼭 해보고 싶다.
그래서 DDD 그게 뭐야?
DDD (Domain Driven Design)
- 해당 도메인과 일치하도록 소프트웨어를 모델링하는 데 중점을 둔 소프트웨어 설계 접근 방식
- 여기에서 말하는 도메인
- 비즈니스 도메인 : 유사한 업무의 집합, 회사가 제공하는 서비스
- 하위 도메인 : 비즈니스 활동의 세분화된 영역, 제공하는 서비스 단위
- 소프트웨어 코드의 구조와 언어(클래스 이름, 메소드, 변수)를 비즈니스 도메인의 용어와 일치시켜 나가는 설계방식
- 소프트웨어의 연관된 부분들을 연결하여 계속해서 진화하는 새로운 모델을 만들어 나가 복잡한 어플리케이션을 만들기 쉽게 해준다.
도메인 지식
- 도메인 전문가가 문제를 생각하는 방식
- 기존 구현 과정
-
분석(분석모델) → 설계(설계모델) - → 구현(코드)
-
- 도메인 주도 설계
- 설계 (도메인 모델) → 구현(도메인모델을 포함한 코드)
유비쿼터스 언어
- 프로젝트 구성원 모두에게 공유된 언어
- 도메인 지식을 변환하는 대신 도메인을 설명하기 위한 단일화된 체계
- 도메인의 의도를 정확히 반영하고 핵심 개념이 잘 표현될 수 있도록 정의해야함
- 정확하고 일관성이 있어야하며 모호한 용어는 안됨
- 지속적으로 발견하고 발전시킴
도메인 모델
- 특정 도메인을 개념적으로 표현한 것으로 도메인의 핵심 규칙을 구현한다.
- 모델은 본질적으로 추상화의 결과이며, 실 세계의 복잡성을 관리한다.
- 도메인 모델링 : 유비쿼터스 언어로 사실상 비즈니스 도메인 모델을 구축하는 것
- 명사와 행위를 파악
바운디드 컨텍스트
- 모델의 경계
- 유비쿼터스 일관성이 유지되는 경계
- 유비쿼터스 언어의 용어, 원칙, 비지니스 규칙은 해당 바운디드 컨텍스트 내에서만 일관성이 있다.
바운디드 컨텍스트 vs 하위도메인
- 하위도메인 → 비지니스 전략에 의해 정의됨
- 바운디드 컨텍스트 → 소프트웨어 엔지니어에 의해 설계됨
- 하위 도메인은 발견되고 바운디드 컨텍스트는 설계한다는 점
컨텍스트 매핑
- 컨텍스트 간 연관관계 표현으로 바운디드 컨텍스트를 다른 바운디드 컨텍스트와 데이터를 주고 받는 것.
- 유형
- 협력형 패턴
- 파트너십
- 공유 영역
- 공급자, 소비자 패턴
- Supplier - customer : upstream, downstream
- Conformist (순응주의자) - 힘의 균형은 상류에 존재
- ACL (충돌방지계층) - 하류가 이에 순응하지 않은 경우
- OHS(오픈 호스트 서비스) - 힘이 사용자 측에 있는 경우, 제공자는 사용자를 보호하고 가능한 최고의 서비스를 제공함, 여러 사용자에 따른 버전 관리 가능
- PL(공개 프로토콜, 공표된 언어) - 명세
- 협력형 패턴
이벤트 스토밍
- 도메인 전문가와 개발자가 같이 참여하여 어떻게 전략적으로 설계를 효율적으로 할 것인가 같이 고민하는 것
- 서비스에 필요한 모든 사람들이 다 같이 모여서 진행한다.
- 개발요소가 아닌 이벤트와 비즈니스 프로세스에 집중한다.
- 팀 구성원 전체가 서비스 이해도를 증가할 수 있고, 도메인 전문가도 이해의 폭을 다시 넓히고 새로운 통찰력을 얻을 수 잇다.
- Domain Event
- 시스템에 발생하는 중요한 이벤트
- 데이터가 아닌
비즈니스 프로세스
에 집중 과거형 동사
로 표현
- Hot Spot
- 질문, 가정, 경고, 의견 수렴이 필요한 내용
- 병목 구간, 자동화 필요한 수작업, 도메인 지식이 없는 경우
- 완전히 정의되니 않은 영역, 해결해야하는 문제
- 필요한 곳 어디에나 부착 가능
- Command
- 이벤트를 트리거 하는 명령
현재 동사
로 표현
- Actor
- Command 를 동작하게 하는 사용자/역할
사람
이나역할의 이름
을명사(단어)
로 표현
- Policy
- 다른 바운디드 컨텍스트에 영향을 주는 이벤트
- Domain Event 가 발생하면 파생되는 동작
- 만약 ~ 하면 ~ 한다.
- External System
- 연계가 필요한 외부 시스템 또는 프로세스
명사(단어)
로 표현
- Aggregate
- Domain Event 와 Command 에 의해 관리되는 데이터
- Domain Event 와 Command 를 표현하는 키워드
명사(단어)
로 표현
이벤트 스토밍 결과를 헥사고날 아키텍처와 매핑
[참고] https://vaadin.com/blog/ddd-part-3-domain-driven-design-and-the-hexagonal-architecture
https://ko.wikipedia.org/wiki/도메인_주도_설계
https://blog.naver.com/PostView.naver?blogId=seek316&logNo=222710251462
https://devlos.tistory.com/category/MSA 설계 %26 도메인주도 설계
https://engineering-skcc.github.io/msa/DDD-StrategicDesign/
https://happycloud-lee.tistory.com/94
https://incheol-jung.gitbook.io/docs/q-and-a/architecture/ddd
https://www.linkedin.com/pulse/why-bounded-context-crucial-micro-services-manish-mehndiratta-togaf-