1) 프로젝트에서의 도메인 전문가와 개발자
2) 도메인 전문가의 요구사항을 올바르게 이해하는 방법
도메인: 특정 도메인을 개념적으로 표현한 것
도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 됨
도메인 모델링 방법
객체 모델
상태 다이어그램
클래스 다이어그램
- 꼭 UML 표기법만 사용할 필요는 없음, 필요에 따라 그래프나 수학 공식으로도 표현할 수 있다.
UML: Unified Modeling Language, 시스템을 모델로 표현해주는 대표적인 모델링 언어. 구조 다이어그램과 행위 다이어그램으로 나눌 수 있음.
➕ 알아두기
하위 도메인이 다루는 영역이 서로 다르므로, 여러 하위 도메인을 하나의 다이어그램에 모델링하면 안 됨.
1.4.1 어플리케이션의 아키텍처
구성: user - 표현 / 응용 / 도메인 / 인프라 - DB
- UI 또는 표현: 사용자의 요청을 처리하고 사용자에게 데이터를 보여줌. 사용자는 사람뿐만 아니라 외부 시스템일 수도 있음.
- 응용: 사용자가 요청한 기능을 실행함.
- 도메인: 시스템이 제공할 도메인 규칙을 구현.
이게 무슨 말이나면... 예를 들어 '출고 전에 배송지를 변경할 수 있다' 라는 규칙이 있다면 이러한 규칙을 구현한 코드가 도메인 계층에 위치하게 되는 것.
- 인프라스트럭처: 외부 시스템(ex.DB)과의 연동을 처리.
1.4.2 실습
# p. 31-32
# 주문 도메인의 일부 기능을 도메인 모델 패턴으로 구현
➕ 알아두기
개념 모델은 순수하게 문제를 분석한 결과물. 다른 요소에 대한 고려 없이 오로지 문제만을 분석해두었기 때문에 있는 그대로 사용할 수 없고, 구현 가능한 형태의 모델로 전환해야 함
구현을 시작하기 위해서는 도메인에 대한 초기 모델이 필요함.
도메인 모델링의 기본 작업: 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것. ➡️ 요구사항에서 출발
ex) 주문 요구사항
- 최소 한 종류 이상의 상품을 '주문'
- 한 상품을 한 개 이상 '주문'
- '총 주문 금액'은 각 상품의 구매 가격 합을 모두 더한 금액
- 각 상품의 '구매 가격 합'은 상품 가격에 구매 개수를 곱한 값
- 주문할 때 '배송지 정보'를 반드시 지정해야 함
- '배송지 정보'는 받는 사람 이름, 전화번호, 주소로 구성
- '출고'를 하면 '배송지를 변경'할 수 없음
- '출고' 전에 '주문을 취소'할 수 있음
- 고객이 '결제를 완료'하기 전에는 상품을 준비하지 않음
➡️ 주문은 '출고 상태로 변경하기', '배송지 정보 변경하기', '주문 취소하기', '결제 완료하기' 기능을 제공한다는 것을 파악할 수 있음
- 주문 요구 사항에 따라 Order에 관한 메서드를 추가해보면...
# p.36
# 주문 항목이 어떤 데이터로 구성되는지
- 주문 항목 OrderLine을 표현해보면...
# p. 36
# 한 상품을 얼마에 몇개 살지를 담고 있음.
- Order과 OrderLine의 관계는...
# p.37
➕ 문서화
- 문서화를 하는 이유: 지식을 공유하기 위함
- 코드 자체도 문서화의 대상이 됨. 도메인 관점에서 코드가 도메인을 잘 표현해야 비로소 코드의 가독성이 높아지고, 문서로서 코드가 의미를 가짐
1.6.1 엔티티
실습 코드
1.6.2 엔티티의 식별자 생성
java.util.UUID
클래스 사용해서 생성 가능1.6.3 밸류 타입
# p.47-52 실습 코드
1.6.4 엔티티 식별자와 밸류 타입
# p.53 상단 실습 코드
1.6.5 도메인 모델에 set 메서드 넣지 않기
# p.53-55
➕ DTO의 get/set 메서드
DTO: Data Transfer Object, 프레젠테이션 계층과 도메인 계층이 데이터를 서로 주고받을 때 사용하는 일종의 구조체. 오래전에 사용했던 프레임워크에서는 구현 기술을 적용하기 위해서 어쩔 수 없이 DTO에 get/set 메서드를 구현해야 했지만, 요즘 프레임워크는 set 메서드를 만드는 대신 private 필드에 직접 값을 할당함으로써 구현함. 따라서, DTO도 불변 객체가 되어 불변의 장점을 취할 수 있음!