참고
상속관계 매핑
NOTE
관계형 데이터베이스는 상속 관계가 없다. 즉 객체의 상속개념을 그대로 사용할 수 없다!
데이터베이스에 직접전인 상속은 없다.
특징
•
슈퍼타입, 서브타입 관계라는 모델링이 객체 상속과 유사하다.
•
상속관계 맵핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 맵핑
상속관계 전략
•
이러한 상속관계를 구현하는방식은 여러가지가 존재한다
•
ex) @Inheritance(strategy = InheritanceType.JOINED)
주오 어노테이션
이름 | 설명 | 속성 | 속성 상세 |
@Inheritance | 물리모델 구현 전략 | strategy | - JOINED: 조인전략
- SINGLE_TABLE:단일 테이블 전략
- TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 |
@DiscriminatorColumn | name | ||
@DiscriminatorValue | value |
슈퍼타입 서브타입 논리 모델 구현 - 조인전략
NOTE
특징
•
item, Album에 PK, 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로 지정한 클래스만 상속 가능