상속관계 매핑
- 객체는 상속관계가 존재하지만, 관계형 데이터베이스는 상속 관계가 없다.(대부분)
- 그나마 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
- 상속관계 매핑이라는 것은 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다.
조인 전략
- @Inheritance(strategy = InheritanceType.JOINED)
- 부모 클래스에 지정. 조인 전략이므로 InheritanceType.JOINED 설정
- @DiscriminatorColumn(name = "DTYPE")
- 구분 컬럼 지정. Default값이 DTYPE이므로 name 속성은 생략 가능
- @DiscriminatorValue("TEST")
- 구분 컬럼에 입력할 값 지정. Default값으로 엔티티 이름 사용
- @PrimaryKeyJoinColumn(name = "Album_ID")
- Default로 자식 테이블은 부토 테이블 id 컬럼명을 그대로 사용하나, 변경시 해당 설정값 추가
- 장점
- 테이블의 정규화
- 외래 키 참조 무결성 제약조건 활용 가능
- 저장공간을 효율적으로 사용 가능
- 단점
- 조회시 잦은 조인으로 인해 성능 저하 가능성
- 복잡한 조회 쿼리
- 데이터 등록 시, 두번 실행되는 INSERT문
단일 테이블 전략
- 하나의 테이블을 사용하며 구분 컬럼(DTYPE)을 활용해 데이터를 활용하는 전략
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- 부모 클래스에 지정. 단일 테이블 전략이므로 InheritanceType.SINGLE_TABLE 설정
- 장점
- 조인이 사용되지 않아 빠른 조회 성능
- 단순한 조회 쿼리
- 단점
- 자식 엔티티가 매핑한 컬럼은 모두 NULL 허용
- 높은 테이블이 커질 가능성으로 인해 오히려 조회 성능이 안좋아질 수 있음
구현 클래스마다 테이블 전략
- 자식 엔티티마다 테이블 생성하는 전략
- 추천하지 않는 전략
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- 부모 클래스에 지정. 구현 클래스마다 테이블 전략이므로 InheritanceType.TABLE_PER_CLASS 설정
- 장점
- 서브 타입을 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
- 단점
- 여러 자식 테이블 함께 조회시 성능 문제(UNION을 사용함)
- 자식 테이블을 통합해 쿼리가 어려움