본문 바로가기
Spring/JPA

상속관계 매핑

by YellowCow 2023. 3. 24.

자바 클래스에서는 부모클래스를 상속하여 자식클래스를 생성할 수 있다

 

하지만, DB에서는 상속관계 개념이 없다

 

대신, 논리적 모델의 슈퍼 타입과 서브타입이라는 개념이 존재한다

  • 슈퍼 타입: 공통적인 컬럼을 가진 타입
  • 서브 타입: 슈퍼타입에 컬럼을 추가하여 생성한 타입

 

예를 들어, PERSON(사람)이라는 테이블과 STUDENT(학생)와 SALARYMAN(직장인)이라는 테이블의 관계는

아래 사진과 같이 표현 가능하다

위 사진에서 PERSON이 슈퍼타입, STUDENT와 SALARYMAN을 서브타입으로 볼 수 있다

 

 

JPA에서는 슈퍼 타입과 서브타입을 매핑할 수 있는 여러 전략들을 제공한다

 

JPA에서 제공하는 전략은 아래와 같다

 

조인전략

조인전략 사용 시 테이블 구조는 아래와 같다

 

특징

  •  부모-자식 테이블이 분리된 구조

 

장점

  • 객체지향적인 방법에 가장 가깝다
  • 정규화된 테이블
  • 외래키 제약조건 활용 가능

 

단점

  • 자식 테이블 조회 시마다 조인 필요
  • 삽입 시, Insert 쿼리가 2번 전송됨

 

매핑방법

1. 부모 엔티티를 추상 클래스로 생성

 

2. 부모 엔티티에 @Inheitance 어노테이션 지정

 

3. @Inheitance 어노테이션에 조인테이블 전략 설정

    (strategy 속성에 InheritanceType.JOINED 설정)

 

4. @DiscriminatorColumn 어노테이션 지정

    (자식 테이블을 구분할 구분컬럼 생성) - 뒤에서 자세히 설명

 

5. 부모 엔티티를 상속하여 자식 엔티티 작성

 

단일 테이블 전략

단일 테이블 전략 사용 시 테이블 구조는 아래와 같다

 

특징

  • 자식 테이블(STUDENT, SALARYMAN)의 컬럼이 부모 테이블(PERSON)에 포함된 구조
  • 한 테이블에 모든 자식 테이블의 데이터를 저장
  • DTYPE(자식테이블 구분자)으로 자식 테이블을 구분

 

장점

  • 조인이 필요없어서 성능 좋음
  • 단순한 쿼리

 

단점

  • 자식 테이블의 컬럼에 NULL을 허용 - 데이터 무결성 저하
  • 저장된 데이터가 많아질 수록 성능이 저하될 수 있음

 

매핑방법

1. 부모 엔티티를 추상 클래스로 생성

 

 

2. 부모 엔티티에 @Inheitance 어노테이션 지정

 

 

3. @Inheitance 어노테이션에 조인테이블 전략 설정

    (strategy 속성에 InheritanceType.SINGLE_TABLE 설정)

 

4. @DiscriminatorColumn 어노테이션 지정

    (자식 테이블을 구분할 구분컬럼 생성) - 뒤에서 자세히 설명

단일 테이블 생성전략에서는

@DiscriminatorColumn 어노테이션을 지정하지 않아도

DTYPE 컬럼이 생성된다

(DTYPE 컬럼이 없으면 자식 테이블 식별 불가)

 

5. 부모 엔티티를 상속하여 자식 엔티티 작성

 

 

 

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

구현 클래스마다 테이블 생성전략 사용 시 테이블 구조는 아래와 같다

 

특징

  • 부모 테이블(PERSON)의 컬럼이 자식 테이블(STUDENT, SALARYMAN)에 포함된 구조
  • 모든 자식 테이블에 부모 테이블의 컬럼이 들어감
  • 구현 클래스(엔티티) 마다 테이블이 각각 생성됨

 

장점

  • 서브 타입을 명확하게 구분하여 사용할 때 효과적
  • Not Null 제약조건 사용가능

 

단점

  • 유지보수성 저하
    • 새로운 자식 테이블이 만들어 질 때마다 코드수정 필요 - Ex) 조회 시
    • 부모 테이블이 수정되면 모든 자식 테이블 수정 필요
  • 성능저하
    • 조회 시마다 모든 자식 테이블을 조회해야 한다
      (UNION ALL로 조회됨)
  • 조회
    • 자식 테이블을 통합하여 조회하기 어려움

 

매핑방법

1. 부모 엔티티를 추상 클래스로 생성

 

 

2. 부모 엔티티 @Inheitance 어노테이션 지정

 

 

3. @Inheitance 어노테이션에 조인테이블 전략 설정

    (strategy 속성에 InheritanceType.TABLE_PER_CLASS 설정)

 

4. @DiscriminatorColumn 어노테이션 지정

    (자식 테이블을 구분할 구분컬럼 생성) - 뒤에서 자세히 설명

구현 클래스마다 테이블 생성전략에서는

@DiscriminatorColumn 어노테이션을 지정해도

DTYPE 컬럼이 생성되지 않는다

(자식테이블이 분리되어 있어 DTYPE 컬럼 필요 없음)

 

 

5. 부모 엔티티를 상속하여 자식 엔티티 작성

 

 

 

 

DTYPE 컬럼 설정관련 옵션

JPA에서는 자식 테이블을 식별하기 위한 구분자 컬럼(DTYPE)을 제공해준다

 

이와 관련된 옵션들을 살펴보겠다

 

@DicriminatorColumn

- DTYPE 컬럼의 이름을 지정하는 어노테이션

- @DicriminatorColumn(name="xxxx")와 같이 사용가능

- 부모 엔티티에 사용가능

 

@DicriminatorValue

- DTYPE 컬럼에 들어갈 값을 지정하는 어노테이션

- @DicriminatorValue("xxxx")와 같이 사용가능

- 부모 엔티티에 사용가능

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

복수의 유일키 제약조건 지정하는 방법  (0) 2023.05.26
@MappedSuperclass  (0) 2023.03.24
연관관계 - @ManyToMany  (0) 2023.03.23
연관관계 - @OneToOne  (0) 2023.03.22
연관관계 - @OneToMany  (0) 2023.03.18

댓글