[JPA] 상속 관계 매핑 전략

옹심이·2024년 12월 30일
0
post-thumbnail

관계형 데이터베이스에는 상속 관계가 없다. 하지만 슈퍼 타입 서브 타입 관계로 이를 어느정도 지원한다.

조인 전략

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item{
    private Long id;
    private String name;
    private int price;
}
@Entity
public class Movie extends Item{
    private String author;
    private String isbn;
}

가장 정석적인 전략이다. InheritanceType 속성 값이 JOINED로 설정되어 있다.

각 테이블을 만들고 외래 키를 통해 조인으로 관계를 구성한다. ALBUM 테이블에 데이터를 삽입하면 ITEM과 ALBUM 테이블 모두에 값이 저장된다.

장점

  • 테이블이 정규화되어 있어 저장 공간이 효율적이다.
  • 외래 키 참조와 무결성 제약 조건을 활용할 수 있다.

단점

  • 조회 시 조인을 많이 사용하여 성능이 저하될 수 있다.
  • 조회 쿼리가 복잡하다.
  • 데이터 저장 시 쿼리가 두 번 실행된다.

단일 테이블 전략

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item{
    private Long id;
    private String name;
    private int price;
}
@Entity
@DiscriminateValue("M")
public class Movie extends Item{
    private String author;
    private String isbn;
}

단일 테이블 전략에서는 @DiscriminatorColumn을 필수적으로 사용해야 한다. 이를 통해 하나의 테이블에 필요한 모든 컬럼을 포함하고, DTYPE 컬럼이 자동으로 생성되어 ITEM의 종류를 구분하는 방식으로 매핑된다.

@DiscriminatorValue 어노테이션으로 테이블의 이름을 지정할 수 있다.

이 전략에서는 INSERT 쿼리가 한 번만 실행되고 조인이 발생하지 않아 성능이 더 효율적이다.

장점

  • 조인이 필요 없어서 조회 성능이 빠르다
  • 조회 쿼리가 단순하다

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 NULL을 허용해야 한다
  • 단일 테이블에 모든 데이터를 저장하므로 테이블이 커질 수 있으며, 특정 크기를 넘어서면 조회 성능이 저하될 수 있다

구현 클래스마다 테이블 전략

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

사용이 권장되지 않는 전략이다.

이 전략은 각 아이템 타입마다 별도의 테이블을 생성한다. ITEM 테이블은 생성하지 않으며, 대신 각 하위 테이블에 ITEM의 모든 속성이 중복되어 포함된다.

장점

  • 서브 타입을 명확하게 구분하여 처리할 수 있다.
  • Not Null 제약조건을 활용할 수 있다.

단점

  • 여러 테이블을 함께 조회할 때 UNION 쿼리가 필요해 성능이 저하된다.

0개의 댓글