본문 바로가기
JPA

[JPA] 상속관계 매핑

by 당코 2023. 3. 3.

상속관계 매핑

관계형 데이터베이스는 상속관계라는 것이 존재하지 않는다.

그래서 객체 상속과 유사한 슈퍼타입, 서브타입 관계라는 모델링 기법을 이용한다.

객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하여 상속관계 매핑을 한다.

 

슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 크게 3가지가 있다.

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

 

어노테이션

3가지 전략을 사용하기 위해서는 @Inheritance(strategy=InheritanceType.XXX)를 적용시켜 주면 된다

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

@DiscriminatorColumn(name=“DTYPE”)

- 어떤 자식 클래스와 매핑되었는지 구분하기 위해 부모클래스에 DTYPE이라는 컬럼을 추가해 준다.

@DiscriminatorValue(“XXX”)

- 자식 클래스에 사용하여 어떤 이름으로 DTYPE에 저장될지 정해준다.

 

조인 전략

가장 정규화된 방식으로 구현한 전략이다.

엔티티 각각을 테이블로 만들고 자식 테이블이 부모테이블의 기본 키를 받아서 사용한다.

어떤 자식을 조회해야 하는지 알기 위해서 DTYPE이라는 컬럼을 가진다.

장점

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

단점

  • 조회 시 조인을 많이 사용, 성능 저하
  • 조회 쿼리가 복잡함
  • 데이터 저장 시 INSERT SQL 2번 호출

 

단일 테이블 전략

자식 클래스의 엔티티를 생성하지 않고 하나의 부모 클래스에 모든 정보를 저장한다.

DTYPE을 사용하여 자식 클래스의 종류를 구분할 수 있다.

장점

  • 조인이 필요 없으므로 일반적으로 조회 성능이 빠름 
  • 조회 쿼리가 단순함

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null 허용
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있음.
  • 상황에 따라서 조회 성능이 오히려 느려질 수 있음.

 

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

자식 엔티티마다 테이블을 생성하고 부모 테이블은 추상클래스로 실제 생성하지 않는다.

장점

  • 서브 타입을 명확하게 구분해서 처리할 때 효과적
  • not null 제약조건 사용 가능

단점

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

 

 

결론

기본적으로 조인 전략을 사용하되 간단하고 확장가능성이 적은 경우 단일 테이블 전략을 도입하자.

구현 클래스마다 테이블 전략은 추천하지 않는다.

 

 

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

'JPA' 카테고리의 다른 글

[JPA] 프록시와 지연로딩  (2) 2023.03.05
[JPA] @MappedSuperclass 사용법  (0) 2023.03.03
[JPA] 연관관계 매핑  (0) 2023.02.28
[JPA] 기본 키 매핑 방법  (0) 2023.02.27
[JPA] 영속성 컨텍스트  (0) 2023.02.26