소프트웨어로 해결하고자 하는 문제 영역
특정 도메인을 개념적으로 표현한 것
Presentation
: 사용자의 요청을 처리하고 사용자에게 정보를 보여준다.Application
: 사용자가 요청한 기능을 실행한다.Domain
: 시스템이 제공할 도메인의 규칙을 구현한다.Infrastructure
: 데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리한다.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;
}
private boolean isShippingChangeable() {
return state == OrderState.PAYMENT_WAITING || state == OrderState.PREPARING;
}
}
public enum OrderState {
PAYMENT_WAITING, PREPARING, SHIPPED, DELIVERING, DELIVERY_COMPLETED;
}
Entity
와 Value
를 구분해서 구현해야 한다.Entity
는 식별자를 가지며 동일성을 비교할 수 있다.Value
는 식별자가 없으며 동일성을 비교할 수 없다.equals()
메서드와 hashCode()
메서드를 구현할 수 있다.UUID uuid = UUID.randomUUID();
// 6c84fb90-12c4-11e1-840d-7b25c5ee775a 과 같은 형식의 문자열
String stringUUID = uuid.toString();
Immutable
로 구현하는 것이 가장 좋다.get/set
메서드를 무조건 추가하는 것은 좋지 않다.