비즈니스 도메인을 중심으로 시스템을 설계하는 방법
데이터베이스 스키마나 기술적인 제약조건에 우선순위를 두지 않고, 비즈니스 요구사항을 우선으로 하여 설계
'주문' 도메인을 DDD로 설계한 구조 및 코드
public class Order {
private int orderId;
private Customer customer;
private List<OrderItem> orderItems;
private OrderStatus status;
public Order(int orderId, Customer customer, List<OrderItem> orderItems) {
this.orderId = orderId;
this.customer = customer;
this.orderItems = orderItems;
this.status = OrderStatus.PLACED;
}
public void cancel() {
if (this.status == OrderStatus.PLACED) {
this.status = OrderStatus.CANCELED;
}
}
}
public class Customer {
private int customerId;
private String name;
private String email;
public Customer(int customerId, String name, String email) {
this.customerId = customerId;
this.name = name;
this.email = email;
}
}
public class OrderItem {
private int productId;
private String productName;
private int quantity;
public OrderItem(int productId, String productName, int quantity) {
this.productId = productId;
this.productName = productName;
this.quantity = quantity;
}
}
public enum OrderStatus {
PLACED, SHIPPED, DELIVERED, CANCELED
}
데이터베이스 스키마와 기술적인 제약조건을 중심으로 시스템을 설계하는 방법
데이터베이스의 테이블 구조와 제약조건을 먼저 설계하고, 이를 기반으로 어플리케이션을 설계한다
마찬가지로 주문 도메인을 SQL 중심으로 작성한 ERD 및 코드이다
// 주문 테이블
public class Order {
private int orderId;
private int customerId;
private OrderStatus status;
public Order(int orderId, int customerId, OrderStatus status) {
this.orderId = orderId;
this.customerId = customerId;
this.status = status;
}
public void cancel() {
if (this.status == OrderStatus.PLACED) {
this.status = OrderStatus.CANCELED;
}
}
}
public enum OrderStatus {
PLACED, SHIPPED, DELIVERED, CANCELED
}
// 고객 테이블
public class Customer {
private int customerId;
private String name;
private String email;
public Customer(int customerId, String name, String email) {
this.customerId = customerId;
this.name = name;
this.email = email;
}
}
DDD와는 달리, 주문 항목(OrderItem) 정보를 나타내는 객체가 없으며, 대신 데이터베이스 테이블과 매핑되는 필드만 가지고 있게 된다.