도메인주도개발

밸류를 이용한 ID의 매핑

OverTheHorizon3410 2024. 1. 5. 00:19

밸류 타입의 식별자 활용

  • 식별자를 부각시키기 위하여 밸류 타입을 사용가능하다.
    • OrderNo, MemberId 등이 밸류 타입으로 사용된 식별자이다.
  • 밸류 타입을 식별자로 매핑하면 @Id 대신 @EmbeddedId 를 사용
@Entity 
@Table(name = "purchase_order") 
public class Order { 
    @EmbeddedId 
    private OrderNo number; 
}

@Embeddable 
public class OrderNo implements Serializable { 
    @Column(name="order_number") 
    private String number; 
}
  • EmBeddable 테이블에 Serializable 는 왜 사용되었을까?
    • JPA 는 2차 캐시를 사용하여 엔티티를 캐시할 때, 해당 엔티티의 식별자값을 직렬화하여 사용한다.
      • 만약 식별자 값이 Serializable 인터페이스를 구현하지 않았다면, 엔티티를 캐시하는 과정에 직렬화를 수행할 수 없기에, 런타임 오류가 발생하게 된다.
    • 또한 분산 환경에서 엔티티 전송시에 식별자 값을 직렬화해야하는데, Serializable 인터페이스를 구현하지 않은 식별자 값을 가진 엔티티를 분산 환경에서 사용하는 경우 엔티티 전송 과정에서 오류가 발생한다고 한다.

밸류 타입 식별자의 장점과 구현

@Embeddable 
public class OrderNo implements Serializable { 
    @Column(name = "order_number") 
    private String number;

    public boolean is2ndGeneration() { 
        return number.startsWith("N"); 
    }
}
  • 시스템 세대 구분이 필요한 코드의 경우, 식별자 밸류타입 자체에 식별자 기능을 추가할 수 있다는 장점이 생긴다.
    • 1세대 시스템과 2차세대 시스템의 주문번호를 구분하고자 하는 경우 주문번호의 첫 글자를 사용해서 구분이 가능하다.


Uploaded by N2T