728x90
상속관계 매핑
관계형 데이터베이스는 상속관계가 아니다.
슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
상속관계 매핑: 객체의 상속과 구조와 db의 슈퍼타입 서브타입 관계를 매핑
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 3가지가 있다.
- 조인 전략: 각각 테이블로 변환
- 단일 테이블 전략: 통합 테이블로 변환
- 구현 클래스마다 테이블 전략: 서브타입 테이블로 변환
주요 어노테이션
- @Inheritance(strategy=InheritanceType.XXX)
- JOINED: 조인 전략
- SINGLE_TABLE: 단일 테이블 전략
- TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name=“DTYPE”)
- @DiscriminatorValue("XXX")
조인 전략
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColum //DTYPE 생성
public class Item {...}
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn("M")
public class Movie extends Item {...}
조인 전략의 장단점
장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
단점
- 조회시 조인을 많이 사용, 성능 저하
- 조회 쿼리가 복잡함
- 데이터 저장시 INSERT SQL 2번 호출 (Item 테이블에 한번 관련 테이블에 한번 해서 2번 SQL 호출)
단일 테이블 전략
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
//@DiscriminatorValue 없어도 DTYPE이 생긴다.
public class Item {...}
@DiscriminatorColum이 없어도 DTYPE이 생긴다.
단일 테이블 전략 장단점
장점
- 조인이 필요없으므로 일반적으로 조회 성능이 빠름
- 조회 쿼리가 단순함
단점
- 자식 엔티티가 매핑한 칼럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다.
구현 클래스마다 테이블 전략
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {...}
Item클래스를 abstract로 해주고 전략을 TABLE_PER_CLASS로 변경
여기서는 Item 테이블이 만들어지지 않는다.
이렇게 구현할 경우 특정 값을 지정해서 find하면 상관 없지만 Item.class 타입으로 지정해서 find하게되면 Itme을 확장한 클래스 전부에서 select해서 finde하는 쿼리가 나가게 된다.
ex) id = 5를 찾는다고 하면 아래 사진과 같이 쿼리가 나가게 된다
.
구현 클래스마다 테이블 전략 장단점
장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약 조건 사용 가능
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리하기 어려움
Mapped Superclass - 매핑 정보 사용
테이블마다 아래 속성이 들어가야한다고 하면 @MappedSuperclass 를 활용하면 편하다
private String createBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
BaseEntity 만들어서 위 속성값을 넣어서 @MappedSuperclass 적용하고 이 속성을 사용하는 클래스에 extends를 해준다.
@MappedSuperclass
public abstract class BaseEntity {
private String createBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
@Entity
public class Team extends BaseEntity{...}
@MappedSuperclass
- 상속관계 매핑이 아니다
- BaseEntity와 같이 @MappedSupterclass 가 붙은 클래스는 엔티티가 아니라서 테이블과 매핑이 안된다.
- 부모 클래스를 상속 받은 자식 클래스에 매핑 정보만 제공 (BaseEntity를 상속받은 Team 클래스에 매핑 정보만 제공)
- 조회, 검색 불가 (em.find(BaseEntity) 불가)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권
728x90
'JPA' 카테고리의 다른 글
즉시 로딩과 지연 로딩 (2) | 2023.11.09 |
---|---|
프록시 (1) | 2023.11.09 |
양방향 연관관계와 연관관계의 주인 (0) | 2023.11.02 |
연관관계 매핑 기초 (0) | 2023.11.02 |
엔티티 매핑 (1) | 2023.10.29 |