본문 바로가기
개발 관련/ddd

1. 도메인 모델 시작

by lazysnack 2022. 7. 14.

도메인 모델 시작

  1. 도메인 모델
  2. 엔티티와 밸류
  3. 도메인 용어

1 도메인 모델

  1. 도메인

    개발자 입장에서 온라인 서점은 구현해야 할 소프트웨어의 대상이 된다. 온라인 서점 소프트웨어는 온라인으로 책을 판매하는 데 필요한 상품조회, 구매, 결제, 배송 추적 등의 기능을 제공해야 한다. 이 때, '온라인 서점' 은 소프트웨어로 해결하고자 하는 문제 영역, 즉 도메인에 해당한다.
  2. 도메인 모델

    • 특정 도메인을 개념적으로 표현한 것
    • 주문은 주문번호, 지불할 총금액 등이 있어서, 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유할 수 있음
    • 개념 모델과 구현 모델은 서로 다른 것이지만, 구현 모델이 개념 모델을 최대한 따르도록 할 수는 있다. (객체 기반 모델을 이용해서 도메인을 표현했다면 객체 지향 언어를 이용해서 개념 모델에 가깝게 구현할 수 있다는 말)
  3. 도메인 모델 패턴

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

    • 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것
문서화 : 문서화를 하는 주된 이유는 지식 공유

코드의 경우 상세한 내용을 포함하고 있기 때문에 많은 시간을 투자해야된다. 그렇기에 상위 수준에서 빠르게 이해하기 위해 문서화가 필요하다. 하지만, 도메인이 지식이 묻어나지 않는 코드는 동작은 이해할 수 있어도 왜 그렇게 작성했는지는 알 수 없다.

2 엔티티와 벨류

  • 도출한 모델은 크게 엔티티와 벨류로 구분할 수 있음
  • 엔티티와 벨류를 제대로 구분해야 도메인을 올바르게 설계하고 구현할 수 있음
  1. 엔티티

    • 가장 큰 특징은 식별자 를 갖는 것

    • 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖음 (주문 도메인에서 각 주문은 주문번호를 갖는데 이 주문번호는 각 주문마다 서로 다름)

    • 엔티티 식별자 생성은 흔히 4가지

      1. 특정 규칙에 따라 생성(날짜 + @)
      2. UUID 사용
      3. 값을 직접 입력(아이디, 이메일 등)
      4. 일련번호 사용(DB 시퀀스나 A.I 등)
  2. 벨류 타입

    • 개념적으로 완전한 하나를 표현할 때 사용
    public class Receiver {
        private String name;
      private String phoneNumber;
    
      //... doSomething
    }
    • 받는 사람 이라는 도메인 개념을 포함, 밸류 타입을 이용하여 개념적으로 완전한 하나를 표현
    • 밸류 객체의 데이터를 변경할 때는 기존 데이터를 변경하기보다 변경한 데이터를 갖는 새로운 밸류 객체를 생성하는 방식을 선호 (불변 객체로 만들기 위함인데, 이 이유는 불변 타입으로 만들면 보다 안전한 코드를 작성할 수 있기 때문 - set을 못한다.)
    • 엔티티에서는 식별자로 비교를 했지만, 벨류에서는 모든 속성이 같은지를 비교
  3. 엔티티와 벨류 타입

    • 식별자인 주문번호를 String 보단 OrderNo 라는 벨류로 표현하는게 더 확실하다.
  4. 도메인 모델에 set 메소드 넣지 않기

    • 도메인의 핵심 개념이나 의도를 코드에서 사라지게 함
    • 도메인 객체를 생성할 때 완전한 상태가 아닐 수도 있다는 것(set 을 통해 수정하거나 삽입할 수 있기에 생성자를 통하여 만들 때 null 이 될 수 있다.)

3. 도메인 용어

  • 도메인에서 사용하는 용어를 코드에 반영하지 않으면 그 코드는 개발자에게 코드의 의미를 해석하는 부담을 줌
public enum OrderState{
  STEP1, // 결제 대기중 
  STEP2, // 상품 준비중 
  STPE3, // 출고 완료됨
  ...
}
  • STEP1 이 뭔지 STEP2 가 뭔지 알 수 없고, 이를 해석하는데 시간을 또 써야 함
public enum OrderState {
  PAYMENT_WAITING,
  PREPARING,
  SHIPPED,
  ...
}
  • 알맞은 영어 단어를 찾는 것은 쉽지 않은 일이지만 시간을 들여 찾는 노력을 해야 한다. 도메인에 어울리지 않는 단어를 사용하는 코드는 도메인과 점점 멀어지게 된다. (클린코드 에서도 나오는 이름의 중요성!) 도메인 용어에 알맞는 단어를 찾는 시간을 아까워하지 말자.