1. 도메인 모델 시작
#
도메인- 개발자 입장에서 온라임 서점을 보면 온라임 서점은 구현해야 할 소프트웨어의 대상이 됩니다.
- 온라인 서점 소프트웨어는 온라인으로 책을 판매하는 데 필요한 상품조회, 구매, 결제, 배송 추적등의 기능을 제공해야합니다.
- 이때 '온라인 서점'은 도메인에 해당됩니다.
- 카탈로그 하위 도메인은 고객에게 구매할 수 있는 상품 목록을 제공하고, 주문 하위 도메인은 고객의 주문을 처리합니다.
- 특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야 할 모든 기능을 구현하는 것은 아닙니다.
- 즉, 배송 도메인의 일부 기능은 자체 시스템으로 구현하고, 일부 기능은 외부 업체의 시스템을 사용합니다.
#
도메인 모델- 기본적으로 도메인 모델은 특정 도메인을 개념적으로 표현한 것입니다.
- 도메인 모델을 통해 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 됩니다.
- 기능과 데이터를 함께 보여주는 객체 모델은 도메인을 모델링하기에 적합합니다.
- 상태를 통해 주문의 상태 전이를 모델링할 수도 있습니다.
도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델입니다.
하위 도메인과 모델
- 모델의 각 구성요소는 특정 도메인을 한정할 때 비로소 의미가 완전해지므로, 각 하위 도메인마다 별도로 모델을 만들어야합니다.
#
도메인 모델 패턴계층(Layer) | 설명 |
---|---|
사용자 인터페이스(UI) 또는 표현(Presentation) | 사용자의 요청을 처리하고 사용자에게 정보를 보여줍니다. |
응용(Application) | 사용자가 요청한 기능을 실행한다, 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해 기능을 실행한다 |
도메인 | 시스템이 제공할 도메인의 규칙을 규현한다 |
인프라스트럭처(Infrastructure) | 데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리한다 |
#
도메인 모델 도출- 개발을 할려면 기획서, 유스 케이스, 사용자 스토리와 같은 요구사항과 관련자와의 대화를 통해 도메인을 이해하고 이를 바탕으로 도메인 모델 초안을 만들어야 비로소 코드를 작성할 수 있습니다.
- 도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것이며 이 과정은 요구사항에서 출발합니다.
- 주문 도메과 관련된 몇가지 요구사항이 있습니다.
- 최소 한 종류 이상의 상품을 주문해야 한다
- 한 상품을 한 개 이상 주문할 수 있다
- 총 주문 금액은 각 상품의 구매 가격 합을 모두 더한 금액이다
- 각 상품의 구매 가격 합은 상품 가격에 구매 개수를 곱한 값이다
- 주문할 때 배송지 정보를 반드시 지정해야 한다
- 배송지 정보는 받는 사람 이름, 전화번호, 주소로 구성된다
- 출고를 하면 배송지 정보를 변경할 수 없다
- 출고 전에 주문을 취소할 수 있다
- 고객이 결제를 완료하기 전에는 상품을 준비하지 않는다
문서화
- 문서화를 하는 주된 이유는 지식을 공유하기 위함입니다.
- 코드를 보면서 도메인을 깊게 이해하게 되므로 코드 자체도 문서화의 대상이 됩니다.
#
엔티티와 밸류- 도출한 모델은 크게 엔티티(Entity)와 밸류(Value)로 구분할 수 있습니다.
#
엔티티- 엔티티의 가장 큰 특징은 식별자를 갖는 것입니다.
Order |
---|
-orderNumber:String |
-orderLines:List<OrderLine> |
-totalAmount:int |
-ShippingInfo:ShippingInfo |
-state:OrderState |
#
엔티티의 식별자 생성- 엔티티의 식별자를 생성하는 시점은 도메인의 특징과 사용하는 기술에 따라 달라지며, 흔히 식별자는 다음 중 한가지 방식으로 생성합니다.
- 특정 규칙에 따라 생성
- UUID 사용
- 값을 직접 입력
- 일련번호 사용
#
밸류 타입- 밸류 타입은 개념적으로 완전한 하나를 표현활 때 사용합니다.
#
엔티티 식별자와 밸류 타입- 엔티티 식별자 타입으로 String 대신 OrderNo 밸류 타입을 사용하면 타입을 통해 해당 필드가 주문번호라는 것을 알 수 있습니다.
#
도메인 모델에 set 메서드 넣지 않기- 도메인 모델에 get/set 메서드를 무조건 추가하는 것은 좋지 못합니다.
- 특히 set 메서드는 모데인의 핵심 개념이나 의도를 코드에서 사라지게 합니다.
#
도메인 용어- 코드를 작성할 때 도메인에서 사용하는 용어는 매우 중요합니다.
- 즉, 아래의 코드 보다는 의미있는 코드를 쓰는 것이 좋습니다.