@IdClass
🔗 @IdClass
정의
@IdClass는 JPA에서 복합 키(Composite Key)를 엔티티의 식별자로 사용하기 위한 애너테이션이다. 엔티티의@Id필드를 여러 개 선언하고, 별도의 키 클래스에 같은 이름과 타입의 필드를 정의해서 사용한다.
복합 키를 사용해야 하지만 엔티티 필드를 그대로 유지하고 싶을 때 자주 사용한다.
🧩 역할
- 복합 키를 엔티티 필드 단위로 관리한다
- 엔티티와 키 클래스가 분리되어 있으면서도 직접적인 필드 접근이 가능하다
- Querydsl이나 JPQL에서 키 필드를 비교적 직관적으로 사용할 수 있다
🛠 사용법
복합 키 클래스 정의
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EquipmentId implements Serializable {
private String name;
private Integer rank;
}
엔티티에 @IdClass 적용
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
@Entity
@IdClass(EquipmentId.class)
public class Equipment {
@Id
@Column(name = "NAME", nullable = false)
private String name;
@Id
@Column(name = "RANK", nullable = false)
private Integer rank;
@Column(name = "EXPLANATION")
private String explanation;
}
@EmbeddedId와 비교
| 항목 | @IdClass |
@EmbeddedId |
|---|---|---|
| 키 구조 | 엔티티 필드에 @Id를 각각 선언 |
키 객체 하나로 묶어서 선언 |
| 가독성 | 필드가 분리되어 직관적 | 키를 하나의 객체로 관리 |
| 사용성 | 엔티티 필드 접근이 편함 | 키 객체 접근이 필요 |
| 선택 기준 | 엔티티 필드를 그대로 두고 싶을 때 | 키를 값 객체처럼 다루고 싶을 때 |
⚠️ 주의사항
- 복합 키 클래스는
Serializable을 구현하는 것이 일반적이다. - 키 클래스의 필드명과 엔티티의
@Id필드명이 같아야 한다. equals()와hashCode()를 올바르게 구현해야 한다.- 복합 키는 변경 가능성이 낮은 식별자에 사용하는 것이 좋다.
📌 정리
@IdClass는 복합 키를 엔티티 필드에 직접 선언하는 방식이다.@EmbeddedId보다 엔티티 필드 접근이 직관적인 편이다.- 복합 키 클래스와 엔티티 필드의 이름, 타입, 순서를 맞추는 것이 중요하다.
댓글남기기