티스토리 뷰
상속관계 매핑
- 관계형 데이터베이스는 상속 관계x
- 슈퍼타입 서브타입 관계라는 모델링 기법이 상속과 유사
- 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
- 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법이 있다.
ㄴ 각각 테이블로 변환 -> 조인 전략
ㄴ 통합 테이블로 변환 -> 단일 테이블 전략
ㄴ 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
1. Item class
package jpabook.jpashop.domain;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
}
package jpabook.jpashop.domain;
import javax.persistence.Entity;
@Entity
public class Album extends Item{
private String artist;
}
package jpabook.jpashop.domain;
import javax.persistence.Entity;
@Entity
public class Movie extends Item{
private String director;
private String actor;
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
package jpabook.jpashop.domain;
import javax.persistence.Entity;
@Entity
public class Book extends Item{
private String author;
private String isbn;
}
이렇게 상속으로 만들게 될 경우의 쿼리
create table Item (
DTYPE varchar(31) not null,
ITEM_ID bigint not null,
name varchar(255),
author varchar(255),
isbn varchar(255),
actor varchar(255),
director varchar(255),
artist varchar(255),
primary key (ITEM_ID)
)
Item 테이블 안에 다 넣게 된다.
어노테이션을 이용해서 전략을 변경할 수 있다.
조인전략
package jpabook.jpashop.domain;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
}
Movie movie = new Movie();
movie.setActor("actor");
movie.setName("영화이름");
movie.setDirector("디렉터");
em.persist(movie);
em.flush();
em.clear();
Movie movie1 = em.find(Movie.class, movie.getId());
System.out.println("movie = " + movie1);
코드 처럼 insert시에 movie를 세이브 시키더라도 Item이 함께 세이브 된다. 조회 시에는 Item까지 함께 조인하여 조회한다.
이 상태에서
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {
@DiscriminatroColumn 이라는 어노테이션을 추가 시키면 필드에 DType이라는걸 추가 시키지 않아도
이렇게 DTYPE이라는 컬럼이 추가 된다. name 속성으로 컬럼명을 바꿀 수도 있다.
@Entity
@DiscriminatorValue("M")
public class Movie extends Item{
@DiscriminatorValue를 통해 원하는 값으로 조정도 가능하다.
이 상황에서 만약 단일 테이블 전략을 사용한다면
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public class Item {
InheritanceType.SINGLE_TABLE로만 변경해주면 된다.
단일 테이블 전략에서는 Item 테이블에 DiscriminatorTable이 없어도 DTYPE컬럼이 만들어진다. 테이블이 하나일때는 구분자가 꼭 필요하기에 자동으로 된다.
끝으로
해당 전략은 코드를 약간만 수정해주면 된다. Item의 필드내용이 각각 상속받은 테이블로 들어가게 된다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item {
abstract 추상 클래스로 만들면 된다.
조인전략 장점
- 정규화가 되어있다. 제약조건을 Item에 걸어서 쓸 수 있다.
- 외래 키 참조 무결성 제약조건 활용 가능
- 저장공간 효율화
단점
- 조회시 조인을 많이 걸어서 사용, 성능 저하
- 조회 쿼리가 복잡함
- 데이터 저장시 insert 2번 호출
단일 테이블 전략
장점
- 조인이 필요 없으므로 일반적으로 조회 속도 빠름
- 조회 쿼리가 단순함
단점
- 자식 엔티티 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모두 저장하므로 테이블이 커질 수 있다. 상황에 따라서 오히려 성능이 떨어질 수 있음
구현클래스 마다 테이블 전략
- 이 전략은 사용하지 않는다.
- 뭔가 Item으로 묶여있지 않다. 묶인 곳이 없으니 정산이 안된다. 새로운게 생길 때마다 테이블을 늘려야하기도 하다.
- 새로운 타입이 추가 될 때에도 너무 많은 걸 바꿔야한다.
'dev > JPA 기본' 카테고리의 다른 글
즉시로딩과 지연로딩 (0) | 2024.02.05 |
---|---|
@MappedSuperclass (0) | 2024.02.03 |
다대다 [N:M] (0) | 2024.02.02 |
일대일 관계 (1) | 2024.02.02 |
다중성 - 다대일과 일대다, (1) | 2024.02.02 |
- Total
- Today
- Yesterday
- thymleaf
- 로그인
- react실행
- jpa api
- reject
- ArgumentResolver
- 향해플러스백엔드
- hypertexttransferprotocol
- 예외처리
- 항해99
- exception
- 백엔드 개발자 역량
- React
- 향해99
- filter
- HTTP
- SpringBoot
- 스프링공부
- 백엔드 개발자 공부
- Intercepter
- 인터셉터
- 향해플러스
- 항해플러스
- JPA
- rejectValue
- 리터럴
- 컨트
- Java
- BindingResult
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |