일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- spring boot
- Template Method Pattern
- 디자인 패턴
- Java
- Was
- Stream
- 스트림
- SERVLET
- 자바
- domain
- Clean Code
- Java 8 in action
- AWS101
- spring
- 클린코드
- 패스트캠퍼스
- head first
- spring Batch
- Java8 in action
- Java8
- 자바8인액션
- facade pattern
- jsp
- Design Pattern
- Java in action
- web
- CQRS
- 자바8
- ddd
- 자바의 신
Archives
- Today
- Total
주난v 개발 성장기
[DDD START!] 1장. 도메인 모델 시작 본문
도메인
- "서점" 도메인
- 회원, 주문, 결제, 배송 하위 도메인 존재
도메인 모델 패턴
- 사용자 인터페이스, 표현 계층
- 사람, 외부 API 등 에게 요청을 받고, 정보를 보여줌
- 사용자의 세션을 관리
- 응용 계층
- 비즈니스 로직 X
- 각 도메인 계층에 업무를 위임하고, 이를 조합하여 실행
- 도메인 계층
- 비즈니스 로직
- 인프라 스트럭쳐 계층
- RDB
- SQS, MQTT
- API
Q ) 새로운 요구사항
- 출고 전에 배송지를 변경 할 수 있다.
- 주문 취소는 배송전에 할 수 있다.
이 2가지 요구사항을 각각 출고 서비스, 주문 서비스, 배송 서비스에서 구현을 해도 할 수는 있지만, 유지보수가 어렵고
한 쪽에서 정책이 바뀐다면 모든 코드를 다 확인해야 한다.
public class Order {
private OrderState state;
private boolean isShippingChangeable() {
return state == OrderState.PAYMENT_WAITING || state == OrderState.WAITING;
}
private void cancel() {
...
}
}
public enum OrderState {
PAYMENT_WAITING, PREPARING, SHIPPED, DELIVERING, DELIVERING_COMPLETE;
}
// 주문 내역
public class OrderLine {
private Product product;
private int price;
private int quantity;
private int amounts;
....
}
public class ShippingInfo {
private String receiverName;
private String phoneNumber;
...
}
public class Order {
private List<OrderLine> orderLine;
private ShippingInfo shippingInfo;
private int totalAmounts;
}
"도메인 관점에서 작성된 코드가 가독성이 높고, 문서로서 코드가 의미를 갖는다."
Entity와 Value
차이 ? 식별자 유무
Entity는 회원 - 회원 아이디, 주문 - 주문 아이디 등의 식별자를 가지며, 변경 되지 않는다. (PK)
Value - 데이터를 담는 객체, 불변 객체(immutable), 조합? 정도.. 주소 값
도메인 모델에 set 메서드 넣지 않기
단순 값을 셋팅해주는 역할이라고 하더라도, completePayment() 등 처럼 명시적으로 선언을 한다.
Order order = new Order();
order.setOrderLine();
order.setShippingInfo();
order.setState();
위 처럼 구현을 한다면, 주문을 하는 쪽의 모든 코드를 고쳐줘야한다.
할인율이 추가되었다던지, 상태값이 추가 되었다던지...
접근 범위를 private으로 하고, 외부에서 데이터를 변경하는 용도로 set 메서드를 사용할 수 없다.
마치며...
도메인 용어를 명확하게 해라...
OrderState가 STEP1, STEP2...이렇다면 누구도 파악하기 힘들다.
시간을 들여 찾는 노력을 해야한다.
'개발 성장기 > DDD' 카테고리의 다른 글
[DDD START!] 6장. 응용 서비스와 표현 영역 (1) | 2020.05.26 |
---|---|
[DDD START!] 5장. 리포지터리의 조회 기능 (0) | 2020.05.22 |
[DDD START!] 4장. 리포지터리와 모델 구현 (0) | 2020.05.19 |
[DDD START!] 3장. 애그리거트 (0) | 2020.05.15 |
[DDD START!] 2장. 아키텍처 개요 (0) | 2020.05.07 |