- 객체 기반 도메인 모델의 구성요소는 다음과 같다.
- 엔티티
- 밸류
- 애그리거트
- 리포지토리 -> 구현을 위한 도메인 모델
- 도메인 서비스
도메인 모델은 크게 엔티티와 밸류로 구분된다.
엔티티(Entity) - 식별자를 갖는 객체
// 엔티티
public class Order {
private String orderNumber;
...
}
- 엔티티는 도메인의 고유한 개념을 표현하며, 도메인 모델의 엔티티는 데이터와 함께 도메인 기능을 제공한다.
- 주문 도메인 모델에서 주문에 해당하는 클래스가 Order이므로 Order가 엔티티가 된다.
- 식별자는 엔티티 객체마다 고유하며, 엔티티를 생성하고 속성을 바꾸고 삭제할 때까지 식별자는 바뀌지 않는다.
- 주문 도메인 모델에서 Order 엔티티는 주문번호를 속성으로 갖는다.
- 대표적인 엔티티의 식별자 생성 방식
- 특정 규칙에 따라 생성
- ex) 현재 시간과 다른 값의 조합
- 사용자가 값을 직접 입력
- ex) 회원의 아이디나 이메일
- 고유 식별자 생성기 사용
- ex) UUID
- 일련번호 사용(주로 데이터베이스가 제공하는 자동 증가 기능 사용)
- ex) MySQL의 자동 증가 칼럼 -> 자동 증가 칼럼 방식의 경우, DB 테이블에 데이터를 추가하기 전에는 식별자를 알 수 없다.
- 특정 규칙에 따라 생성
- 엔티티에서 공개(public) set 메서드를 피해야한다. 이유는 다음과 같다.
- 도메인의 핵심 개념이나 의도를 코드에서 사라지게 한다.
- 객체의 일관성이 깨질 가능성이 높아진다. (객체의 일관성이란 객체의 속성이 불완전하거나 모순되지 않도록 유지하는 원칙이다.)
밸류(Value) - 식별자를 갖지 않는 객체
public class ShippingInfo {
private Receiver receiver;
// private String receiverName;
// private String receiverPhoneNumber;
...
}
// 밸류
public class Receiver {
private String name;
private String phoneNumber;
...
}
- 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용한다.
- ShippingInfo 클래스의 receiverName과 receiverPhoneNumber 필드는 서로 다른 두 데이터를 담고 있지만, 두 필드는 개념적으로 “받는 사람”이라는 하나의 개념을 표현한다. “받는 사람”이라는 개념을 위와 같이 Receiver로 표현할 수 있다.
- 밸류 타입은 불변으로 구현한다.
- 불변이란 데이터 변경 기능(ex) set 메서드)을 제공하지 않는 것을 의미하며, 불변 객체는 참조 투명성과 스레드에 안전한 특징을 가지고 있다.
- 밸류 타입이 꼭 두 개 이상의 데이터를 가져야 하는 것은 아니다. 의미를 명확하게 표현하기 위해 밸류 타입을 사용하는 경우도 있다. 또한, 밸류 타입은 밸류 타입을 위한 기능을 추가할 수 있다는 장점이 있다.
- 참고 자료
도메인 주도 개발 시작하기(저자: 최범균)
https://sungman.tistory.com/16