도메인주도개발
밸류를 이용한 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
인터페이스를 구현하지 않은 식별자 값을 가진 엔티티를 분산 환경에서 사용하는 경우 엔티티 전송 과정에서 오류가 발생한다고 한다.
- JPA 는 2차 캐시를 사용하여 엔티티를 캐시할 때, 해당 엔티티의 식별자값을 직렬화하여 사용한다.
밸류 타입 식별자의 장점과 구현
@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