본문 바로가기
JPA

[JPA] 상속 관계 매핑(고급매핑)

by byeongoo 2020. 4. 19.

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

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 서버 데이터베이스 프레임워크 및 라이브러리 프로그래밍 언어 서비스 개발 Java JPA Spring Data JPA 온라인 강의 ORM, JPA, 자바, java, 우아한형제들

www.inflearn.com

 

'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