@IdClass
이 글에서는 @Entity Class에 복합 기본 키를 지정 할 때, 사용하는 @IdClass Annotation에 대해서 알아보겠다.
필자는 Table마다 고유 Sequence를 사용하는 것을 선호하지만, 상황에 따라 또는 As-Is 프로그램의 구조상 어쩔 수 없이 복합키를 사용해야 하는 경우가 있다.
Entity에 복합키를 지정하는 방법이 @IdClass Annotation만 있는 것은 아니다. @EmbeddedId 와 @Embeddable Annotation을 사용하여 복합 키를 가진 Entity를 구성할 수 있다. 그러나 Key Class와 Entity Class가 분리되는 구조가 되기 때문에 QueryDsl을 사용하여 Custom 쿼리를 작성하는데 불편함이 생긴다. 그리고 복합키의 내용을 확인하려면 복합키 클래스에 접근해야 한다.
반면 @IdClass는 별도의 키 클래스를 지정하며, 이 클래스는 기본 키를 구성하는 필드들을 포함한다. 필자의 생각에는 이 방법이 가독성과 Querydsl 사용 측면에서 장점이 좀더 많다고 생각한다. 샘플 코드를 한번 살펴보자.
@IdClass를 사용한 복합키 Entity
필자는 게임 장비 정보와 대응하는 Entity를 구성할 예정이다. 필요한 정보는 장비명, 등급, 장비 설명 등이 있을 것이다. 이 중 장비명과 등급을 복합키로 사용하겠다.
먼저 복합키로 사용할 장비명과 등급을 별도 클래스로 분리하여 선언한다.
@NoArgsConstructor @AllArgsConstructor
@Data
public class EquipmentCompositeKey implements Serializable {
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "RANK", nullable = false)
private Integer rank;
}
여기서 주의할 점은 java.io의 Serializable 인터페이스를 구현해야 하며, Equals 와 hashcode를 선언해주어야 한다는 점이다. 필자는 @Data Annotation 을 사용하였다.
그리고 @IdClass를 사용한 Entity Class를 선언한다.
@Entity
@NoArgsConstructor @AllArgsConstructor
@Getter @Setter
@IdClass(EquipmentCompositeKey.class)
public class StatisticsProcessStatusInlineView {
@Id
@Column(name = "NAME", nullable = false)
private String name;
@Id
@Column(name = "RANK", nullable = false)
private Integer rank;
@Column(name = "EXPLANATION")
private String explanation;
}
댓글남기기