Search
Duplicate

고급 매핑

상속관계 매핑

관계형 데이터베이스는 상속 관계가 없다.
슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
Album, Movie, Book은 모두id, name, price를 가지고 있다(공통 변수)

슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법

1. 조인전략

Item, Album에 pk,fk가 같아 각각의 테이블에 insert를 수행하고 Item내에 타입을 구분하는 컬럼을 만들어서 구해온다.
모든 자손 엔티티가 상위 엔티티의 아이디를 PK이자 FK로 지정해줘야 하는데, 컬럼명을 각각의 하위 클래스별로 다르게 만들고 싶다면 @PrimaryKeyJoinColumn 애노테이션을 활용하면 된다.
장점
정규화도 되어있고, 제약조건을 부모에 걸어 맞출 수 있다.
ex: Order 테이블에서 특정 아이템(영화)의 가격을 볼때 ITEM 테이블만 봐도 된다.
저장공간 효율화
단점
조회시 조인이 많을 경우 성능 저하
조회 쿼리가 복잡함.
데이터 저장시 INSERT SQL 2번 호출(큰 문제는 아님)
조인이 많아도 조건이 잘 걸려있을 경우 성능 하락이 크지 않고 저장공간이 효율적으로 되기에 오히려 더 좋을 수 있다는 점을 고려해야 한다.

2. 단일 테이블 전략(default)

논리모델을 한 테이블로 합쳐버리는 방법.
한 테이블에 다 넣어 놓고 어떤 테이블인지 구분하는 컬럼(ex:DTYPE)을 통해 구분한다.
테이블은 ITEM 테이블 하나만 관리된다.
성능에서 우위를 가질 수 있다. (select or insert 가 한번에 수행으로 된다.)
@DiscriminatorColumn 이 필수로 들어간다(기입하지 않아도 자동으로 들어감)
장점
조인이 필요 없기에 일반적으로 조회 성능이 빠름
조회 쿼리가 단순함.
단점
자식 엔티티가 매핑한 컬럼은 모두 nullable 해야 한다.
단일 테이블에 모든 것을 저장하기에 테이블이 커질 수 있고 상황에 따라서 조회성능이 더 느려질 수 있다. (임계점을 넘을 정도의 상황은 거의 오지 않는다.)

3. 구현 클래스마다 테이블 전략

각각의 테이블마다 별개로 만들어서 따로 관리
ITEM 테이블을 생성하지 않고 ALBUM, MOVIE, BOOK 테이블에서 각각 id, name, price필드를 가지고 있다.
@DiscriminatorColumn을 사용할 수 없다.(구분 할 이유가 없다.)
ITEM을 조회하면 ALBUM, MOVIE, BOOK 세개의 테이블을 UNION ALL으로 전부 조회해서 가져온다.(단점)
추천하지 않는 전략(개발자,DBA 양측에서)
장점
서브 타입을 명확하게 구분해서 처리할 때 효과적
Not null 제약조건 가능
단점
여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL)
자식 테이블을 통합해서 쿼리하기 힘듬.
Search
주요 어노테이션
이름
설명
속성
속성 상세
물리모델 구현 전략
strategy
- JOINED: 조인전략 - SINGLE_TABLE:단일 테이블 전략 - TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
COUNT3

@MappedSuperclass

공통 매핑 정보가 필요할 때 사용(id, name)
ex: 모든 테이블에 row 생성일, 수정일을 등록해야하는경우(createdAt, updatedAt)
상속관계 매핑이 아니다.
엔티티도 아니고, 테이블과 매핑되지도 않는다.
부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
부모타입으로 조회,검색 불가
직접 생성해서 사용할 일이 없으므로 추상클래스 추천
@Entity클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능

실전예제

하단 도메인 모델을 참고하여 JPA를 이용하 예제를 만들어 보자.

도메인

도메인 상세

테이블 설계