엔티티?

엔티티의 정의와 특징

  • 식별자
    • 고유한 식별자

엔티티의 변화와 식별자의 불변성

  • 속성 변화와 식별자
    • 엔티티의 속성이 변경되어도 식별자가 변하지 않음.
    • 주문의 배송지 주소나 상태가 변경되어도 식별자가 동일하게 유지되어야함

동등성

  • 동등성 비교
    • equals()
    • hashCode
      public class Order {
          private String orderNumber;
          private List<OrderLine> orderLines; // 기타 필드
      
          // 기타 메서드 ...
      
          @Override
          public boolean equals(Object obj) {
              if (this == obj) return true;
              if (obj == null) return false;
              if (getClass() != obj.getClass()) return false;
              Order other = (Order) obj;
              if (orderNumber == null) {
                  if (other.orderNumber != null) return false;
              } else if (!orderNumber.equals(other.orderNumber)) return false;
              return true;
          }
      
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + ((orderNumber == null) ? 0 : orderNumber.hashCode());
              return result;
          }
      }

엔티티 식별자 생성

식별자 생성 중요성

  • 엔티티의 식별
    • 엔티티는 고유한 식별자를 가지고, 엔티티의 동일성 유지에 도움
    • 식별자는 엔티티를 구별하고 추적하는 데 핵심적인 역할

식별자 생성

  • 특정 규칙에 따라 생성
    • 도메인이나 비즈니스 규칙에 따라 식별자 생성
    • 현재 시간과 다른 값을 조합하는 방식이 흔함
  • UUID 사용
    • 범용적으로 고유 식별자를 생성할 수 있음.
    • 대부분의 개발 언어에서 UUID 생성기를 제공
  • 값 직접 입력
    • 사용자가 직접 식별자 입력 ( 회원 ID , 이메일 )
    • 중복 입력 방지가 필요함
  • 일련번호 사용
    • DB의 시퀀스 나 자동 증가 컬럼 사용

식별자 생성 전략 선택의 고려 사항

  • 도메인 특징과 기술
    • 도메인의 특징과 사용하는 기술에 따라 적절한 식별자 생성 전략을 선택
  • 동시성과 고유성
    • 동시에 식별자를 생성해도 고유성 보장
  • 나노 ID
    • 최근 고유 식별자 생성을 위해 사용되는 방식 중 하나로, Nano ID를 사용하는 곳도 증가하고 있다.

자바 코드 UUID

import java.util.UUID;

public class IdentifierGenerator {
    public String generateUUID() {
        UUID uuid = UUID.randomUUID();
        return uuid.toString();
    }
}

밸류 타입

  • 밸류 타입의 정의
    • 완전한 하나의 개념
      • 밸류 타입은 개념적으로 완전한 하나를 표현하는 데 사용된다.
      • 여러 데이터가 모여 하나의 의미있는 개념을 이루는 경우 사용
    • 예시
      public class ShippingInfo {
      		private String receiverName;
      		private String receiverPhoneNumber;
      		private String shippingAddress1;
      		private String shippingAddress2;
      		private String shippingZipcode;
      }
      • ShippingInfo 안의 데이터를 보면
        		private String receiverName;
        		private String receiverPhoneNumber;
        • 는 받는 사람
        		private String shippingAddress1;
        		private String shippingAddress2;
        		private String shippingZipcode;
        • 는 주소
        • 그룹으로 나누고
      • ShippingInfo
        • 받는 사람
        • 주소
          • 그룹으로 분리가 가능하다.
  • 밸류 타입 예시
    • 받는 사람
      public class Receiver {
          private String name;
          private String phoneNumber;
      
          public Receiver(String name, String phoneNumber) {
              this.name = name;
              this.phoneNumber = phoneNumber;
          }
      
          // getter 메서드 ...
      }
    • 주소
      public class Address {
          private String address1;
          private String address2;
          private String zipcode;
      
          public Address(String address1, String address2, String zipcode) {
              this.address1 = address1;
              this.address2 = address2;
              this.zipcode = zipcode;
          }
      
          // getter 메서드 ...
      }
    • ShppingInfo
      public class ShippingInfo {
          private Receiver receiver;
          private Address address;
      
          public ShippingInfo(Receiver receiver, Address address) {
              this.receiver = receiver;
              this.address = address;
          }
      
          // getter 메서드 ...
      }

밸류 타입은 도메인의 의미를 명확하게 전달하는 데 중요함

  • 밸류 타입을 재사용을 고려하여 설계함.
    • 코드 중복 DOWN , 일관성 유지하는 데 도움이 됨.
  • 적절한 범위의 밸류 타입
    • 너무 많은 정보를 하나의 밸류 타입에 넣거나 너무 적은 정보만을 넣는 것을 피해야함
    • 적절한 범위에서 의미 있는 단위로 밸류 타입을 정의해야한다.


Uploaded by N2T

'도메인주도개발' 카테고리의 다른 글

도메인 전문가와 개발자 간 지식 공유  (0) 2023.12.30
도메인 모델  (0) 2023.12.30
도메인 모델 패턴  (0) 2023.12.30
엔티티 식별자와 밸류 타입  (0) 2023.12.30
도메인이란?  (0) 2023.12.30