1. 상속 관계 매핑
객체는 상속관계가 있는데 관계형 데이터베이스에는 상속관계가 없습니다. 관계형 데이터베이스에는 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사합니다. 객체는 item이라는 추상타입을 만들고 저렇게 구체적으로 갈 수 있습니다. DB의 슈퍼타입 서브타입이라는 논리 모델링 기법을 어떤 3가지 방법으로 구현을 하든 다 매핑하도록 지원하는 것 입니다.
다음은 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 3가지 방법입니다.
- 각각 테이블로 변환 -> 조인 전략
- 통합 테이블로 변환 -> 단일 테이블 전략
- 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
3가지 전략에 맞는 어노테이션과 다른 부가기능을 사용하기 위한 주요 어노테이션입니다.
부모 Entity의 @Inheritance 애노테이션을 통해 조인 전략을 생성할 수 있습니다. 기본 전략 자체는 단일 테이블 전략을 사용합니다.
- @Inheritance(strategy=InheritanceType.XXX)
- JOINED : 조인전략
- SINGLE_TABLE : 단일 테이블 전략
- TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name=“DTYPE”)
- @DiscriminatorColumn 애노테이션을 통해 DTYPE을 줄 수 있습니다. ENTITY 명이 데이터로 들어갑니다. name을 다른이름으로 주면 ITEM에 DTYPE 컬럼대신 다른 컬럼명이 생성됩니다.
- @DiscriminatorValue(“XXX”)
- @DiscriminatorValue를 통해 Entity명 대신에 회사규칙을 넣어줄 수 있습니다.
@DiscriminatorColumn 애노테이션을 통해 DTYPE을 줄 수 잇습니다. ENTITY 명이 들어갑니다.
name은 다른걸 주면 ITEM에 DTYPE 컬럼대신 다른 컬럼명이 생성됩니다.
@Entity
@DiscriminatorValue("A")
public class Book extends Item{
private String author;
private String isbn;
}
이제 3가지 전략에 대해서 자세히 알아보겠습니다.
2. 조인 전략
오른쪽 테이블 봤을때, ITEM을 정의하고 필요하면 JOIN으로 가지고 오는 것 입니다. 그리고 DTYPE이라는 컬럼을 통해 앨범인지, 영화인지, 책인지 알 수 있습니다. 데이터가 굉장히 정규화되서 들어갑니다. 단점으로 단일 테이블보다 복잡함. insert 2번, 조회 성능 저하는 사실 단점이 아님. 잘 맞추면 되니까. 조인 전략이 객체랑도 잘 맞고, 정규화도되고, 설계입장에서 깔끔하게 설계가 나옵니다. 단일 테이블보다 복잡하고 성능이 안좋게 나올 수 있습니다.
[조인 전략 장점]
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
[조인 전략 단점]
- 조회시 조인을 많이 사용, 성능 저하
- 조회 쿼리가 복잡함
- 데이터 저장시 INSERT SQL 2번 호출
3. 단일 테이블 전략
하나의 테이블에 모두다 넣는 방법입니다. 그리고DTYPE으로 구분합니다. 단일 테이블 전략에서는 DTYPE이 무엇인지 알 수없습니다. 직접 넣어줘야합니다. 아래의 단점처럼 되려면 임계점을 넘어야하는데 보통은 그렇진 않습니다.
[단일 테이블 전략 장점]
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
- 조회 쿼리가 단순
[단일 테이블 전략 단점]
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있음. 상황에 따라서 조회 성능이 오히려 느려질 수 있음
4, 구현 클래스마다 테이블 전략
이 전략을 사용하지 않습니다. Item 테이블을 없애고 3개의 테이블을 각각 만드는 방식 입니다. Item Entity는 abstract class로 만들어줍니다. 이 방식은 조회할때 Item 타입으로 조회할 수 있습니다. 이 전략은 넣을때는 괜찮은데 조회할 때 union all로 다 조회합니다. 굉장히 비효율적으로 동작합니다.
[구현 클래스마다 테이블 전략 장점]
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
[구현 클래스마다 테이블 전략 단점]
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리하기 어려움
5. 어떤 전략을 선택?
기본적으로는 조인 전략을 깔고 가도록하고, 이 녀석이 진짜 단순하다면 데이터도 얼마안되고 하면 단일테이블로 많이 갑니다. 비즈니스적으로 중요하고 복잡하면 조인전략을 택하면 됩니다. 트레이드오프가 있기 때문에 2개중에 고민을 해야합니다.
REFERENCE
https://www.inflearn.com/course/ORM-JPA-Basic
'JPA' 카테고리의 다른 글
[JPA] 프록시 (0) | 2020.04.22 |
---|---|
[JPA] @MappedSuperclass 애노테이션 (0) | 2020.04.19 |
[JPA] 연관 관계 매핑의 종류 (0) | 2020.04.19 |
[JPA] 연관관계 매핑 기초 (0) | 2020.04.14 |
[JPA] 기본 키 매핑 (0) | 2020.04.10 |