ex) 온라인 서점 도메인
온라인 서점 소프트웨어는 온라인으로 책을 판매하는 데 필요한 상품조회, 구매, 결제, 배송 추적 등의 기능을 제공해야 한다. 이때, '온라인 서점'은 소프트웨어로 해결하고자 하는 문제 영역, 즉 도메인에 해당된다.
또한 고객이 물건을 구매하면 주문, 결제, 배송, 혜택 등 하위 도메인의 기능이 엮이게 된다

애플리케이션의 아키텍처는 위와같은 계층구조를 가진다.
| 영역 | 설명 |
|---|---|
| 사용자 인터페이스 (표현 계층) | 사용자의 요청을 처리하고 응답하는 계층 |
| 응용 계층 | 사용자가 요청한 기능을 싱행하는 계층, 로직을 직접 구현하는 것이 아니라 도메인 계층을 조합해서 기능을 실행한다. |
| 도메인 계층 | 시스템이 제공할 도메인 규칙을 구현한다. |
| 인프라스트럭처 계층 | 데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리하는 계층 |
도메인 계층의 도메인의 핵심 규칙을 구현한다.
public class Order {
private OrderState state;
private ShippingInfo shippinginfo;
public void changeShippingInfo(ShippingInfo newShippingInfo) {
if (!state.isShippingChangeable()) {
throw new IllegalStateException("can't change shipping in " + state);
}
this.shippinginfo = newShippingInfo;
}
// ...
}
public enum OrderState {
PAYMENT_WAITING {
public boolean isShippingChangeable() {
return true;
}
},
PREPARING {
public boolean isShippingChangeable() {
return true;
}
},
SHIPPED, DELIVERING, DELIVERY_COMPLETED;
public boolean isShippingChangeable() {
return false;
}
}
위 코드는 주문 도메인의 일부 기능을 도메인 모델 패턴으로 구현했다.
1.6.1 엔티티
식별자를 갖는다는 것이다.1.6.2 엔티티의 식별자 생성
1.6.3 밸류 타입
ShippingInfo 클래스는 받는 사람과 주소에 대한 데이터를 갖고 있다.
밸류 타입은 별도의 식별자가 없고, 객체 자체로 의미를 명확히 표현 가능하게 한다.
예시 - Address, Money 등
OrderLine에서 int타입의 price와 amounts 필드를 사용하는데, 이를 밸류 타입인 Money타입으로 대체하여 의미를 보다 명확하게 표현하고 밸류 타입이 가지고 있는 기능을 이용할 수 있다.
public class OrderLine {
private Product product; // 주문할 상품
private int price; // 상품의 가격
private int quantity; // 구매 개수
private int amounts; // 구매 가격 합
...
}
public class OrderLine {
private Product product; // 주문할 상품
private Money price; // 상품의 가격
private int quantity; // 구매 개수
private Money amounts; // 구매 가격 합
}
1.6.4 엔티티 식별자와 밸류 타입
1.6.3 도메인 모델에 set메서드 넣지 않기