Home > DDD(Domain-Driven Design) > 엔티티와 밸류

엔티티와 밸류
java
  • 객체 기반 도메인 모델의 구성요소는 다음과 같다.
    • 엔티티
    • 밸류
    • 애그리거트
    • 리포지토리 -> 구현을 위한 도메인 모델
    • 도메인 서비스

도메인 모델은 크게 엔티티와 밸류로 구분된다.

엔티티(Entity) - 식별자를 갖는 객체

// 엔티티
public class Order {
    private String orderNumber;
    ...
}
  • 엔티티는 도메인의 고유한 개념을 표현하며, 도메인 모델의 엔티티는 데이터와 함께 도메인 기능을 제공한다.
    • 주문 도메인 모델에서 주문에 해당하는 클래스가 Order이므로 Order가 엔티티가 된다.
  • 식별자는 엔티티 객체마다 고유하며, 엔티티를 생성하고 속성을 바꾸고 삭제할 때까지 식별자는 바뀌지 않는다.
    • 주문 도메인 모델에서 Order 엔티티는 주문번호를 속성으로 갖는다.
  • 대표적인 엔티티의 식별자 생성 방식
    • 특정 규칙에 따라 생성
      • ex) 현재 시간과 다른 값의 조합
    • 사용자가 값을 직접 입력
      • ex) 회원의 아이디나 이메일
    • 고유 식별자 생성기 사용
      • ex) UUID
    • 일련번호 사용(주로 데이터베이스가 제공하는 자동 증가 기능 사용)
      • ex) MySQL의 자동 증가 칼럼 -> 자동 증가 칼럼 방식의 경우, DB 테이블에 데이터를 추가하기 전에는 식별자를 알 수 없다.
  • 엔티티에서 공개(public) set 메서드를 피해야한다. 이유는 다음과 같다.
    1. 도메인의 핵심 개념이나 의도를 코드에서 사라지게 한다.
    2. 객체의 일관성이 깨질 가능성이 높아진다. (객체의 일관성이란 객체의 속성이 불완전하거나 모순되지 않도록 유지하는 원칙이다.)

밸류(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