본문 바로가기
강의 정리/자바 ORM 표준 JPA

6. 고급 매핑

by 이석준석이 2020. 12. 29.

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