본문 바로가기
JPA

상속 관계 매핑

by Heesu.lee 2021. 1. 14.

객체엔 상속 관계가 있지만 관계형 데이터베이스는 상속 관계는 따로 없다.

다만, 슈터타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.

여기서 상속관계 매핑이란, 객체의 상속의 구조와 DB 의 슈퍼타입 서브타입 관계를 매핑

주요 전략 - 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법

  • 조인 전략
  • 단일 테이블 전략
  • 구현 클래스마다 테이블 전략

위와 같은 3가지 전략 모두 JPA 와 매핑 가능하다.

 

조인 전략

가장 정규화된 방식

운영 시 어떤 데이터인지 확인하기 위하여 DTYPE 을 넣어주는게 좋다. - @DiscriminatorColumn(부모), @DiscriminatorValue(자식)

단일 테이블 전략에선 DTYPE 반드시 넣어줘야 한다.

 

장점

  • 테이블 정규화
  • 외래키 참조 무결성 제약조건 활용가능
  • 저장공간 효율화

단점

  • 조회 시 조인을 많이 사용 - 성능 저하
  • 조회 쿼리가 복잡함
  • 데이터 저장 시 INSERT 2번 호출
사실 큰 단점은 아니다. - 쿼리 튜닝을 통해 충분히 어느정도 해결 가능
그리고, 기본적으로 조인 전략을 취하는게 좋다. 객체 지향과도 잘 맞음

싱글 테이블 - 단일 테이블 전략

하나에 모든 데이터를 다 때려박고, DTYPE 으로 구분!

성능은 가장 좋다. (조인 없고, INSERT 시 한번만)

한테이블에 있기 때문에 DTYPE 이 없다면 구분하기 어렵다.

 

장점

  • 조인 필요 없으므로 조회 시 성능 빠름
  • 조회 쿼리 단순

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 - 데이터 무결성 문제
  • 모든 것을 저장하므로 테이블이 커질 수 있고 이로인해 조회 성능이 나쁠 수 있다.
JPA 사용한다면 전략만 바꾸면 된다.

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

조인과 비슷하겠지만, 상속 관계의 공통 데이터를 각 테이블이 중복되더라도 가지는 방식

해당 전략에선 구분할 일이 없기 때문에 DTYPE 이 필요 없다.

좋아보이더라도, 부모 클래스 타입으로 조회 시 union 으로 모든 테이블(자식)을 조회하게 된다.

결코 사용해선 안되는 전략
DB, ORM 둘 다 원하지 않는 전략

 

JPA 는 각 전략을 어노테이션을 통해 매핑 시킬 수 있다.

 

@MappedSuperClass

공통 매핑 정보가 필요할 때 사용

DB 는 완전 다른데 공통 필드만 같이 쓰고자 할 때 사용한다.

  • 상속관계 매핑
  • 엔티티 X, 테이블과 매핑 X
  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
  • MappedSuperClass 로 지정된 엔티티 조회, 검색 불가 - em.find(XXX.class)
  • 직접 생성해서 사용할 일이 없기 때문에 추상 클래스 권장

정리

  • 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
  • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 정보를 모을 때 사용
참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지 정한 클래스만 상속 가능

공통의 속성 (매핑 정보)을 사용하고자 할 때 사용한다.

 

참조

  • 헤당 게시글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 바탕으로 작성되었습니다.

'JPA' 카테고리의 다른 글

프록시와 연관관계 관리  (0) 2021.01.20
값 타입  (0) 2021.01.19
다양한 연관관계 매핑  (0) 2021.01.12
연관관계 매핑 기초  (0) 2021.01.12
엔티티 매핑  (0) 2021.01.10

댓글