본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다.
상속관계 매핑
- 관계형 데이터베이스에는 상속 관계가 존재하지 않는다.
- 관계형 데이터베이스의 슈퍼타입 서브타입 관계라는 모델링 기법이 객체에서의 상속과 유사하다.
- 따라서 상속 관계 매핑이란 객체의 상속 구조와 DB의 슈퍼타입-서브타입 관계를 매핑하는 것이다.
- 슈퍼타입-서브타입 논리모델을 실제 물리 모델로 구현하는 방법으로 3가지 방법이 있다.
- 조인 전략
- 단일 테이블 전략
- 구현 클래스마다 테이블 전략
조인 전략 : JOINED
- 가장 정규화된 방법이다.
- 장점
- 테이블 정규화
- 외래 키 참조 무결성 제약 조건 활용 가능
- 저장공간 효율화
- 단점
- 조회시 조인을 많이 사용하므로 성능 저하
- 조회 쿼리가 복잡
- 데이터 저장시 INSERT SQL 2번 호출해야 한다. (insert Item, insert movie)
단일 테이블 전략 : SINGLE_TABLE
- 하나의 테이블에 모두 몰아넣는 방법이다.
- 장점
- 조인이 필요 없으므로 조회 성능이 빠름
- 조회 쿼리가 단순
- 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null을 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있으며, 그에 따라 조회 성능이 오히려 느려질 수 있다.
구현 클래스마다 테이블 전략 : TABLE_PER_CLASS
- 공통 속성을 테이블마다 중복으로 가지고 있는 방법이다. (사용 권장 X)
- 장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약 조건 사용이 가능
- 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL이 필요)
- 자식 테이블을 통합해서 쿼리하기 어렵다.
상속관계 매핑 어노테이션
JPA는 상속관계 매핑 시 SIGLE_TABLE을 기본 전략으로 사용하며, @Ingeritance 어노테이션을 통해 다른 전략을 지정할 수 있다.
- @Inheritance(strategy=IngeritanceType.XXX)
- JOINED : 조인 전략
- SINGLE_TABLE : 단일 테이블 전략
- TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
상속관계 매핑 시 부모 클래스에 DTYPE 칼럼이 필요한데, 아래 어노테이션을 통해 이름을 지정한다.
- @DiscriminatorColumn(name="DTYPE") : 부모 클래스에 사용, DTYPE 칼럼명 지정 (default=DTYPE)
- @DiscriminatorValue("XXX") : 자식 클래스에 사용, DTYPE 값으로 사용할 이름 지정 (default=엔티티명)
@Entity
@Getter
@Setter
@DiscriminatorColumn
@Inheritance(strategy = InheritanceType.JOINED) // 상속관계 매핑 (조인 전략)
public class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
@Entity
@Setter
@Getter
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
정리
- 실무에서는 기본적으로 조인 전략을 사용하는 것이 좋다.
- 비즈니스적으로 매우 단순한 경우에 단일 테이블 전략을 고려하자.
매핑 정보 상속
@MappedSuperclass
- 공통 매핑 정보가 필요할 때 사용
- ex) 생성일(create_at), 수정일(modified_at)
- 여러 엔티티에서 공통적으로 사용하는 매핑 정보가 있어 부모 클래스에 두고 속성만 상속받아 사용하고 싶을 때 사용한다.
- 엔티티가 아니기 때문에 테이블과 관계 X
- 직접 생성해서 사용할 일이 없기 때문에 추상 클래스(abstact) 권장
@MappedSuperClass
class BaseEntity {
private Long id;
private String name;
}
class Member extends BaseEntity {
private String name;
}
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] 값 타입 (0) | 2022.10.19 |
---|---|
[JPA] 영속성 전이(CASECADE)와 고아 객체 (0) | 2022.10.18 |
[JPA] 즉시 로딩(LAZY)과 지연 로딩(EAGER) (0) | 2022.10.18 |
[JPA] 프록시 (0) | 2022.10.18 |
[JPA] 연관관계 매핑(3) - 다중성 (ManyToOne, ManyToOne, OneToOne, ManyToMany) (1) | 2022.10.11 |
[JPA] 연관관계 매핑(2) : 양방향 매핑 (0) | 2022.10.06 |
[JPA] 연관관계 매핑(1) : 단방향 매핑 (0) | 2022.10.06 |
[JPA] 데이터베이스 스키마 자동 생성 : DDL AUTO (0) | 2022.09.30 |