DDD start! 정리하기
3개월간 프로젝트를 진행하면서 꾸준히 읽어온 책을 정리해보려 한다.
책이 절판돼서 도서관을 여러곳 들려 찾았다...! 살 수 있음 좋겠는데..
CHAPTER 1 도메인 모델 시작
1. 도메인
ex) 온라인 서점을 통해 책을 구매한다.
개발자의 입장에서 온라인 서점은 구현해야 할 대상이 된다.
온라인으로 책을 판매하기 위한 기능을 제공해야 되고,
'온라인 서점'은 소프트웨어로 해결하고자 하는 문제의 영역 즉 domain이 된다.
- 도메인은 여러 하위 도메인으로 구성된다.
- 하위 도메인은 서비스의 일련의 과정을 처리한다.
- 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공한다.
2. 도메인 모델
- 도메인 모델은 특정 도메인을 개념적으로 표현한 것이다.
- 도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델이다.
- 하위 도메인이 다루는 영역은 서로 다르기 때문에 같은 용어라도 하위 도메인마다 의미가 달라질 수 있다.
3. 도메인 모델 패턴
- 이 책의 도메인 모델은 마틴 파울러가 쓴 엔터프라이즈 어플리케이션 아미텍처 패턴(PEAA)이다.
- 도메인 모델은 아미텍처상의 도메인 계층을 객체 지향 기법으로 구현하는 패턴을 말한다.
- 비즈니스 로직을 도메인 모델에 위치시키면, 로직을 수정,추가할 때 다른 코드에 영향을 덜 준다.
4. 도메인 모델 도출
- 도메인 모델링을 할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것이다.
- 기획서, 유스케이스, 사용자 스토리와 같은 요구사항을 통해 도메인을 이해하고, 도메인 모델 초안을 만들고 코드를 작성한다.
5. 엔티티와 벨류
- 도메인은 크게 Entity와 Value로 나뉜다.
- Entity의 가장 큰 특징은 식별자를 갖는 것이다. ex) 주문 도메인에서 각자 다른 주문 번호가 식별자다.
public class Order {
private String orderNumber;
...
}
- Value 타입은 개념적으로 완전한 하나를 표현할 때 사용한다.
- ex) ShippingInfo라는 객체에서 주소 관련 데이터는 Address라는 Value 타입을 사용해서 더 명확하게 표현할 수 있다.
@AllArgsConstructor
public class Address {
private String address1;
private String address2;
private String zipcode;
}
- Value 타입의 장점은 Value 타입을 위한 기능을 추가할 수 있다는 것이다.
- Value 객체의 데이터를 변경할 때 기존 데이터 보단 변경한 데이터를 갖는 새로운 Value 객체를 생성하는 방식을 선호한다.
- Money처럼 데이터 변경 기능을 제공하지 않는 것을 불변(immutable)이라고 표현한다.
- 사용하는 가장 큰 이유는 불편 타입을 사용하면 보다 안전한 코드를 작성할 수 있다.
public class Money {
private int value;
public Money add(Money money) {
return new Money(this.value + money.value);
}
// value 를 변경할 수 있는 메서드가 없음
}
- Money가 단순 숫자가 아닌 도메인의 '돈'을 의미하는 것처럼 이런 식별자는 단순한 문자열이 아니라 도메인에서 특별한 의미를 지니는 경우가 많기 때문에 식별자를 위한 밸류타입을 사용해서 의미가 잘 드러나도록 할 수 있다.
public class Order {
private OrderNo id;
...
public OrderNo getId() {
return id;
}
}
6. 도메인 용어
- STEP1, STEP2, STEP3 과 같은 의미 없는 용어가 아닌
- PAYMENT_WAITING, PREPARING와 같이 도메인에서 사용하는 용어를 최대한 코드에 반영하면, 코드를 도메인 용어로 해석하거나 도메인 용어를 코드로 해석하는 과정이 줄어든다.
- 이는 가독성을 높여서 코드를 분석하고 이해하는 시간을 절약할 수 있으며, 의미를 변환하는 과정에서 발생하는 버그도 줄어든다.