[JPA] 상속관계 매핑
상속관계 매핑
- 관계형 데이터베이스에는 상속 관계가 없다.
- 슈퍼타입-서브타입 관계라는 모델링 기법이 객체의 상속관계와 유사하다.
- 상속관계 매핑 : 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것
주요 어노테이션
- @Inheritance(strategy = InheritanceType.XXX)
- JOINED : 조인전략
- SINGLE_TABLE : 단일 테이블 전략
- TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name=”DTYPE”) : 부모 클래스에 구분 칼럼을 지정하고 속성값으로 그 칼럼 이름을 설정하는것
- @DiscriminatorValue(“XXX”) : 엔티티 저장시 구분 컬럼에 입력할 값을 사용하는것 “xxx”면 부모 클래스의 DTYPE에 xxx가 저장된다.
조인 전략
테이블 형태와 같이 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키를 받아(기본키 + FK )로 사용하는 전략이다.
장점
- 테이블의 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간의 효율화
단점
- 조회시 조인을 많이 사용하므로 성능이 저하된다.
- 조회하는 쿼리가 복잡하다.
- 데이터 저장시 INSERT SQL 2번 호출
단일 테이블 전략
말 그대로 테이블을 하나만 사용하는 방식으로 DTYPE과 같이 구분 칼럼으로 어떤 자식 데이터가 저장되었는지를 구분한다.
장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다.
- 조회 쿼리가 단순하다.
단점
- 자식 엔티티가 매핑한 컬럼은 모두 NULL을 허용한다.
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서는 조회성능이 오히려 느려질수도 있다.
구현클래스마다 테이블 전략
이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않는다고 한다.
각각의 테이블을 만드는 전략이다. 보통 ITEM과 PENCIL 의 관계로 예를들면 추상클래스를 상속받은 PENCIL을 각각의 엔티티로 만들어서 사용한다. 유지보수와 변경에 용이하지 않아서 사용하지 않는것 같다.
장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적이다.
- NOT NULL 제약조건 사용가능
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느리다(모든 테이블을 UNION SQL을 통해 조회함)
- 자식 테이블을 통합해서 쿼리하기 어렵다.
MappedSuperclass
- 공통 매핑 정보가 필요할 때 사용한다. (id or name 등등….)
- BaseEntity 클래스를 생성해서 공통 매핑 정보를 정의하여 사용한다.
- 테이블과 매핑되지 않고 자식 클래스에게 매핑 정보를 상속하기 위해 사용한다.
- @MappedSuperclass로 지정한 클래스는 엔티티가 아니기 때문에 em.find() 또는 JPQL에서 사용할 수없다.
- @MappedSuperclass로 지정하 클래스를 이용해 객체를 생성해 사용할 일은 거의 없기 때문에 추상 클래스로 만드는것을 권장한다.
😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재 , 블로그
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
개인메모