상속관계 매핑
- 관계형 데이터베이스는 상속 관계X
- 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.
- 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 - 서브타입 관계를 매핑하는 것.
- 슈퍼타입 - 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
- 각각 테이블로 변환 => 조인 전략
- 통합 테이블로 변환 => 단일 테이블 전략
- 서브타입 테이블로 변환 => 구현 클래스마다 테이블 전략
- 모든 방법은 객체는 상속을 지원하기 때문에 객체 입장에서는 다 같다.
- 조인 전략 : 각 테이블을 구성하고 필요한 경우 조인을 통해 데이터를 가져오는 방식.
- ex) 부모 테이블과 자식 테이블을 따로 만들어서 FK를 통해 필요한 데이터는 JOIN을 통해서 가져오는 방식이며 ITEM 부모 테이블에서는 NAME, PRICE 컬럼만으로 어느 자식 테이블의 내용인지 구분할 수 없기에 DTYPE과 같은 컬럼으로 구분해준다.
- 단일 테이블 전략 : 서브타입 논리 모델을 한 테이블로 합치는 방식
- ex) 자식 테이블(ALBUM, MOVIE, BOOK)을 각각 따로 만들지 않고 한 테이블 안에 다 합쳐서 만드는 방식으로 DTYPE과 같은 컬럼으로 자식을 구분할 수 있도록 한다.
- JPA의 기본 전략은 단일 테이블 전략이다.
- 단일 테이블 전략에서 자식 테이블을 구분하는 DTYPE은 필수적이다.
- 구현 클래스마다 테이블 전략 : 공통 내용을 따로 빼지 않고 (공통 테이블을 별도로 만들지 않고) 각각 테이블마다 공통 테이블의 내용을 가지는 방식
- ex) Item이라는 공통 테이블을 별도로 만들지 않고 부모의 공통 내용(ITEM_ID, NAME, PRICE)을 자식 테이블(ALBUM, MOVIE, BOOK)마다 각각 가진다.
- 실제로 사용하면 안되는 전략
- 주요 어노테이션
- 부모 클래스(인터페이스)에 @Inheritance(strategy=InheritanceType.XXX) 사용
- @Inheritance(strategy=InheritanceType.SINGLE_TABLE) : 단일 테이블 전략
- @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) : 구현 클래스마다 테이블 전략
- @Inheritance(strategy=InheritanceType.JOINED) : 조인 전략
- @DiscriminatorColumn : DTYPE 컬럼을 생성해서 어느 자식 타입인지 구분할 수 있다.
- @DiscriminatorValue("XXX") : 별도로 지정하지 않을 경우 자식 엔티티명 그대로 반영된다.
- 부모 클래스(인터페이스)에 @Inheritance(strategy=InheritanceType.XXX) 사용
- 조인 전략 장/단점
- 장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
- 단점
- 조회시 조인을 많이 사용, 성능 저하
- 조회 쿼리가 복잡함
- 데이터 저장시 INSERT 쿼리 2번 호출
- 장점
- 단일 테이블 전략 장/단점
- 장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다
- 조회 쿼리가 단순하다
- 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있고 상황에 따라 조회 성능이 오히려 느려질 수 있다.
- 장점
- 실무에서 사용 시 단일 테이블 전략, 조인 전략 중에만 고민하면 된다.
- 조인 전략을 기본으로 하되 단순하고 확장할 일이 없는 경우 단일 테이블 전략을 사용
@MappedSuperclass
- @MappedSuperclass : 공통 매핑 정보(속성, 필드)가 필요할 때 사용한다.
- ex) 주로 등록일, 수정일, 수정자 등 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
- 상속관계 매핑x, 엔티티x, 테이블과 매핑x => 테이블과 관계가 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
- @MappedSuperclass 부모 타입으로 조회, 검색 불가
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
- JPA에서 상속은 @Entity가 있거나 @MappedSuperclass로 지정한 클래스만 상속 가능하다.
출처: [인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편]
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com
'Spring > [인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편]' 카테고리의 다른 글
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 값 타입 (0) | 2024.08.23 |
---|---|
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 프록시와 연관관계 관리 (0) | 2024.08.23 |
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 다양한 연관관계 매핑 (0) | 2024.08.22 |
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 연관관계 매핑 기초 (0) | 2024.08.20 |
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 엔티티 매핑 (1) | 2024.08.20 |