DB입장에선 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략 상속 관계 매핑 3가지 다 매핑하도록 지원.
객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑.
상위 클래스를 추상클래스로 만들어줘야함!
정교화된 방식 조인 전략.
- jpa와 가장 유사한 모델
- @Inheritance(strategy = InheritanceType.JOINED) 사용
- @DiscriminatorColumn 을 사용하면 디폴트 컬럼명으로 DTYPE이 컬럼에 들어감(디폴트로 엔티티명이 들어감) 왠만하면 넣어주는 것이 좋다.
- @DiscriminatorValue("변수명")으로 자식테이블에서 이름을 지정할 수 있다.
장점
- 테이블이 정규화된다
- 저장 공간을 효율적으로 사용
- 외래 키 참조 무결성 제약 조건을 활용가능
단점
- 조회 쿼리가 복잡함
- 데이터 등록 시 INSERT SQL 두 번 실행
- 조회할 때 조인이 많이 사용되므로 성능 저하될 여지가 있다
단일 테이블 전략
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 사용
장점
- 테이블 1개에 컬럼들이 쭉 들어감.
- insert, select 든 쿼리가 1번에 간결하게 들어감(성능상 이점이 있음)
단점
- 자식 엔티티가 매핑한 컬럼들은 null 허용하는 치명적인 단점이 있음(데이터 무결성 관점에서 애매함)
- 상황에 따라 성능이 오히려 느려질 수 있다
구현 클래스마다 테이블 전략
- 상위 테이블 없애고 그 속성들을 다 밑으로 내림 중복들 허용
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 사용
- @DiscriminatorColumn 이게 있어도 테이블을 사용하지 않기때문에 적용이 되지 않음
- not null 제약 조건을 사용 가능
- 상위클래스로 조회할 시 모든 테이블을 union all로 전부 다 뒤져서 찾게 되서 비효율적임(치명적 단점)
- 쓰면 안되는 전략!!!!!(데이터베이스 설계자와 ORM 전문가 둘 다 추천 X)
- 변경이란 관점에서 볼 때 매우 안좋음(새로운 것을 추가할 때 굉장히 많이 뜯어고쳐야 함)
💡기본적으로 조인 전략을 가지고 가야됨! 조인 장단점 단일 장단점으로 고민해서 선택하면 됨(너무 단순한 경우, 확장 가능성이 별로 없을 거 같을 때)! 구현 클래스는 하지마라!!
@MappedSuperclass
- 매핑 정보만 받는 슈퍼클래스(속성만,, 상속관계는 아님!!)
- Entity X, 테이블과 매핑 X
- 조회, 검색 불가
- 전체 엔티티에서 공통 매핑 정보가 필요할 때 사용
💡 @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능