반응형

@EmbeddedId와 @IdClass

@EmbeddedId

JPA에서 복합키를 가진 엔티티 클래스의 복합 키를 매핑하는 데 사용합니다. 이 어노테이션은 복합 키를 하나의 임베디드 클래스로  정의할 때 사용됩니다.

복합키란 단일 필드가 아닌 둘 이상의 필드를 결합하여 엔티티의 기본 키로 사용하는 경우를 말합니다. 이때 @EmbeddedId를 통해 해당 복합 키를 하나의 클래스로 정의하고 해당 클래스를 엔티티 클래스에 포함하여 사용합니다.

@Getter
@Setter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "user_card")
public class UserCard implements Serializable {

  @EmbeddedId
  private UserCardId id;

  @ManyToOne
  @MapsId("userId")
  @JoinColumn(name = "user_id")
  private User user;

  @ManyToOne
  @MapsId("cardId")
  @JoinColumn(name = "card_id")
  private Card card;

}

@IdClass

JPA에서 복합 키를 사용하는 엔티티 클래스에서 복합키를 정의하고 매핑하는 데 사용됩니다. 이 어노테이션을 사용하면 엔티티 클래스 내에 별도의 복합 키 클래스를 정의하지 않고도 복합 키를 선언하고 매핑할 수 있습니다.

@IdClass를 사용할 때, 엔티티 클래스는 여러 개의 필드를 사용하여 복합키를 정의하고 이를 별도의 클래스로 정의하지 않고 직접 사용합니다. 이 복합키는 실제 엔티티의 기본 키로 사용되며 이를 통해 엔티티 간의 관계를 매핑할 수 있습니다.

@IdClass(UserCardId.class)
@Entity
@Table(name = "user_card")
public class UserCard implements Serializable {

    @Id
    private Long userId;

    @Id
    private Long cardId;

    @ManyToOne
    @JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;

    @ManyToOne
    @JoinColumn(name = "card_id", insertable = false, updatable = false)
    private Card card;
}

@EmbeddedId와 @IdClass 장단점

@EmbeddedId와 @IdClass는 모두 복합 키(Composite Key)를 처리하기 위한 방법 중에 두 가지입니다. 각각의 방식에는 장단점이 있습니다.

@EmbeddedId를 사용할 때, 복합 키를 하나의 클래스로 정의하고 해당 클래스를 엔티티에 내장시킵니다. 이 방법은 객체지향적인 관점에서 복합 키를 다룰 수 있다는 장점이 있습니다.

즉, 복합 키 자체가 객체로 표현되어 엔티티의 필드로 사용됩니다. 이는 객체 간의 관계를 자연스럽게 표현하는데 도움이 됩니다. 

@IdClass를 사용할 때는 복합 키를 별도의 클래스로 분리하여 엔티티와 복합 키 클래스를 연결합니다. 이 방법은 중복된 필드를 가지고 있지 않으므로 구조적으로 보다 깔끔하게 보일 수 있지만 이 방식은 복합 키 클래스와 엔티티 간의 관계를 명시적으로 설정해주어야 하며, 객체지향적인 특성을 나타내기 어려울 수 있습니다.

 

이미지 출처 - [우아한 기술블로그]

 

728x90

'JAVA' 카테고리의 다른 글

Call By Value와 Call By Reference  (0) 2024.03.03
SOLID  (0) 2023.11.11
Pubilc과 Private  (1) 2023.11.01