Programing/JPA

@IdClass @EmbeddedId 의 활용 차이

리커니 2023. 8. 18. 13:18
반응형

@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를 사용합니다. 

반응형