[ ddd start! ] 1. 도메인 모델 시작

박병찬·2022년 2월 27일
0

ddd start

목록 보기
1/11
post-custom-banner

DDD start! 정리하기

3개월간 프로젝트를 진행하면서 꾸준히 읽어온 책을 정리해보려 한다.
책이 절판돼서 도서관을 여러곳 들려 찾았다...! 살 수 있음 좋겠는데..

CHAPTER 1 도메인 모델 시작

1. 도메인

ex) 온라인 서점을 통해 책을 구매한다.
개발자의 입장에서 온라인 서점은 구현해야 할 대상이 된다.
온라인으로 책을 판매하기 위한 기능을 제공해야 되고,
'온라인 서점'은 소프트웨어로 해결하고자 하는 문제의 영역 즉 domain이 된다.

  • 도메인은 여러 하위 도메인으로 구성된다.
  • 하위 도메인은 서비스의 일련의 과정을 처리한다.
  • 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공한다.

2. 도메인 모델

  • 도메인 모델은 특정 도메인을 개념적으로 표현한 것이다.
  • 도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델이다.
  • 하위 도메인이 다루는 영역은 서로 다르기 때문에 같은 용어라도 하위 도메인마다 의미가 달라질 수 있다.

3. 도메인 모델 패턴

  • 이 책의 도메인 모델은 마틴 파울러가 쓴 엔터프라이즈 어플리케이션 아미텍처 패턴(PEAA)이다.
  • 도메인 모델은 아미텍처상의 도메인 계층을 객체 지향 기법으로 구현하는 패턴을 말한다.
  • 비즈니스 로직을 도메인 모델에 위치시키면, 로직을 수정,추가할 때 다른 코드에 영향을 덜 준다.

4. 도메인 모델 도출

  • 도메인 모델링을 할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것이다.
  • 기획서, 유스케이스, 사용자 스토리와 같은 요구사항을 통해 도메인을 이해하고, 도메인 모델 초안을 만들고 코드를 작성한다.

5. 엔티티와 벨류

  • 도메인은 크게 Entity와 Value로 나뉜다.
  • Entity의 가장 큰 특징은 식별자를 갖는 것이다. ex) 주문 도메인에서 각자 다른 주문 번호가 식별자다.
public class Order {
  private String orderNumber;
  ...
}
  • Value 타입은 개념적으로 완전한 하나를 표현할 때 사용한다.
  • ex) ShippingInfo라는 객체에서 주소 관련 데이터는 Address라는 Value 타입을 사용해서 더 명확하게 표현할 수 있다.
@AllArgsConstructor
public class Address {
   private String address1;
   private String address2;
   private String zipcode;
}
  • Value 타입의 장점은 Value 타입을 위한 기능을 추가할 수 있다는 것이다.
  • Value 객체의 데이터를 변경할 때 기존 데이터 보단 변경한 데이터를 갖는 새로운 Value 객체를 생성하는 방식을 선호한다.
  • Money처럼 데이터 변경 기능을 제공하지 않는 것을 불변(immutable)이라고 표현한다.
  • 사용하는 가장 큰 이유는 불편 타입을 사용하면 보다 안전한 코드를 작성할 수 있다.
public class Money {
  private int value;
  public Money add(Money money) {
    return new Money(this.value + money.value);
  }
  // value 를 변경할 수 있는 메서드가 없음
}
  • Money가 단순 숫자가 아닌 도메인의 '돈'을 의미하는 것처럼 이런 식별자는 단순한 문자열이 아니라 도메인에서 특별한 의미를 지니는 경우가 많기 때문에 식별자를 위한 밸류타입을 사용해서 의미가 잘 드러나도록 할 수 있다.
public class Order {
  private OrderNo id;
  ...
  public OrderNo getId() {
    return id;
  }
}

6. 도메인 용어

  • STEP1, STEP2, STEP3 과 같은 의미 없는 용어가 아닌
  • PAYMENT_WAITING, PREPARING와 같이 도메인에서 사용하는 용어를 최대한 코드에 반영하면, 코드를 도메인 용어로 해석하거나 도메인 용어를 코드로 해석하는 과정이 줄어든다.
  • 이는 가독성을 높여서 코드를 분석하고 이해하는 시간을 절약할 수 있으며, 의미를 변환하는 과정에서 발생하는 버그도 줄어든다.
profile
안녕하세요
post-custom-banner

0개의 댓글