상속관계 매핑
- 관계형 데이터베이스는 상속관계 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 테이블에 종속된것이 아닌 각각의 테이블을 생성한다.
하지만 해당 전략은 데이터를 찾아올때 모든 테이블을 다 뒤져봐야 함으로 엄청나게 복잡한 쿼리를 실행한다.
'코딩딩 > Spring' 카테고리의 다른 글
JPA의 값 타입 (0) | 2023.11.09 |
---|---|
프록시 (0) | 2023.11.08 |
다양한 연관관계 매핑 (0) | 2023.11.05 |
연관관계 매핑 기초 (1) | 2023.11.03 |
객체와 테이블 매핑 (1) | 2023.10.31 |