[JPA 기본] 06- 상속관계 매핑

heyhey·2023년 3월 2일
0

JPA

목록 보기
5/7

상속관계 매핑이란 ?
객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것

물리 모델


슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현

각각 테이블로 변환
@Inheritance(strategy = InheritanceType.XXX)

조인 전략 [JOINED]

장점

  • 테이블 정규화
  • 깔끔한 설계로 사실 정석이라고 보면 된다 (객체 입장에서도)
  • 외래 키 참조 무결성 제약조건 활용가능
  • 저장공간 효율화
    단점
  • 조회시 조인을 많이 사용해서 성능이 떨어진다.
    • 크게 떨어지진 않는다
  • 조회 쿼리가 복잡하다.
  • 데이터 저장시 INSERT SQL을 2번 호출한다.

단일 테이블 전략 [SINGLE_TABLE]

통합 테이블로 변환

장점

  • 조인이 필요 없어서 조회 성능이 빠르다
  • 조회 쿼리가 단순하다.
  • 데이터가 단순하고 확장이 없을것 같으면 선택하면 좋다.

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null 허용한다.
  • 단일 테이블에 모든 것을 저장하기 때문에 테이블이 커지면 느려질 수 있다.

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

서브타입 테이블로 변환

이건 쓰면 안된다..
장점

  • 서버 타입을 명확하게 구분 가능

단점

  • 여러 자식 테이블을 함께 조회할 때 선응이 느림
  • 자식 테이블을 통합하기 어렵다

@MappedSuperclass

공통 매핑 정보가 필요할 때 사용
테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할

@Entity 클래스가 상속 가능한 것은 엔티티거나 @MSC 를 사용해야 한다.

createDate, updateDate 등이 사용되면 유용하다.

BaseEntity 를 만들고
extends BaseEntity 로 상속받아 사용하면 된다.

@MappedSuperclass
pubic class BaseEntity{
}
  • 상속관계 매핑이 되지 않는다.
  • 엔티티가 되지 않는다. 테이블과 매핑이 되지 않는다.
  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.
  • 조회 검색이 불가하다 em.find(BaseEntity) 불가
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스(abstract) 권장

예시

Item

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item {
}

Book

@Entity
public class Book extends Item{
    private String author;
    private String isbn;
}

이런식으로 사용하면 단일 테이블 생성이 가능하다.

profile
주경야독

0개의 댓글