JPA 상속관계 매핑

김두현·2023년 4월 28일
1

JPA

목록 보기
9/14
post-thumbnail

Goal

  • 상속관계 매핑에 필요한 주요 어노테이션을 파악한다.
    • @Inheritance
    • @DiscriminatorColumn
    • @DiscriminatorValue
  • @Inheritance 의 세 가지 전략을 파악한다.
    • InheritanceType.JOINED
    • InheritanceType.SINGLE_TABLE
    • InheritanceType.TABLE_PER_CLASS
  • @MappedSuperClass 의 기능을 파악한다.

주요 어노테이션

  • @Inheritance : 상속관계를 매핑할 때 strategy 속성과 함께 사용된다. 부모 클래스에 명시한다.
  • @DiscriminatorColumn : 부모 클래스에서 자식 클래스를 구분하기 위한 컬럼을 지정한다.
    • default : DTYPE
  • @DiscriminatorValue : 자식 클래스에서 자신임을 구별할 컬럼의 이름을 지정한다.
    • default : 엔티티명

@Inheritance 전략

RDB는 기본적으로 상속 관계가 존재하지 않는다.
따라서 Super Type과 Sub Type 관계를 이용해 상속관계를 매핑한다.
일반적으로 부모 클래스는 abstract 클래스로 만들며, 부모 클래스에 @Inheritance 어노테이션을 사용해 상속관계를 매핑한다.

  • 상속관계 매핑의 세 가지 전략에 대해 알아보자.

JOINED

  • 정석적인 전략으로, 각각의 테이블로 변환하여 나타내는 방식이다.
  • 장점
    • 테이블 정규화
    • 저장공간 효율화
    • 하위 클래스의 외래 키가 상위 클래스에 존재하지 않으면 에러를 발생시키므로, 데이터 무결성이 보장된다.
  • 단점
    • 조회 시 JOIN query가 사용되어 성능이 저하된다.
    • 조회 query가 복잡하다.
    • 데이터 저장 시 INSERT query를 두 번 실행된다.

SINGLE_TABLE

  • 부모와 자식의 모든 필드를 하나의 통합 테이블로 나타내는 방식이다.
  • 장점 : 조회 query가 단순하며 빠르다.
  • 단점
    • 자식 엔티티가 매핑한 컬럼은 null을 허용한다.
    • 필드가 매우 많을 경우 테이블이 커져 더 느려질 수 있다.

TABLE_PER_CLASS

  • 모든 컬럼을 Sub Type에 나타내는 방식으로, 이 전략은 사용하지 말자.
  • 단점
    • 조회 query에서 UNION sql을 사용해 느리다.
    • 자식 테이블을 통합해서 query하기 어렵다.

@MappedSuperClass

  • 공통 매핑 정보가 필요할 때 사용하며, 아래와같은 특징을 가진다.
    • 엔티티가 아니며, 따라서 테이블과 매핑되지 않는다.
      즉, 테이블 구조와 아무런 관련이 없다.
    • 조회, 검색이 불가하다.
    • 자식 클래스에 매핑 정보만을 제공한다.
      직접 생성할 일이 없으므로, 추상 클래스로 설계하도록 하자.

참고 자료

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


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

0개의 댓글