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메서드 넣지 않기