1. 상속관계 매핑
패러다임의 불일치
- 객체 에는 상속관계가 존재
- RDB 에는 상속관계 x
상속관계 매핑
- 객체의 상속을 DB의 슈퍼타입, 서브타입 관계 모델링을 사용하여 매핑
3가지 전략을 사용할 수 있다.
1.1. 조인전략
특징
- [INSERT] ALBUM 을 추가한다고 했을 때
- ITEM, ALBUM 각 각 한번씩, 하나를 저장할 때 두개의 insert가 발생한다.
- [SELECT] ALBUM 을 조회한다고 했을 때
- ITEM과 ALBUM 테이블을 JOIN 하여 가져와야한다.
- 어떤거와 JOIN을 할 지 구분해야 하기 때문에 ITEM 에 DTYPE 컬럼이 추가된다.
가장 정규화된 방식
1.2. 단일테이블 전략
특징
- 하나의 테이블이 모두 넣은 뒤, DTYPE 컬럼을 기반으로 조인을 하여 어떤 데이터가 저장되어있는지 알 수 있다.
- @DiscrimitorColumn(name = ?) 로 DTYPE 컬럼 이름을 변경할 수 있다.
- 성능이 좋다.
- insert 한번, select 한번의 쿼리로 가능하다. (한 테이블에 있으니까)
1.3. 구현 클래스마다 테이블 전략
특징
- 모든 테이블에 각 각 넣는다.
위의 그림들을 보면
- 객체는 그대로 유지되나
- 데이터베이스는 여러가지 방법으로 설계할 수 있음
기본적으로 상속만 했을 때
- 기본 전략은 SingleTable 전략이다.
Hibernate:
create table Item (
DTYPE varchar(31) not null,
id bigint not null,
name varchar(255),
price integer not null,
artist varchar(255),
author varchar(255),
isbn varchar(255),
actor varchar(255),
director varchar(255),
primary key (id)
)
조인 전략으로 변경해보자.
조인전략 추가 | DType 추가 |
Hibernate:
create table Item (
id bigint not null,
name varchar(255),
price integer not null,
primary key (id)
)
Hibernate:
create table Album (
artist varchar(255),
id bigint not null,
primary key (id)
)
Hibernate:
create table Book (
author varchar(255),
isbn varchar(255),
id bigint not null,
primary key (id)
)
Hibernate:
create table Movie (
actor varchar(255),
director varchar(255),
id bigint not null,
primary key (id)
)
싱글 테이블 전략
싱글 테이블 전략 | DB |
- @DiscriminatorColumn 이 없어도 DTYPE 이 생긴다.
- 한 테이블에서 구분을 할 필요가 있기 때문
구현 클래스마다 테이블 전략
구현 클래스마다 테이블 전략 | 추상클래스로 선언해야 item 스키마가 생기지 않는다. |
추상 클래스로 조회할 때 문제가 생긴다.
- 모든 자식테이블을 다 보면서 union 으로 찾게되는 문제가 있다.
entityManager.find(Item.class, 한 테이블의 id값);
조인 전략
- 장점
- 정규화가 되어있다.
- 다른 테이블 입장에서는 Item 테이블만 보면 (연결관계를 맺으면) 되기 때문에 설계에 좋다.
- 저장공간 사용이 적다.
- 단점
- 조회시 JOIN 이 필수적이다.
- INSERT 쿼리도 2번 호출된다.
싱글 테이블 전략
- 장점
- JOIN 이 필요없어 조회가 빠르다.
- 조회 쿼리가 단순하다.
- 단점
- 자식 테이블에 null을 허용하게 된다.
- 테이블이 많이 커질 수 있다.
구현 클래스마다 테이블 전략
- 사용하지 않도록 한다.
- 설계적인 측면에서 외부 테이블이 ITEM 만 볼 수 없기 때문에(다른 테이블에 모두 연관관계를 맺어야 한다.) 불편하다.
웬만하면 조인 전략 사용 / 너무 간단한 테이블이라면 단일 테이블 사용
2. Mapped Superclass
공통적인 정보가 계속 반복되는 경우 사용
- 예시)
- 등록된 시간, 수정된 시간 컬럼이 테이블마다 계속 반복되는 경우 사용하도록 한다.
공통 정보를 모아놓은 클래스 생성 | Member Entity 가 상속(extends) 받은 경우 |
위처럼 공통 정보를 모아놓은 클래스를 생성한 뒤, 다른 클래스에서는 상속을 받아 사용하도록 한다.
추상클래스로 만들도록 한다.
'강의 정리 > 자바 ORM 표준 JPA' 카테고리의 다른 글
8. 값 타입 (0) | 2021.01.01 |
---|---|
7. 프록시와 연관관계 관리 (0) | 2021.01.01 |
5. 다양한 연관관계 매핑 (0) | 2020.12.28 |
4. 연관관계 매핑 기초 (0) | 2020.12.27 |
3. 엔티티 매핑 (0) | 2020.12.27 |