Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

지우쓰 개발일기

[JPA] 상속관계 Mapping 본문

Spring Boot/JPA

[JPA] 상속관계 Mapping

jiwoo-kimm 2020. 9. 13. 00:09

본 포스팅은 자바 ORM 표준 JPA 프로그래밍 (김영한 저)을 읽고 정리한 내용입니다.

 

자바 ORM 표준 JPA 프로그래밍

에이콘 오픈 소스 프로그래밍 시리즈. 이 책은 JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것을 다룬다.

www.aladin.co.kr

 


Super-Type Sub-Type Relationship


  • 관계형 DB에서 객체지향에서의 상속과 유사한 개념

  • 테이블 구현 전략

    • Joined Strategy(조인 전략): 각각의 테이블로 변환하여 조회할 때 조인

    • Single-Table Strategy(단일 테이블 전략): 테이블 하나에 통합

    • Table-per-Concrete-Class Strategy(구현 클래스마다 테이블 전략): 서브 타입마다 테이블로 변환

 

Joined Strategy


조인 전략
  • 엔티티 각각을 모두 테이블로 만듦

  • Super-Type 테이블의 PK를 Sub-Type 테이블에서 PK, FK로 받아 사용

  • Super-Type 테이블에서 DTYPE으로 Sub-Type 엔티티 구분

매핑 정보
  • @Inheritance(strategy = InheritanceType.JOINED): 부모 클래스에 적용

  • @DiscriminatorColumn(name = "DTYPE"): 부모 클래스에 구분 컬럼 지정

  • @DiscriminatorValue("M"):  자식 클래스에 구분 칼럼에 입력할 값 지정

  • @PrimaryKeyJoinColumn(name = "BOOK_ID"): 부모 테이블의 PK 대신 자식 테이블의 PK 컬럼명 변경

장점
  • 테이블이 정규화된다

  • 외래 키 참조 무결성 제약조건을 활용할 수 있다.

  • 저장공간을 효율적으로 사용한다.

단점
  • 조인이 많이 사용되므로 성능이 저하될 수 있다.

  • 조회 쿼리가 복잡하다.

  • 데이터를 등록할 때 INSERT SQL을 두 번 실행한다.

 

Single-Table Strategy


단일 테이블 전략
  • 하나의 테이블에 모든 엔티티 저장

  • DTYPE으로 엔티티 구분
매핑 정보
  • @Inheritance(strategy = InheritanceType.SINGLE_TABLE): 부모 클래스에 적용

  • @DiscriminatorColumn(name = "DTYPE"): 부모 클래스에 구분 컬럼 지정

  • @DiscriminatorValue("M"):  자식 클래스에 구분 칼럼에 입력할 값 지정

장점
  • 조회 쿼리가 단순하다.

  • 조인이 필요 없으므로 조회 성능이 빠르다.

단점
  • 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다.

  • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 따라서 상황에 따라서는 조회 성능이 오히려 느릴 수도 있다.

 

Table-per-Concrete-Class Strategy


구현 클래스마다 테이블 전략
  • 자식 엔티티를 각각의 테이블로 만듦

  • DB, ORM 측면 모두에서 추천하지 않는 전략
매핑 정보
  • @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS): 부모 클래스에 적용

장점
  • 서브 타입을 구분해서 처리할 때 효과적이다.

  • not null 제약조건을 사용할 수 있다.

단점
  • 여러 자식을 함께 조회할 때 성능이 안 좋다.

  • 자식 테이블을 통합해서 쿼리하기 어렵다.

 

@MappedSuperclass


  • 테이블과 매핑되지 않고 자식 엔티티에 DB 매핑정보 상속

  • @AttributeOverride(name = "부모 컬럼명", column = @Column(name = "새 컬럼명")): 상속받은 부모 컬럼명 대신 새 컬럼명을 지정

  • 부모 클래스는 추상 클래스로 구현하는 것을 추천

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

[JPA] Join Table  (0) 2020.09.13
[JPA] 복합키와 식별관계 Mapping  (0) 2020.09.13
[JPA] 연관관계 Mapping (2)  (0) 2020.09.12
[JPA] 연관관계 Mapping (1)  (0) 2020.09.10
[JPA] Persistence Context  (0) 2020.09.09
Comments