TIL

8_2.MSA DDD 설계 및 구현 실습

꿀승 2025. 2. 11. 22:48
728x90
반응형
SMALL

학습내용

  1. DDD설계
  2. Event Storming

학습정리

1. DDD (Domain-Driven Design) 설계

  • 소프트웨어 개발에서 도메인 중심으로 설계 방법

  • 핵심개념

    • 도메인 (Domain) : 소프트웨어가 해결하려는 특정 비즈니스 문제 영역을 의미
    • 도메인 모델 (Domain Model) : 도메인을 현실적으로 표현한 추상화된 개념의 집합
      • Entity, ValueObject, Aggregate
    • 서브도메인 : 도메인의 하위 개념
    • 유비쿼터스 언어 (Ubiquitous Language) : 모든 구성원이 같은 의미로 이해 하도록 용어를 통일
      • ex) 주문 승인 -> approveOrder()
  • MSA 와 DDD의 관계

    • DDD의 바운디드 컨텍스트 개념이 MSA의 서비스 경계와 일치
    • 독립적인 컨텍스트를 서비스로 나눠서 확장성과 독립성을 보장
  • DDD vs TDD vs BDD

    구분 DDD (Domain-Driven Design) TDD (Test-Driven Development) BDD (Behavior-Driven Development)
    초점 (Focus) 비즈니스 도메인과 소프트웨어 설계 테스트 기반 개발 사용자 요구사항과 행동 기반 개발
    목적 (Goal) 도메인 모델을 정확하게 반영하는 소프트웨어 개발 코드 품질 향상 및 결함 방지 비즈니스 요구사항을 쉽게 이해하고 검증 가능하게 함
    주요 대상 개발자 & 도메인 전문가 (비즈니스 분석가) 개발자 개발자, 기획자, 테스터 등 모든 이해관계자
    핵심 원칙 바운디드 컨텍스트, 어그리게이트, 엔티티, 밸류 오브젝트 등 Red-Green-Refactor 사이클 Given-When-Then 패턴
    언어 사용 유비쿼터스 언어 (Ubiquitous Language) 단위 테스트 (Unit Test) 코드 자연어 기반 테스트 시나리오 (Gherkin, 거킨)
    출발점 비즈니스 도메인 모델링부터 시작 테스트 코드 작성부터 시작 사용자 시나리오 정의부터 시작
    도구 예시 도메인 모델, 이벤트 스토밍 JUnit, pytest, Mocha, Jest Cucumber, SpecFlow, Behave
  • 전략적 설계 (Strategic Design)

    • Bounded Context
      • 도메인 모델이 적용되는 경계를 명확하게 정의하는 개념
        ex) UserContext, OrderContext, ProductContext
    • Context Mapping
      • 여러개의 바운디드 컨텍스트의 상호 작용하는지 나타냄
        ex) UserContext - OrderContext / ProductContext - OrderContext
  • 전술적 설계 (Tactical Design)

    • Entity
      • 고유한 ID를 가진 객체, 변경 가능
      • ex) Product,Order
    • Value Object
      • ID가 없고, 불변, 값으로만 비교되는 객체
      • ex) Money, Address
    • Aggregate
      • 관련된 Entity와 Value Object를 하나의 단위로 묶은 개념
      • ex) Order Aggregate = Order(entity) + OrderItem(entity) + Address (ValueObject)
    • Domain Service (Domain Event)
      • 도메인에서 중요한 상태를 변경이나 비즈니스 로직을 처리하는 서비스
    • Repository
      • Aggregate를 조회 및 저장하는 역할
    • Factory
      • 복잡한 객체 생성을 캡슐화 패턴
      • new 키워드 대신 팩토리를 사용해 Aggregate 생성
  • 전략적 설계와 전술적 설계

    • DDD에서는 해당 설계를 함께 사용해야함
      구분 전략적 설계 (큰 그림) 전술적 설계 (세부 구조)
      목적 도메인의 큰 그림과 경계를 정의 도메인 모델을 코드로 구체화
      대상 팀 간 협업, 서비스 경계, 도메인 분석 코드 레벨의 도메인 객체 설계
      주요 개념 바운디드 컨텍스트, 컨텍스트 맵핑, 서브도메인 엔티티, 밸류 오브젝트, 어그리게이트, 도메인 서비스
      MSA 적용 여부 ✅ 가능 (바운디드 컨텍스트 활용) ❌ 코드 레벨 설계로 초점
      의존성 관리 도메인 간 관계를 정의 객체 간 관계를 정의
      예시 주문,결제,배송 Order, OrderItem, OrderRepository

2. Event Storming

  • 도메인 중심 설계(DDD, Domain-Driven Design)에서 사용되는 협업 기법으로, 도메인 전문가, 개발자, 디자이너 등이 함께 시스템의 비즈니스 흐름을 시각적으로 모델링하는 방법

  • 진행 순서

    1. 주요 비즈니스 이벤트 식별
      • 이벤트는 과거형 동사로 표현
      • ex) 로그인 됨, 결제 요청됨 등등
    2. Command 와 Aggregate 도출
      • 이벤트를 발생하는 커맨드와 해당 이벤트를 처리하는 Aggregate 도출
      • ex) 로그인됨 - Command : login / Aggregate : User
        주문생성됨 - Command : CreateOrder / Aggregate : Order
    3. Actor (사용자 역할) 정의
      • 각 이벤트를 실행하는 주체를 식별
      • ex) 고객, 판매자, 결제시스템, 배송시스템 등
    4. Aggregate 간의 관계 설정
      • 이벤트를 처리하는 도메인 객체 (Aggregate)간의 관계 도출
        [ Customer ]
            └─> [ Cart ]  (상품 추가)
                  └─> [ Order ]  (주문 생성)
                         ├─> [ Payment ]  (결제 처리)
                         ├─> [ Inventory ]  (재고 차감)
                         └─> [ Shipping ]  (배송 관리)
    5. Policy (도메인 규칙) 설정
      • 비즈니스 룰을 정의
      • ex) 회원가입시 필수입력, 재고 부족할 경우 주문 불가
  • 최종 Event Storming 흐름 예시

    • 고객이 장바구니에 상품 추가 (Cart Aggregate)

    • 주문 생성 (Order Aggregate)

    • 결제 승인 (Payment Aggregate)

    • 배송 시작 (Shipping Aggregate)

      📌 Actor: [ 고객(Customer) ]  
          └──> Command: [ 장바구니에 상품 추가 ]  
              └──> Event: "상품이 장바구니에 추가됨"  
                  └──> Aggregate: [ Cart ]  
                      └──> Command: [ 주문 생성 ]  
                          └──> Event: "주문이 생성됨"  
                              ├──> Aggregate: [ Order ]  
                              ├──> Command: [ 결제 승인 ]  
                                  └──> Event: "결제가 완료됨"  
                                      ├──> Aggregate: [ Payment ]  
                              ├──> Command: [ 배송 시작 ]  
                                  └──> Event: "주문이 배송됨"  
                                      ├──> Aggregate: [ Shipping ]  
      
  • 간단한 디자인화 miro 예시

ps. 금일에는 DDD와 EventStorming에 배우고 실습을 해봤는데
익숙한 용어도 있고 낯선 용어가 있어서 완전히 이해는 하지는 못했지만,
많은 것을 알게 된 것 같고, 점점 익숙해질 것 같다.

728x90
반응형
LIST