[JPA] 상속관계 매핑

19·2022년 10월 13일
0

JPA

목록 보기
9/18
post-custom-banner

상속관계 매핑

관계형 데이터베이스는 상속관계가 없다.
'슈퍼타입', '서브타입' 관계라는 모델링 기법이 객체 상속과 유사하다
-> 상속관계 매핑은 객체의 상속구조와 DB의 슈퍼타입 서브타입 관계를 매핑한 것이다.

주요 어노테이션

@Inheritance(strategy=InheritanceType.XXX)

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

@DiscriminatorColumn

  • DTYPE을 생성하는 어노테이션
    • 부모 클래스에 붙인다.
  • 자식 테이블 명이 컬럼으로 삽입된다.
    • 구분하기 위해 사용

@DiscriminatorValue

  • DTYPE 이름을 바꾸기 위해 사용한다. (EX. Movie -> M)

    • 자식 클래스에 붙인다.

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

// 부모
@Entity
public class Item {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}


// 자식
@Entity
public class Album extends Item{

    private String artist;
}

@Entity
public class Book extends Item {

    private String author;
    private String isbn;
}

@Entity
public class Movie extends Item {

    private String director;
    private String actor;
}
  • 부모 클래스 : Item
  • 자식 클래스 : Album, Book, Movie


각각 테이블로 변환 -> 조인 전략

  • 객체 상속과 가장 유사한 구조
  • 정규화가 잘 되어 있다.
  • 조회 시, 조인을 통해 데이터를 가져온다.
    • 조회 시, 조인을 많이 사용하기 때문에 성능이 저하되는 문제
  • 단일 테이블전략과 비교해서 성능이 떨어진다.

부모 클래스에서 @Inheritance 추가

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}
  • 전략을 JOINED로 설정
  • @DiscriminatorColumn으로 자식 테이블 이름이 컬럼으로 들어간다

  • DTYPE은 @DiscriminatorColumn으로 인해 생긴 컬럼

통합 테이블로 변환 -> 단일 테이블 전략

  • 한 테이블에 다 때려넣는 형식
    • DTYPE으로 구분 (Album인지 Book인지..)
  • JPA 기본 전략
  • 조회 시, 조인이 필요없다.
  • 자식 엔티티가 매핑한 컬럼은 모두 NULL을 허용해야 한다.

부모 클래스에서 @Inheritance 전략 변경

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {
	...
}
  • @DiscriminatorColumn없어도 DTYPE 생성
    • 한 테이블에 때려넣기 때문에 구분하기 위해 DTYPE이 자동으로 생성된다.

  • 하나의 테이블에 전부 넣어진 것을 확인할 수 있다.

서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략

  • 조인 전략과 유사
    • 부모 테이블을 없애고 컬럼들을 자식 테이블에게 넣는 것
  • 쓰면 안되는 전략
    • 데이터베이스 설계자와 ORM 전문가 둘 다 추천X
  • 여러 테이블을 조회할 때 성능이 느리다 (UNION을 사용)

위 3가지 중 어떤 방식으로 구현해도 JPA 매핑이 가능하다



참고

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 김영한

profile
하나씩 차근차근
post-custom-banner

0개의 댓글