고급 매핑 - 상속 관계 매핑
#JPA/기본
/상속관계 매핑: DB에는 상속관계가 없다.
- 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
- 각각 테이블로 변환 → 조인 전략
- 통합 테이블로 변환 → 단일 테이블 전략
- 서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략
- 객체 입장에서는 셋 다 똑같음. 다 매핑이 가능함.
- /주요 어노테이션
@Inheritance(strategy=InheritanceType.XXX)@DiscriminatorColumn(name="DTYPE")@DiscriminatorValue("XXX")
@DiscriminatorColumn추가 시 DTYPE 칼럼 생김.- DTYPE을 안넣어도 되는데, 넣어주는게 좋다.
@DiscriminatorValue("A")로 하위 테이블 이름 지정 가능- /조인 전략 - 장점
- 테이블 정규화
- FK 무결성 제약조건 하위 타입까지 볼 필요 없는 경우 상위 타입만 조회하면 됨.
- 저장 공간 효율적
- /조인 전략 - 단점
- 조인으로 인한 성능저하. 데이터가 너무 많으면 오히려 성능이 좋을지도?
- 조회 쿼리가 복잡
- 데이터 저장 시 INSERT 두 번 나감.
- 하위 테이블 생성 X. 상위 테이블에 칼럼 다 포함됨.
@DiscriminatorColumn이 없어도 자동으로 DTYPE이 생성된다.- /단일 테이블 전략 - 장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠름. 쿼리도 단순함.
- /단일 테이블 전략 - 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용 무결성 애매해짐.
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다. (이런 경우는 거의 없긴 하다.)
- 상위 테이블 없애고 하위 테이블로 전부 내려버린 전략
- 쓰지 말자.
- 상위 객체 조회시 하위 테이블을 전부 조회해서 UNION 해서 비효율적.
- 장점
- 서브 타입 명확하게 구분.
- not null 제약 조건 사용 가능
- 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림
- 자식 테이블 통합해서 쿼리가 어려움.
- 공통 매핑 정보가 필요할 때 사용
- 생성일, 마지막 수정일, 생성한 사람, 수정한 사람
- BaseEntity 테이블이 생성되는게 아니라, Member 테이블에 BaseEntity 필드에 해당하는 컬럼이 생성된다.
- BaseEntity는 추상 클래스로 선언하자. 엔티티가 아니므로 생성할 일이 없다.
- 조회, 검색 불가(
em.find(BaseEntity)불가)
- 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
@Entity클래스는, 엔티티나@MappedSuperclass로 지정한 클래스만 상속 가능
- 파티셔닝등을 고려하면 테이블을 단순하게 유지하는게 좋음. 상속관계 많아지면 많이 복잡해짐.
- 일단 객체지향적으로 쓰다가 트레이드 오프 경계 지점에서 구조를 수정하자.
Ref) 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편
'DB Access > JPA' 카테고리의 다른 글
| [JPA] 값 타입 (0) | 2025.07.01 |
|---|---|
| [JPA] 프록시와 연관관계 관리 (0) | 2025.07.01 |
| [JPA] 다양한 연관관계 매핑 (0) | 2025.07.01 |
| [JPA] 연관관계 매핑 기초 (0) | 2025.07.01 |
| [JPA] 엔티티 매핑 (0) | 2024.11.08 |