티스토리 뷰

dev_공부일지/JPA 기본

상속관계 매핑

dev_0hoon 2024. 2. 3. 17:54

상속관계 매핑

- 관계형 데이터베이스는 상속 관계x

- 슈퍼타입 서브타입 관계라는 모델링 기법이 상속과 유사

- 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑

 

인프런 - 김영한 JPA 강의 중

 

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

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

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

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

 

인프런 - 김영한 JPA 강의 중
인프런 - 김영한 JPA 중
인프런 - 김영한 JPA 강의 중

 

 

 

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 테이블 안에 다 넣게 된다.

 

인프런 - 김영한 JPA 강의 중

 

어노테이션을 이용해서 전략을 변경할 수 있다.

 

조인전략

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이라는걸 추가 시키지 않아도 

인프런 - 김영한 JPA 강의 중

 

이렇게 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
일대일 관계  (0) 2024.02.02
다중성 - 다대일과 일대다,  (1) 2024.02.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 31
글 보관함