-
JPA(6) - 상속관계매핑,MappedSuperclass카테고리 없음 2024. 1. 11. 15:22
- 관계형 데이터베이스는 상속 관계 없음
- 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
-> 상속관계 매핑은 객체의 상속구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것
1. 상속관계 매핑
- 슈퍼타입 서브타입 논리모델을 실제 물리 모델로 구현하는 방법
- > 각각 테이블로 변환 : 조인전략
- > 통합 테이블로 변환 : 단일 테이블 전략
- > 서브타입 테이블로 변환 : 구현 클래스별 테이블 전략
@Inheritance(stratrgy=inheritanceType.XXX) // JOINED : 조인전략 // SINFLE_TABLE : 단일 테이블 // TABLE_PER_CLASS : 구현 클래스별 테이블 전략 @DiscriminatorColumn(name="DTYPE") //부모에 넣어주면 자동으로 자식 엔티티명 넣은 DTYPE컬럼 만들어준다. @DiscriminatorValue("XXX") // 자식 엔티티에서 테이블 저장시 엔티티명 말고 다른거 사용하고 싶을 때
2. 조인전략 사용
- ITEM 테이블을 만들고 속성을 상속
- 상속받은 ALBUM, MOVIE, BOOK 테이블은 ITEM의 기본키를 FK이자 PK로 사용
- 각자 필요한 필드 선언
* ALBUM을 업데이트하면, INSERT를 두번 날리고, 조회는 한번에 가능
@Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="DTYPE") public class Item{ @Id @GeneratedValue @Column(name="ITEM_ID") private Long id; private String name; private int Price; } @Entity public class ALBUM extends Item{ private String artist } //..
장점 : 테이블 정규화, 외래키 참조 무결성 조건 활용가능, 저장공간 효율적
단점: 조회시 조인이 많이들어감, 조회쿼리 복잡, 데이터 저장시 SQL 2번 호출
3. 단일 테이블 전략
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="DTYPE") public class Item{ @Id @GeneratedValue @Column(name="ITEM_ID") private Long id; private String name; private int Price; } @Entity @DiscriminatorValue(name="A") public class ALBUM extends Item{ private String artist } //..
장점: 조인이 필요없어서 조회성능이 좋고, 쿼리가 단순
단점: 자식엔티티가 매핑한 컬럼은 모두 null허용, 테이블이 커져서 조회성능이 떨어질 수도 있다.
*조인전략에서 단일테이블로 넘어가는건 손쉽게 가능
- 구현 클래스마다 테이블 전략
> ORM 전문가, DB 설계자 둘 다 추천 X
장점: 서브 타입을 명확하게 구분해서 처리할 때 효과적, not null 제약조건 사용가능
단점 : 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL 필요), 자식 테이블 통합 쿼리 어려움
* Item item = em.find(item.class,1L) -> 자식테이블 모두 UNION해서 찾아야함
정산 쿼리를 미리 짜두었는데, 추후에 item이 추가되면 다시 짜야함...
4. MappedSuperclass
> 공통 매핑 정보가 필요할 때 사용한다.
> 상속관계와는 전~혀 상관없음 그냥 id나 name처럼 모두에게 포함될 정보같은거 한번에 넣기 위해 사용
> 엔티티X, 테이블과 매핑X, 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
> 조회 검색 불가 (em.find(BaseEntity) 불가)
> 직접 생성해서 사용할 일이 없음으로 추상 클래스 권장
@MappedSuperclass public abstract class BaseEntity { private String createdBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; } @Entity public class Member extends BaseEntity { ...}
@MappedSuperclass는
테이블과 관계 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보 모으는 역할
주로 등록일, 수정일, 등록자, 수정자와 같은 전체 엔티티에서 공통으로 적용하는 정보 모을 때 사용
*엔티티는 같은 엔티티나 MappedSuperclass로 정한 클래스만 상속가능함!
*실무에서는 너무 복잡한 상속관계는 그냥 포기! 하는 경우도 있다함 단일테이블로 만들면되긴하니깐..