🌱 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 프로그래밍 - 기본편)
반응형