관계형 데이터 베이스에서는 상속 관계라는 것은 없다.
다만 슈퍼타입, 서브타입 관계라는 모델링 기법이 있으며 상속관계와 비슷하다.
아래와 같은 관계를 상속관계 매핑으로 나타내는 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 테이블은 생성되지 않는다.
댓글