관계형 데이터 베이스에서는 상속 관계라는 것은 없다.
다만 슈퍼타입, 서브타입 관계라는 모델링 기법이 있으며 상속관계와 비슷하다.
아래와 같은 관계를 상속관계 매핑으로 나타내는 3가지 방법에 대해 알아보자.

상속관계 매핑의 방법 3가지
| 매핑방법 | 어노테이션 | 설명 |
| 조인전략 | @Inheritance(strategey = InheritanceType.JOINED) | 각각 테이블 |
| 단일 테이블 전략 | @Inheritance(strategey = InheritanceType.SINGLE_TABLE) | 통합 테이블 |
| 구현 클래스마다 테이블 전략 | @Inheritance(strategey = InheritanceType.TABLE_PER_CLASS) | 서브 타입 테이블 |
1. 조인 전략
- 공통된 부분을 부모처럼 사용하며 extends 를 통해 테이블을 만들 수 있다.
장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
단점
- 조회시 조인을 많이 사용해서 성능 저하
- 조회 쿼리가 복잡
- 데이터 저장시 Item 과 Album 등 SQL 2번 호출

Item.class
- 공통 부분인 name, price 가 있으며, @DiscriminatorColumn 를 추가해주어야한다.
DTYPE 으로 어떤 엔티티인지 구분할 수 있다.
디폴트값으로 DTPYE 이 들어가며, @DiscriminatorValue("구분이름") 을 통해 따로 정해줄 수도 있다.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
Album.class
- Item을 상속받는다.
@Entity
//@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
Movie.class
- Item을 상속받는다
@Entity
//@DiscriminatorValue("M")
public class Movie extends Item{
private String director;
private String actor;
Book.class
- Item을 상속받는다
@Entity
//@DiscriminatorValue("B")
public class Book extends Item{
private String author;
private String isbn;
}

2. 단일 테이블 전략
장점
- 조인이 필요 없으므로 조회 성능이 빠르다
- 조회 쿼리가 단순하다
단점
- 자식 엔티티가 매핑한 상관없는 컬럼은 모두 null 처리
- 테이블이 커질 수 있다. 상황에 따라 조회 성능이 느려질 수 있다.

사용방법은 조인테이블과 같으며, strategy 전략만 SINGLE_TABLE 로 변경해준다.
추가적으로 @DiscriminatorColumn 은 생략이 가능하다. ( 자동 DTYPE 추가 )
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;

3. 구현 클래스마다 테이블 전략
-> 잘 사용하지 않는다.
장점
- 서브 타입을 명확하게 구분
단점
- UNION SQL 을 사용해서 여러 자식 테이블을 함께 조회할때 성능이 느리다.
- 자식테이블을 통합해서 쿼리하기 어렵다

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
Item 테이블은 생성되지 않는다.

댓글