고급 매핑

Sangkyeong Lee·2021년 5월 19일

[인프런]JPA

목록 보기
6/8

인프런 강의 < 자바 ORM 표준 JPA 프로그래밍 - 기본편 > 정리


상속관계 매핑

  • 관계형 db는 상속 관계가 없는 대신, 그와 유사한 슈퍼타입 서브타입 관계 라는 모델링 기법이 있다.
  • 상속관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다.

슈퍼타입 논리 모델을 물리 모델인 테이블로 구현하는 방법인 3가지가 있다.
1. 각각의 테이블로 변환
- jpa에서는 조인 전략이라고 부르며, 엔티티 각각을 모두 테이블로 만든다.
- 자식 테이블이 부모 테이블의 기본 키를 받아 PK + FK로 사용한다.
- 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없어서 타입을 구분하는 컬럼을 추가해야 한다.


#### 장점
- 테이블이 정규화 된다.
- 외래 키 참조 무결성 제약조건을 활용할 수 있다.
- 저장공간을 효율적으로 사용

#### 단점
- 조회할때 조인이 많이 사용돼서 성능 저하가 우려된다.
- 조회 쿼리가 복잡하다.
- 데이터를 등록할 INSERT SQL을 두번 실행한다.
  1. 통합 테이블로 변환

    • 단일 테이블 전략이라고 부른다
    • 하나의 테이블에 모두 포함시켜서 DTYPE으로 어떤 자식 데이터가 저장되어 있는지 구분한다.
    • 자식 엔티티가 매핑되는 컬럼들은 모두 null을 허용한다.
    • 구분 컬럼을 꼭 설정해야 한다.


    장점

    • 조인이 필요없어 조회 성능이 상승한다.
    • 조회 쿼리가 단순하다.

    단점

    • 자식 엔티티가 매핑한 컬럼은 모두 null을 혀용
    • 단일 테이블에 모두 저장해서 테이블이 커질 수 있고, 상황에 따라 조회 성능이 저하될 수 있다.
  1. 서브타입 테이블로 변환
    • 구현 클래스마다 테이블 전략이라고 부르며 자식 엔티티마다 테이블을 만든다.
    • 자식 테이블 각각에 필요한 컬럼이 모두 들어있다.
    • 구분컬럼 없어도 된다.


상속 매핑 어노테이션

  1. @Inheritance

    • @Inheritance(strategy = InheritanceType.JOINED)
      • 조인
    • @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
      • 단일 테이블
    • @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
      • 구현 클래스마다
  2. @DiscriminatorColumn(name = "DTYPE")

    • 부모 클래스에 구분 컬럼을 지정
    • 기본값이 DTYPE이므로 생략해도 된다.
  3. @DiscriminatorValue("M")

    • 구분 컬럼에 입력할 값을 설정한다.
    • M을 넣으면 DTYPE 값에 M이 설정된다.
**이 방법으로는 하지 않는다!**

@MappedSuperclass

  • 부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공한다.
  • 추상클래스와 유사한데 @Entity는 실제 매핑 되지만 @MappedSuperclass는 실제 테이블과 매핑되지 않고 단순히 매핑 정보를 상속할 목적으로만 사용한다.

예제 코드

@MappedSuperclass
public abstract class BaseEntity {

    @Id @GeneratedValue
    private Long id;
    private String name;
}

public class Member extends BaseEntity {
}
public class Seller extends BaseEntity {
}

< 자료 출처: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >

profile
💻Backend Developer

0개의 댓글