[도메인 주도 개발 시작하기] 1. 도메인 모델 시작하기

hyng·2023년 1월 18일
0

도메인 주도 개발 시작하기을 읽고 인상 깊었던 내용을 간단히 정리합니다.

엔티티와 밸류

  • 엔티티의 가장 큰 특징은 식별자를 가진다는 것이다.
  • 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용한다.

빨간 네모 박스 안에 값들은 개념적으로 ‘받는 사람’을 의미하고 파란 네모 박스 안에 값들은 '주소'를 의미한다

public class Receiver{
 private String name; 
 private String phoneNumber;

 public Receiver(String name, String phoneNumber){
	this.name = name
	this.phoneNumber = phoneNumber;
 }
}

public class Address{
	private String address1;
	private String address2;
	private String zipcode;

}

Receiver는 ‘받는 사람’이라는 도메인 개념을 표현한다.
Address는 '주소'라는 도메인 개념을 표현한다.
밸류 타입을 사용함으로써 개념적으로 완전한 하나를 잘 표현할 수 있는 것이다.

public class ShippingInfo {
	private Receiver receiver;
	private Address address;
}

벨류 타입의 또 다른 장점은 벨류 타입을 위한 기능을 추가할 수 있다는것이다.

public class Money {
	private int value;
	public Money add(Money money) {
		return new Money(this.value + money.value);
	}
	public Money multiply(int multiplier) {
		return new Money(value * multiplier);
	}
}

벨류 타입을 불변으로 구현함으로써 안전한 코드를 작성 할 수 있다.

Money price = ...;
OrderLine line = new OrderLine(product, private, quantity);
// 만약 price.setValue(0)로 값을 변경할 수 있다면?
  • 도메인 모델에 set 메서드 넣지 않기
    • 특히 set 메서드는 도메인의 핵심 개념이나 의도를 코드에서 사라지게 한다.
      changeShippingInfo() → setShippingInfo()
      completePayment() → setOrderState()
    • 도메인 객체를 생성할 때 온전하지 않은 상태가 될 수 있다.
      Order order = new Order();
      
      order.setOrderLine(lines);
      order.setShippingInfo(shippingInfo);
      
      order.setState(OrderState.PREPARING);
      • 주문자가 없는 주문의 상태를 상품 준비 중 상태로 변경한 것이다.
      • 도메인 객체가 불완전한 상태로 사용되는 것을 막으려면 생성시점에 필요한 것을 전달해 주어야 한다.
  • 적절한 도메인 용어를 사용하자


public enum OrderState { ❌
STEP1, STEP2, STEP3, STEP4, STEP5, STEP6
}
public enum OrderState { ⭕️
PAYMENT_WAITING, PREPARING, SHIPPED, DELIVERING, DELIVERY_COMPLETED;
}

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글