[JPA] 5. 상속관계 Mapping & Mapped Superclass

2022. 8. 3. 18:00·Back-End/JPA
목차
  1. 상속관계 Mapping
  2. 조인 전략
  3. 단일 테이블 전략
  4. 구현 클래스마다 테이블 전략
  5. Mapped Superclass

상속관계 Mapping

 

계속해서 DB와 OOP의 패러다임 문제가 발생하는데, 이번에는 상속문제이다

 

OOP는 상속을 중요시하기에 언어적으로 완벽히 지원해준다

 

하지만 RDB는 상속을 일부 지원하긴 하지만 완벽히 지원해주지 않는다

 

대신 슈퍼타입과 서브타입이란걸 지원해주는데 

 

JPA는 이 상속문제를 해결하는 3가지 전략을 제공한다

 

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

 

부모 클래스에 다음과 같은 Annotation을 붙여주면 된다

 

@Entity
@Inheritance(strategy=InheritanceType.XXX)
public class Parent {

}

@Entity 
public class Children1 extends Parent{

}

 

따라서 테이블 전략을 바꾸더라도 전체 코드를 바꾸는것이 아닌,

 

jpa를 사용하게 되면 Annotation만 바꿔주면 된다!

 

조인 전략

 

 

ITEM 테이블에도 ITEM_ID를 가지고,  하위 테이블들인 ALBUM, MOVIE, BOOK에도 동일한 ITEM_ID를 두어,

 

무슨 ITEM인지 확인할 수 있게 해준다.

 

이때 Optional하게 DTYPE이라는 새로운 Column을 만들어 

 

자신이 무슨 Type의 ITEM인지 빠르게 확인할 수 있게 해준다.

 

DTYPE이 없으면 모든 ITEM_ID를 갖는 테이블들이 join 대상이 되지만,

 

DTYPE으로 1차적으로 filter하게 되면 join 대상이 확 줄어든다는 이점이 있다.

 

DTYPE을 만들어 주려면 @DiscriminatorColumn을 사용한다

 

@Entity
@Inheritance(strategy=InheritanceType.XXX)
@DiscriminatorColumn(name="DTYPE")
public class Parent {

}

 

장단점을 정리해보자면 다음과 같다

 

장점

  • 테이블 정규화
  • FK 참조 무결성 제약조건 활용 가능
  • 저장공간 효율화(상속)

단점

  • 조회시에 JOIN으로 가져와야하기 때문에 성능 저하
  • 조회 쿼리가 복잡(내 코드 말고 로그에 찍히는 쿼리)
  • 데이터 저장시 INSERT가 1번이 아닌 2번 호출
    • ITEM Table에도 넣어줘야 하고 하위 Table에도 넣어줘야하기 때문

 

하지만 이 전략이 3가지 전략중에서 제일 낫다고 한다. 성능상의 이슈도 그렇게 문제가 되지 않고

 

제일 깔끔하기 때문

 

 

단일 테이블 전략

 

하나의 Table에 몽땅 때려넣는 무식한 방식

 

하지만 JPA는 기본(default) 전략으로 이 전략을 채택했다

 

DB가 비지니스에 크게 연관되어있지 않고 중요하지 않으면 이 방법도 괜찮다고 한다

 

 

장점

  • JOIN이 필요없으므로 조회 성능이 빠름
  • 조회 쿼리가 단순

단점

  • Null이 허용되는 Column이 생긴다
  • 단일 테이블에 모든것을 저장하므로 테이블이 커질 수 있음. 그에 따라 조회 성능이 느려질수도?

 

 

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

 

 

마지막으로 구현 클래스마다 테이블을 만드는 전략이다.

 

ITEM_ID에 있던 NAME과 PRICE가 각각의 구현 테이블로 내려온것을 볼 수 있다

 

언뜻 보면 제일 괜찮은것 같지만 코드 변경에 유연하지 못하다는 단점을 가지고 있다.

 

장점

  • Not Null 제약조건 사용 가능

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION 때문)
  • 자식 테이블을 통합해서 Query하기 어려움

 

조인 전략을 잘 이용하자!

 

 

 

Mapped Superclass

요놈은 공통 매핑 정보가 필요할 때 사용하는 클래스이다.

 

 

Base Entity라는 Mapped Superclass를 만들고

 

Member와 Seller라는 Entity들이 상속받게 만들면 

 

속성을 상속받아 실제 DB Table에도 적용된다

 

이때 Mapped Superclass는 실제 DB에 매핑되는 Entity가 아니며 따라서 Entity라고 볼 수 없다

 

따라서 EntityManager.find() 같은 메소드로 가져올수도 없다.

 

또한 그 자체로 사용되는일이 거의 없기 때문에 관례상 abstract로 선언한다고 한다

 

주로 등록일, 수정일, 등록자, 수정자 같은 모든 Table이 가지고 있어야 하는 속성을

 

이 Mapped Superclass로 올려서 전체적으로 관리한다고 한다

 

 

 

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

저작자표시 (새창열림)

'Back-End > JPA' 카테고리의 다른 글

[JPA] 7. 값 타입  (0) 2022.08.12
[JPA] 6. 프록시와 Cascade 및 고아 객체  (0) 2022.08.04
[JPA] 4. Entity간의 연관관계 Mapping  (0) 2022.07.30
[JPA] 3. Entity Mapping  (0) 2022.07.21
[JPA] 2. Persistent에 대한 이해  (0) 2022.07.20
  1. 상속관계 Mapping
  2. 조인 전략
  3. 단일 테이블 전략
  4. 구현 클래스마다 테이블 전략
  5. Mapped Superclass
'Back-End/JPA' 카테고리의 다른 글
  • [JPA] 7. 값 타입
  • [JPA] 6. 프록시와 Cascade 및 고아 객체
  • [JPA] 4. Entity간의 연관관계 Mapping
  • [JPA] 3. Entity Mapping
imsongkk
imsongkk
이것저것 적어보는 개발 블로그
  • imsongkk
    이것저것
    imsongkk
  • 전체
    오늘
    어제
    • 분류 전체보기 (81)
      • 일상 (1)
      • Infra (21)
        • AWS (3)
        • Docker (8)
        • Kubernetes (9)
        • Terraform (1)
      • Trouble Shooting (9)
      • Back-End (18)
        • Spring Boot (2)
        • JPA (7)
        • HTTP 기본 (4)
        • DDD (3)
      • 소마 (4)
      • Programming (7)
        • 디자인 패턴 (7)
      • etc (19)
        • Unity (4)
        • Node.js (2)
        • React (1)
        • 리액트를 다루는 기술 (2)
        • C# (6)
        • Language (0)
        • Firebase (2)
        • 알고리즘 (1)
        • CS (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    소프트웨어 마에스트로 #소마 #SWM #소프트웨어 마에스트로 14기
    8080
    Git
    Firebase
    EC2
    3000
    Terraform #테라폼 #IaC #AWS CLI
    Firebase Analytics
    Google Analytics
    React
    도메인
    Repository
    VPC #Subnet #NAT #Region #AZ #IGW
    포트
    Private
    Pull
    Push
    clone
    firestore
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
imsongkk
[JPA] 5. 상속관계 Mapping & Mapped Superclass
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.