상속관계 매핑
- 관계형 데이터베이스는 상속 관계가 없음
- 슈퍼 타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
- 상속관계 매핑: 객체의 상속 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑
상속관계 매핑
- 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
- 각각 테이블로 변환 > 조인 전략
- 통합 테이블로 변환 > 단일 테이블 전략
- 서브타입 테이블로 변환 > 구현 클래스마다 테이블 전략
1) 조인 전략
- Join을 할 때 @DiscriminatorColumn을 넣지 않으면 DTYPE이 안 들어가게 된다. 이렇게 될 시 객체적으로 볼 때는 문제가 안되지만 DB만을 보게 될 시 어떻게 값이 들어오는지 찾기가 어려워진다. 때문에 조인 전략을 사용 할때@DiscriminatorColumn을 써주자.
장점
- 테이블 정규화
- 외래 키 참조 물경성 제약조건 활용 가능
- 저장공간 효율화
단점
- 조회 시 조인을 많이 사용, 서능 저하
- 조회 쿼리가 복잡함
- 데이터 저장 시 INSERT SQL 2번 호출
2) 단일 테이블 전략
- 단일 테이블 전략은 @DiscriminatorColumn이 없어도 DTYPE이 생성된다.
- 단일 테이블 전략은 내가 앨범, 무비, 북인지 알 수가 없기 때문에 필수로 생성이 된다.
장점
- 조인이 필요 없다
- 조회 쿼리가 단순함
단점
- 자식 엔티티가 매핑한 칼럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있게 상황에 따라서 조회 성능이 오히려 느려질 수 있다.]
3) 구현 클래스마다 테이블 전략
사용하면 안 되는 전략
장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL)
- 자식 테이블을 통합해서 쿼리 하기 어려움
주요 어노테이션
- @Inheritance(stragegy=InheritanceType.XXX)
- JOINED: 조인 전략
- SINGLE_TABLE: 단일 테이블 전략
- TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name="DTYPE")
- @DiscriminatorValue("XXX")
Mapped Superclass
- 공통 매핑 정보가 필요할 때 사용(id, name)
- 상속관계 맵핑이 아니다
- 엔티티가 아니다, 테이블과 매핑하는 게 아니다.
- 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
- 조회, 검색 불가(em.find(BaseEntity) 불가)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
@MappedSuperclass
- 테이블과 관계없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
- 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
- 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능
package helloJpa;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass // 속성을 같이 쓰고 싶다고 할때 사용한다. 공통적으로 사용할 속성을 사용 할 때 쓴다.
public abstract class BaseEntity {
@Column(name = "INSERT_MEMBER") //이런식으로 변경도 가능
private String createBy;
private LocalDateTime createDate;
@Column(name = "UPDATE_MEMBER") //이런식으로 변경도 가능
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
package helloJpa;
import javax.persistence.*;
@Entity
public class Member extends BaseEntity {
...
}
public class JpaMain {
public static void main(String[] args) {
...
try {
Member member = new Member();
member.setCreateBy("오늘생성..");
em.persist(member);
결론
@MappedSuperclass는 공통 매핑 정보를 사용할 때 기본적으로 많이 사용되고, 또한 갑작스러운 DBA의 공통으로 DB날짜 insert를 원할 경우에도 많이 사용된다. 기본 속성으로 묶어서 넣어주고 싶을 때 사용하는 것이라고 생각하면 좀 더 편하게 다가온다.
이 글은 인프런의
제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'Spring > 스프링 JPA' 카테고리의 다른 글
즉시 로딩과 지연 로딩 (0) | 2022.03.31 |
---|---|
프록시 (0) | 2022.03.30 |
다양한 연관관계 맵핑 (0) | 2022.03.29 |
연관관계 맵핑 기초 (0) | 2022.03.28 |
JPA 엔티티 매핑 (0) | 2022.03.25 |