@IdClass @EmbeddedId 의 활용 차이
@IdClass @EmbeddedId 모두 JPA에서 복합 기본 키 (Composite Primary Key) 를 다루는 방법입니다.
하나의 Entity에 @Id 를 하나 이상 쓰게되면 매핑 오류가 발생하게 됩니다. 그래서 복합 기본키를 사용할 때는 별도의 키 클래스를 생성해야 합니다.
이 때 생성하는 키 클래스는 다음과 같은 특징이 있습니다.
키 클래스 특징
1. 복합 키는 별도의 키 클래스로 만들어야 한다.
2. Serializable을 implements 받아야한다.
3. equals와 hashCode를 Override 해야 한다. (lombok 에서 @EqualsAndHashCode 사용)
4. 기본 생성자가 있어야 한다. (lombok 에서 @NoArgsConstructor 사용)
5. 키 클래스는 public으로 생성해야 한다.
@IdClass
@IdClass는 보다 관계형 데이터베이스에 가까운 방법입니다.
복합 기본 키 필드를 별도의 클래스로 분리하여 매핑하게 됩니다.
@Entity
@IdClass(BookId.class)
public class Book {
@Id
private String author;
@Id
private String title;
}
@NoArgsConstructor
@EqualsAndHashCode
public class BookId implements Serializable {
private String author;
private String title;
}
위의 예시를 보시면 Book Entity Class 와 BookId Class를 정의하고 두 클래스간 필드명을 같게 하여 @Id를 사용해 매핑합니다.
@EmbeddedId
@EmbeddedId는 객체지향에 가까운 방법입니다.
복합 기본키를 엔티티 내부에 추가하여 정의합니다.
@Entity
public class Book {
@EmbeddedId
private BookId id;
}
@Embeddable
@NoArgsConstructor
@EqualsAndHashCode
public class BookId implements Serializable {
private String author;
private String title;
}
키 클래스의 특징을 그대로 가져가지만 @EmbeddedId를 사용하여 키 클래스를 기본키로 사용하겠다 선언하고, 키 클래스에는 @Embeddable을 추가하여 사용합니다.
@EmbeddedId가 @IdClass 는 취향에 따라 사용하면 됩니다. 앞에서 말씀드린데로 @IdClass 가 RDBMS(관계형 데이터베이스, relational database management system), @EmbeddedId가 OOP(객체지향 프로그래밍, Object-Oriented Programming) 에 가까운 방법입니다.
Entity의 구조가 단순하고 기본 키 클래스가 Entity 내부에서만 사용되는 경우 @EmbeddedId를, 구조가 복잡하거나 복합 키의 재사용성이 높은 경우 @IdClass를 사용합니다.