책 정리/도메인 주도 개발 시작하기

part 1. 도메인 모델 시작하기

닉네임이 왜 필요해 2023. 7. 8. 00:44

도메인 모델 시작하기

도메인이란

  • 비즈니스 도메인 [온라인 서점]
    • 하위도메인 [주문]
    • 하위도메인 [회원]
    • 하위도메인 [혜택]
    • 하위도메인 [배송]
    • 하위도메인 [결제]
    • 하위도메인 [정산]
    • 하위도메인 [카탈로그]
    • 하위도메인 [리뷰]
  • 회사에 적용한다면?

도메인 전문가와 개발자 간 지식 공유

  • 개발에 앞서서 각 하위도메인들이 어떤 역할을 하게 되는지 파악할 수 있음

도메인 모델

  • 어떻게 하면 개념 모델을 잘 작성할 수 있는가?
  • 예시에서는 상태 다이어그램을 이용한 주문 산태 모델링을 통해 의미를 전달한다.
  • uml을 이용해 개념모델 표현하여 도메인 자체를 이해할수있도록 작업한다.
  • [추가] uml은 어떨때 사용해야하는가? (UML 실전에서는 이것만 쓴다.)
    • 언제 다이어그램을 그려야 하며, 어떻게 그려야 하는가
      • 언제 다이어그램을 그려야 하며 언제 멈춰야 하는가
        • 프로젝트가 완료된 후
        • 프로젝트를 시작하기 전 의사사통할때
      • CASE 도구
      • 하지만 문서화는 어떻게 합니까
      • 그러면 Javadoc은?
      • 결론

 

  • [추가] mermaid를 이용한 상태도 표현하기
  stateDiagram-v2
    [*] --> Still
    Still --> [*]
    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]

Online FlowChart & Diagrams Editor - Mermaid Live Editor

도메인 모델 패턴

  • 표현계층 : 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 여기서 사용자는 소프트웨어를 사용하는 사람뿐만아니라 외부 시스템일 수도 있다.
  • 응용계층 : 사용자가 요청한 기능을 실행한다. 업무로직은 직접적으로 구현하지않으며 도메인 계층을 조합해서 기능을 실행한다.
  • 도메인 : 시스템이 제공할 도메인 규칙을 구현한다.
  • 인프라스트럭처 : 데이터베이스나 메시징 시스템과 같은 외부시스템과의 연동을 처리한다.

💡 @transaction “usecase layer” vs “presentation layer”

  • 개념모델과 구현모델
    • 완벽한 개념모델을 만들기보다는 전반적인 개요를 알 수 있는 수준으로 개념 모델을 작성해야한다.

도메인 모델 도출

  • 비즈니스 요구사항은 domain 에서 구현한다

💡 글을 통해서 작성하는 문서화를 경계하고 코드를 통해 문서화하라

 

V 모델

엔티티와 벨류

  • 엔티티
    • 식별자를 가진다.
  • 밸류 타입
    • Money, ObjectId와 같은 데이터도 클래스를 만들어서 밸류 타입을 이용하도록 한다.
    • 도메인은 aggregate를 통해 움직이기고 이때 해당 데이터를 일관된 데이터로 최신화한다
    • 만약 setter가 존재하게 된다면 도메인의 aggregate없이 데이터를 수정하는 상황이 발생할 수 있는 코드라 setter의 존재를 경계한다.
create table shop.purchase_order (
  order_number varchar(50) not null primary key,
  version bigint,
  orderer_id varchar(50),
  orderer_name varchar(50),
  total_amounts int,
  shipping_zip_code varchar(6),
  shipping_addr1 varchar(100),
  shipping_addr2 varchar(100),
  shipping_message varchar(200),
  receiver_name varchar(50),
  receiver_phone varchar(50),
  state varchar(20),
  order_date datetime
) character set utf8mb4;

create table shop.order_line (
  order_number varchar(50) not null,
  line_idx int not null,
  product_id varchar(50) not null,
  price int,
  quantity int,
  amounts int
) character set utf8mb4;

도메인 용어와 유비쿼터스 언어

  • 전문가, 관계자, 개발자가 도메인과 관련된 공통의 언어를 만들고 이를 대화, 문서, 도메인모델, 코드, 테스트 등 모든곳에서 같은 용어를 사용해야한다.