- 상속관계 매핑에 필요한 주요 어노테이션을 파악한다.
@Inheritance
@DiscriminatorColumn
@DiscriminatorValue
@Inheritance
의 세 가지 전략을 파악한다.
InheritanceType.JOINED
InheritanceType.SINGLE_TABLE
InheritanceType.TABLE_PER_CLASS
@MappedSuperClass
의 기능을 파악한다.
- @Inheritance : 상속관계를 매핑할 때
strategy
속성과 함께 사용된다. 부모 클래스에 명시한다.- @DiscriminatorColumn : 부모 클래스에서 자식 클래스를 구분하기 위한 컬럼을 지정한다.
- default :
DTYPE
- @DiscriminatorValue : 자식 클래스에서 자신임을 구별할 컬럼의 이름을 지정한다.
- default : 엔티티명
RDB는 기본적으로 상속 관계가 존재하지 않는다.
따라서 Super Type과 Sub Type 관계를 이용해 상속관계를 매핑한다.
일반적으로 부모 클래스는
abstract
클래스로 만들며, 부모 클래스에@Inheritance
어노테이션을 사용해 상속관계를 매핑한다.
- 상속관계 매핑의 세 가지 전략에 대해 알아보자.
JOINED
- 정석적인 전략으로, 각각의 테이블로 변환하여 나타내는 방식이다.
- 장점
- 테이블 정규화
- 저장공간 효율화
- 하위 클래스의 외래 키가 상위 클래스에 존재하지 않으면 에러를 발생시키므로, 데이터 무결성이 보장된다.
- 단점
- 조회 시 JOIN query가 사용되어 성능이 저하된다.
- 조회 query가 복잡하다.
- 데이터 저장 시 INSERT query를 두 번 실행된다.
SINGLE_TABLE
- 부모와 자식의 모든 필드를 하나의 통합 테이블로 나타내는 방식이다.
- 장점 : 조회 query가 단순하며 빠르다.
- 단점
- 자식 엔티티가 매핑한 컬럼은
null
을 허용한다.- 필드가 매우 많을 경우 테이블이 커져 더 느려질 수 있다.
TABLE_PER_CLASS
- 모든 컬럼을 Sub Type에 나타내는 방식으로, 이 전략은 사용하지 말자.
- 단점
- 조회 query에서 UNION sql을 사용해 느리다.
- 자식 테이블을 통합해서 query하기 어렵다.
- 공통 매핑 정보가 필요할 때 사용하며, 아래와같은 특징을 가진다.
- 엔티티가 아니며, 따라서 테이블과 매핑되지 않는다.
즉, 테이블 구조와 아무런 관련이 없다.- 조회, 검색이 불가하다.
- 자식 클래스에 매핑 정보만을 제공한다.
직접 생성할 일이 없으므로, 추상 클래스로 설계하도록 하자.