Search
Duplicate
📒

[JPA 기본] 07-1. 고급맵핑 ⭐

상태
완료
수업
JPA
주제
JPA
4 more properties
참고

상속관계 매핑

NOTE
관계형 데이터베이스상속 관계가 없다. 즉 객체의 상속개념을 그대로 사용할 수 없다!
데이터베이스에 직접전인 상속은 없다.

특징

슈퍼타입, 서브타입 관계라는 모델링이 객체 상속과 유사하다.
상속관계 맵핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 맵핑

상속관계 전략

이러한 상속관계를 구현하는방식은 여러가지가 존재한다
ex) @Inheritance(strategy = InheritanceType.JOINED)

주오 어노테이션

이름
설명
속성
속성 상세
@Inheritance
물리모델 구현 전략
strategy
- JOINED: 조인전략 - SINGLE_TABLE:단일 테이블 전략 - TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
@DiscriminatorColumn
name
@DiscriminatorValue
value

슈퍼타입 서브타입 논리 모델 구현 - 조인전략

NOTE

특징

item, AlbumPK, FK가 같아 각각의 테이블에 insert를 수행하고 item내에 타입을 구분하는 컬럼(DEYPE)을 만들어서 구해온다.
모든 자손 엔티티가 상위 엔티티의 아이디를 PK이자 FK로 지정해줘야 하는데, 컬럼명을 각각의 하위 클래스별로 다르게 만들고 싶다면 @PrimaryKeyJoinColumn 을 활용하자

장점

정규화도 되어있고, 제약조건을 부모에 걸어 맞출 수 있다.
ex) Order 테이블에서 특정 아이템(Moive)의 가격을 볼 때 Item 테이블만 봐도된다.
저장공간 효율화

단점

조회시 조인이 많을 경우 성능이 저하된다.
조회 쿼리가 복잡하다.
데이터 저장시 INSERT SQL 2번 호출(큰 문제는 아니다.)

슈퍼타입 서브타입 논리 모델 구현 - 단일 테이블 전략(default)

NOTE

특징

논리모델을 한 테이블로 합쳐버리는 방법이다.
한 테이블에 다 넣어두고 DTYPE로 구분한다.
테이블은 ITEM 하나만 관리하면 된다.
@DiscriminatorColumn이 필수로 들어간다(기입하지 않아도 들어감)
@DiscriminatorValue("A")와 같이 서브타입 쪽에서 슈퍼타입에 들어갈 컬럼을 정의할 수 있다.

장점

조인이 필요 없기에 일반적으로 조회 성능이 빠르다.
조회 쿼리가 단순하다,

단점

자식 엔티티가 맵핑한 컬럼은 모두 nullable 해야한다.
단일 테이블에 모든 것을 저장하기에 테이블이 커지고, 상황에 따라 조회 성능이 느려질수도 있다.

슈퍼타입 서브타입 논리 모델 구현 - 구현 클래스마다 테이블 전략

NOTE
각각의 테이블을 별개로 만들어서 관리한다.
ITEM 테이블을 생성하지 않고, ALBUM, MOVIE, BOOK에서 각각의 id, name, price 필드를 가지게 된다.

장점

서브 타입을 명확하게 구분해서 처리할 떄 효과적
Not null 제약조건 가능

단점

여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL)
ITEM유형을 조회하려면 테이블 3개를 모두 합쳐야함..
자식 테이블을 통합해서 쿼리하기 힘듬

@MappedSuperclass

NOTE
상속관계는 아니지만, 공통의 맵핑 정보가 필요할 떄 사용한다!(id, name)
Member와 Seller에 id와 name 컬럼이 중복됨

특징

상속관계 매핑이 아니다!
엔티티도 아니고, 테이블과 매핑되지도 않는다.
부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공하며, 부모 타입으로 조회, 검색이 불가능하다
직접 생성할 사용할 일이 없으므로 추상 클래스를 추천한다
@MappedSuperclass 코드
[ 참고]
@Entity클래스는 @Entity@MappedSuperclass로 지정한 클래스만 상속 가능