Web/JPA

EP8. 고급 매핑

상속관계 매핑


  • 조인전략
  • 단일테이블전략
  • 구현클래스마다 테이블전략

어떤 전략이든을 선택하든 객체는 똑같이 구현된다.

하지만 DB 설계에서는 전략에따라 테이블 구성이 달라진다.

 

주요 어노테이션

  • @Inheritance(strategy = InheritanceType.XXX)
    JOINED : 조인전략
    SINGLE_TABLE : 단일테이블전략
    TABLE_PER_CLASS : 구현클라스당 테이블 전략
  • @DiscriminatorColumn(name='DTYPE') : DTYPE 부분 컬럼 이름 지정 가능
  • @DiscriminatorValue("XXX") : DTYPE부분 도메인 이름 지정 가능

 

 

 

조인전략

테이블

ITEM 테이블이 존재한다.

그리고 각 ALBUM, MOVIE, BOOK 테이블이 존재하고 ITEM 테이블을 상속받는다.

 

JPA로 구현

@Inheritance(strategy = InheritanceType.JOINED)

@DiscriminatorColumn : 무조건 써줘야함

 

Item

Book

 

 

 

단일테이블전략

테이블

ITEM 테이블 하나에 다 때려박는다.

JPA로 구현

@DiscriminatorColumn 안써줘도 DTYPE 들어간다.

-> 순서는? 기본적으로 숫자가 아니라 객체 이름으로 들어가서 걱정 안해도 된다.

 

Item

Book

 

 

구현클래스마다 테이블 전략

 

테이블

 

ITEM을 생성안하고 자식 테이블들만 생성된다.

그래서 DTYPE이 아예 필요없고 @DiscriminatorColumn가nbsp;필요없다.

그런데, 부모타입으로 조회할때 전부 다 비교해야 하기때문에 복잡한 쿼리가 나간다

JPA로 구현

실무에서 사용 안하기 때문에 생략한다.

 

 

정리

  장점 단점
조인 (정석) 1. 테이블이 정규화
2. 외래 키 참조 무결성 제약조건 활용 가능 (다른 테이블에서 외래키 하나로 조회 가능하다)
3. 저장공간 효율화
1. 조회시 조인을 많이 사용해서 조회쿼리가 복잡하다. 성능 낮다
2. 데이터 저장시 insert 쿼리 두개 나감
그런데 그렇게 성능 저하가 크진 않다.
단일테이블 1. 조인이 필요없어서 조회성능이 빠르다
2. 조회 쿼리가 단순하다
1. 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해줘야한다.
2. 오히려 한 테이블에 때려박아서 조회성능이 안좋아질 수 있다.
구현클래스마다 테이블 (안씀) 안쓰므로 생략 안쓰므로 생략

 

조인 전략을 기본으로 깔고가고, 엄청 단순해서 확장가능성이 없으면 단일테이블을 써라.

 

 

 

 

 

@MappedSuperclass


여러 엔티티에서 공통으로 사용되는 매핑정보가 있을때 사용한다.

 

특징

  • 상속아님.
  • 엔티티아님.
  • 조회도 안됨.

그니깐 abstract 로 써라

 

 

구현코드

package jpabook.jpashop.domain;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass
public abstract class BaseEntity {

    @Column(name = "INSERT_MEMBER")
    private String createdBy;
    private LocalDateTime createDate;
    @Column(name = "UPDATE_MEMBER")
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public LocalDateTime getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDateTime createDate) {
        this.createDate = createDate;
    }

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public LocalDateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

'Web > JPA' 카테고리의 다른 글

EP10. 값 타입  (0) 2021.02.12
EP9. 프록시와 연관관계 관리  (0) 2021.02.10
EP7. 다양한 연관관계 매핑  (0) 2021.02.08
EP6. 연관관계 매핑 (실전예제)  (0) 2021.02.06
EP5. 연관관계 매핑  (0) 2021.02.05