1. 상속관계 매핑
관계형 데이터베이스는 상속 관계를 가지지 않는다.
슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
상속관계 매핑은 객체의 상속과 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것.
슈퍼타입 서브타입 논리 모델을 실제 모델로 구현하는 방법은 세 가지가 있다.
- 조인 전략(각각 테이블로 변환)
- 단일 테이블 전략(통합 테이블로 변환)
- 구현 클래스마다 테이블 전략(서브타입 테이블로 변환)
- 조인 전략
아래처럼 슈퍼타입 객체에 @Inheritance 어노테이션을 달아주면 된다.
조인 전략은 속성으로 InteritanceType.JOINED 해주면 된다.
여기에 DTYPE까지 추가시키고 싶을 때는 @DiscriminatorColumn(name = "DTYPE")을 추가해야 한다.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
서브타입은 슈퍼타입을 상속받도록 한다.
@Entity
public class Album extends Item {
private String artist;
}
조인전략의 장점과 단점은 다음과 같다.
• 장점
• 테이블 정규화
• 외래 키 참조 무결성 제약조건 활용가능
• 저장공간 효율화
• 단점
• 조회시 조인을 많이 사용, 성능 저하
• 조회 쿼리가 복잡함
• 데이터 저장시 INSERT SQL 2번 호출
- 단일 테이블 전략
@Inheritance의 전략을 InteritanceType.SINGLE_TABLE로 바꾸는 것만으로도 쉽게 전략을 수정할 수 있다.
• 장점
• 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
• 조회 쿼리가 단순함
• 단점
• 자식 엔티티가 매핑한 컬럼은 모두 null 허용
• 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다.
- 구현 클래스마다 테이블 전략
• 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천X
• 장점
• 서브 타입을 명확하게 구분해서 처리할 때 효과적
• not null 제약조건 사용 가능
• 단점
• 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
• 자식 테이블을 통합해서 쿼리하기 어려움
만약에 price를 이용하여 정산을 한다고 하면 세 테이블 각각에 쿼리를 날려야 함 => 효율 x
@MappedSuperclass
상속관계 매핑과 딱히 관계는 없음, 부모클래스를 상속받는 자식 클래스에 매핑 정보만 제공한다. 직접 생성해서 사용할 일이 없으므로 추상 클래스가 권장된다.
+) 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
+) 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통 으로 적용하는 정보를 모을 때 사용
+) 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지 정한 클래스만 상속 가능
아래와 같이 클래스를 생성해주고 @MappedSuperclass 어노테이션을 달아준 뒤,
이를 상속받고자 하는 클래스에서 이 클래스를 상속받으면 된다. 그럼 그 테이블에 이 클래스가 갖고 있는 컬럼들이 생성됨.
package jpabook.jpashop.domain;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String modifiedBy;
private LocalDateTime modifiedDate;
}
------------------------------------------------------------------------------
*레퍼런스 : 인프런 김영한님 강의(자바 ORM 표준 JPA 프로그래밍)
댓글