🌱 SPRING/JPA

[JPA] 상속관계 매핑

1HOON 2020. 7. 19. 17:50

상속관계 매핑


RDBMS에는 상속관계가 없지만, 객체에서는 상속관계가 존재합니다. 그리고 RDBMS에서는 슈퍼타입-서브타입 관계 모델링이 객체의 상속관계와 유사합니다. 이번 포스팅에서는 이 슈퍼타입-서브타입 관계를 JPA로 모델링하는 방법을 알아봅니다.

이 슈퍼타입-서브타입 논리 모델을 실제 물리 모델로 구현하려면 아래와 같은 방법이 있습니다.

 

  • 조인 전략 : 각각 테이블로 변환
  • 단일 테이블 전략 : 통합 테이블로 변환
  • 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환

그리고 이 상속관계 매핑시에는 Entity를 대상으로 어노테이션을 입력해주는데, 슈퍼 타입(슈퍼 클래스)에는 @Inhritance와 @DiscriminatorColumn을, 서브 타입(서브 클래스)에는 @DiscriminatorValue를 붙여줍니다.

 

  • @Inheritance
    상속관계 매핑 시 사용할 전략을 의미합니다. 단일 테이블 전략(SINGLE_TABLE)이 기본값입니다.
  • @DiscriminatorColumn
    상속관계 매핑 시 부모 클래스에서 자식 클래스를 구분할 컬럼명을 의미합니다. 기본값은 DTYPE 입니다.
  • @DiscriminatorValue
    부모 클래스에서 지정한 @DiscriminatorColumn 컬럼의 값에 입력할 값을 의미합니다.

 

아래는 조인 전략을 이용해, Item 클래스에서 DTYPE 컬럼이 A일 때 Album, M일 때 Movie, B일 때 Book으로 자식 클래스가 구분되는 예제입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item
{
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private int price;
    ...
}
 
@Entity
@DiscriminatorValue("A")
public class Album extends Item
{
    private String artist;
    ...
}
 
@Entity
@DiscriminatorValue("M")
public class Movie extends Item
{
    private String director;
    private String actor;
    ...
}
 
@Entity
@DiscriminatorValue("B")
public class Book extends Item
{
    private String author;
    private String isbn;
    ...
}
cs

 

 

조인 전략


조인 전략은 슈퍼 타입, 서브 타입별로 테이블을 모두 분리하고, 서브 타입에서 슈퍼 타입의 ID를 참조하는 방식입니다.

 

장점

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

단점

  • 조회 시 조인을 많이 사용하므로 성능 저하
  • 조회 쿼리가 복잡함
  • 데이터 저장 시 INSERT SQL이 2번 호출된다.(슈퍼 타입, 서브 타입 각각 한 번씩)

 

 

단일 테이블 전략


단일 테이블 전략은 하나의 테이블에 슈퍼 타입, 서브 타입 전체의 컬럼을 구성하고 모든 데이터를 통합 관리하는 전략입니다.

 

장점

  • 조인이 필요 없으므로 조회 성능이 빠름
  • 조회 쿼리가 단순하다

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 NULL 허용이어야한다.
    → 특정 서브 타입에서는 다른 서브 타입에 존재하는 컬럼이 없기 때문에
  • 단일 테이블에 모든 데이터를 저장하므로, 테이블이 커질 수 있기 때문에 조회 성능이 오히려 느려질 수 있다.

 

 

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


이 전략은 슈퍼 타입에 정의한 컬럼을 모두 서브 타입의 컬럼에 추가해주고 각각 테이블로 분리하는 전략이면서 가장 추천하지 않는 전략입니다. 슈퍼 타입에 정의된 컬럼이 변경사항이 생길 때, 정확하게 반영하기가 어렵습니다.

 

장점

  • 서브 타입을 명확하게 구분해서 처리할 때
  • NOT NULL 제약조건을 사용할 수 있다.

단점

  • 여러 자식 테이블을 함께 조회할 때(UNION) 성능이 느리다.
  • 자식 테이블을 통합해서 쿼리하기 어려움

 


출처 :: 인프런 강의(자바 ORM 표준 JPA 프로그래밍 - 기본편)

반응형