@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를 사용할 때는 복합 키를 별도의 클래스로 분리하여 엔티티와 복합 키 클래스를 연결합니다. 이 방법은 중복된 필드를 가지고 있지 않으므로 구조적으로 보다 깔끔하게 보일 수 있지만 이 방식은 복합 키 클래스와 엔티티 간의 관계를 명시적으로 설정해주어야 하며, 객체지향적인 특성을 나타내기 어려울 수 있습니다.
'JAVA' 카테고리의 다른 글
Call By Value와 Call By Reference (0) | 2024.03.03 |
---|---|
SOLID (0) | 2023.11.11 |
Pubilc과 Private (1) | 2023.11.01 |