반응형
값객체를 엔티티의 식별자에도 사용하기 시작했다.
@Getter
@Embeddable
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class HubId implements Serializable { // JPA 식별자 타입은 Serializable 구현해야 함
@Column(name = "id")
private UUID id;
public static HubId of(UUID id) {
HubId hubId = new HubId();
hubId.id = id;
return hubId;
}
public static HubId ofRandom() {
HubId hubId = new HubId();
hubId.id = UUID.randomUUID();
return hubId;
}
}
요구사항이 식별자는 UUID여서 랜덤의 UUID를 가지는 생성자를 정적 팩토리 메소드로 만들었다.
@Getter
@Entity
@Table(name = "p_hub")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Hub extends BaseEntity {
@EmbeddedId
private final HubId id = HubId.ofRandom();
@Embedded
private Address address;
@Embedded
private Coordinate coordinate;
@OneToMany(mappedBy = "hub")
private List<Inventory> inventoryList = new ArrayList<>();
@Builder
private Hub(Address address, Coordinate coordinate) {
this.address = address;
this.coordinate = coordinate;
}
}
그리고 이렇게 @EmbeddedId 어노테이션으로 값객체를 식별자로 사용한다는 것을 표시했다.
JPA에서 식별자 타입은 Serializable 타입이어야 해서 이를 구현해주면 된다.
값객체를 식별자로 사용하면 아래와 같은 이점이 있다.
- 식별자라는 의미를, 그것도 Hub 엔티티의 식별자라는 의미를 부각시킬 수 있다.
- 하나의 UUID 필드가 아닌, "객체" 이므로 기능을 추가할 수 있다.
- 위와 같이, UUID를 HubId로 변환한다든지, 랜덤한 UUID로 HubId를 만드는 기능을 추가했다
반응형
'TIL ✍️' 카테고리의 다른 글
24/10/04(금) 110번째 TIL : 컴포넌트 스캔 패키지 구조 문제 (0) | 2024.10.07 |
---|---|
24/09/30(월) 109번째 TIL : 카프카 직렬화 및 역직렬화 (0) | 2024.10.01 |
24/08/27(화) 107번째 TIL : Embeddable 값객체 (0) | 2024.09.09 |
24/08/26(월) 106번째 TIL : mapStruct와 @Getter 사용 시 boolean 필드 매핑 (1) | 2024.09.01 |
24/08/23(금) 105번째 TIL : Gradle로 WAR 파일 빌드하기 (2) | 2024.08.30 |