상속관계 매핑
설계를 하다보면 상속관계가 필요한 경우가 생긴다. 상위 클래스 '책' 과 '만화책', '소설책' 같은 상속관계는 RDB로 어떻게 표현해야 할까?
RDB 에는 상속관계가 존재하지 않는다. 대신, 슈퍼타입과 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하기 떄문에 이를 이용한다.
조인 전략
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Item{
...
}
장점
- 테이블 정규화
- 저장공간 효율화
- 외래 키 참조 무결성 사용가능
단점
- 조회 시 조인을 많이 사용
-> 성능 저하
- 조회 쿼리가 복잡
- INSERT 시 SQL 2번 사용
단일 테이블 전략
장점
단점
- 매핑한 컬럼 모두 null 허용해줘야 함
- 자식 테이블의 필드 값이 한 테이블안에 들어가 있어서 필연적으로 null이 생길 수 밖에
- 테이블이 커져서 오히려 느려질 수 있음
구현 클래스마다 테이블 전략
장점
- 서브 타입을 명확하게 처리할 수 있음
- not null 제약조건 가능
단점
- 성능이 느림
- 자식 테이블을 통합해서 쿼리하기 어려움
주요 어노테이션
상속관계를 표현하는 방법에 사용되는 어노테이션이다.
@Inheritance(strategy=InheritanceType.XXX)
JOINED
: 조인 전략
SINGLE_TABLE
: 단일 테이블 전략
TABLE_PER_CLASS
: 구현 클래스마다 테이블 전략
@DiscriminatorColumn(name="DTYPE"), @DiscriminatorValue("XXX")
DTYPE 은 자식 테이블을 구분하기 위해서 사용한다. 부모 테이블에 @DiscriminatorColumn, 자식 테이블에 @DiscriminatorValue 를 달아주면 DB 에서 필드가 추가되고 자식 테이블을 쉽게 구분할 수 있다.
@MappedSuperClass
- 공통된 매핑 정보가 필요할 때 사용함
- 반복되는 같은 속성의 필드를 한 곳에 모아두는 개념
- 엔티티가 아니기 때문에 조회, 검색이 불가함
- 직접 생성해서 사용할 일이 없기 때문에 추상 클래스를 권장
출처