코딩딩/Spring

고오급 매핑

전낙타 2023. 11. 7. 18:16

상속관계 매핑

  • 관계형 데이터베이스는 상속관계 X
  • 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
  • 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
  • 슈퍼타입 서브타입 논리모델을 실제 물리 모델로 구현하는 방법
    • 각각 테이블로 변환 → 조인 전략 (DTYPE)
    • 통합 테이블로 변환 → 단일 테이블 전략 (한 테이블에 컬럼으로 다 때려박고 DTYPE으로 테이블 종류 구분)
    • 서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략 (전부 다른 테이블로 나눠버리기)

조인 전략

이런 식으로 어노테이션을 달아주면 테이블이 분리되고 해당 타입이 DTYPE으로 설정된다

해당 어노테이션을 붙히지 않으면 단일 테이블로 무식하게 생성된다.

package hellojpa.section7;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
// 요놈이 Join전략으로 설정해준다
@Inheritance(strategy = InheritanceType.JOINED)
// DTYPE으로 테이블 생성
@DiscriminatorColumn
public class Item {

    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}
package hellojpa.section7;

import jakarta.persistence.Entity;

@Entity
// 해당 테이블의 이름을 해당 어노테이션으로 변경해줄 수 있다.
@DiscriminatorValue("M")
public class Book extends Item{
    private String auther;
    private String isbn;
}

  • 장점
    • 다른 엔티티의 참조값을 받아올때 ITEM 하나만 조회하면 되서 설계가 편하다
    • 외래 키 참조 무결성 제약조건 활용 가능
    • 데이터 정규화
    • 저장공간 효율화
  • 단점
    • 조회지 조인을 많이 사용, 성능 저하
    • 조회 쿼리가 복잡함
    • 데이터 저장시 insert sql 2번 호출

통합 테이블 전략

package hellojpa.section7;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
// 여기만 수정하면 통합 테이블 전략으로 설정해준다
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
// DTYPE으로 테이블 생성
@DiscriminatorColumn
public class Item {

    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

통합 테이블 전략은 테이블 내부에 DTYPE을 선언하고 해당 DTYPE을 기준으로 객체를 판별함

테이블이 하나다 보니 성능이 가장 좋다( 테이블이 하나라 select 문을 하나만 날리기 때문 )

어노테이션 하나만 바꿔주면 전략을 바꿀수 있다 (JPA의 엄청난 장점)

서브타입 테이블 전략

package hellojpa.section7;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
// 이번에도 요 어노테이션만 변경해주면 된다
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
// 해당 전략을 DTYPE을 설정하지 않아도 될뿐더러 해당 어노테이션을 붙혀놓아도 실행되지 않는다
@DiscriminatorColumn
public abstract class Item {

    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

item 테이블에 종속된것이 아닌 각각의 테이블을 생성한다.

하지만 해당 전략은 데이터를 찾아올때 모든 테이블을 다 뒤져봐야 함으로 엄청나게 복잡한 쿼리를 실행한다.