🔗 @IdClass

정의

@IdClassJPA에서 복합 키(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보다 엔티티 필드 접근이 직관적인 편이다.
  • 복합 키 클래스와 엔티티 필드의 이름, 타입, 순서를 맞추는 것이 중요하다.

연결문서

태그: ,

카테고리:

업데이트:

댓글남기기