상속관계 Mapping
계속해서 DB와 OOP의 패러다임 문제가 발생하는데, 이번에는 상속문제이다
OOP는 상속을 중요시하기에 언어적으로 완벽히 지원해준다
하지만 RDB는 상속을 일부 지원하긴 하지만 완벽히 지원해주지 않는다
대신 슈퍼타입과 서브타입이란걸 지원해주는데
JPA는 이 상속문제를 해결하는 3가지 전략을 제공한다
- 조인 전략
- 단일 테이블 전략
- 구현 클래스마다 테이블 전략
부모 클래스에 다음과 같은 Annotation을 붙여주면 된다
@Entity
@Inheritance(strategy=InheritanceType.XXX)
public class Parent {
}
@Entity
public class Children1 extends Parent{
}
따라서 테이블 전략을 바꾸더라도 전체 코드를 바꾸는것이 아닌,
jpa를 사용하게 되면 Annotation만 바꿔주면 된다!
조인 전략
ITEM 테이블에도 ITEM_ID를 가지고, 하위 테이블들인 ALBUM, MOVIE, BOOK에도 동일한 ITEM_ID를 두어,
무슨 ITEM인지 확인할 수 있게 해준다.
이때 Optional하게 DTYPE이라는 새로운 Column을 만들어
자신이 무슨 Type의 ITEM인지 빠르게 확인할 수 있게 해준다.
DTYPE이 없으면 모든 ITEM_ID를 갖는 테이블들이 join 대상이 되지만,
DTYPE으로 1차적으로 filter하게 되면 join 대상이 확 줄어든다는 이점이 있다.
DTYPE을 만들어 주려면 @DiscriminatorColumn을 사용한다
@Entity
@Inheritance(strategy=InheritanceType.XXX)
@DiscriminatorColumn(name="DTYPE")
public class Parent {
}
장단점을 정리해보자면 다음과 같다
장점
- 테이블 정규화
- FK 참조 무결성 제약조건 활용 가능
- 저장공간 효율화(상속)
단점
- 조회시에 JOIN으로 가져와야하기 때문에 성능 저하
- 조회 쿼리가 복잡(내 코드 말고 로그에 찍히는 쿼리)
- 데이터 저장시 INSERT가 1번이 아닌 2번 호출
- ITEM Table에도 넣어줘야 하고 하위 Table에도 넣어줘야하기 때문
하지만 이 전략이 3가지 전략중에서 제일 낫다고 한다. 성능상의 이슈도 그렇게 문제가 되지 않고
제일 깔끔하기 때문
단일 테이블 전략
하나의 Table에 몽땅 때려넣는 무식한 방식
하지만 JPA는 기본(default) 전략으로 이 전략을 채택했다
DB가 비지니스에 크게 연관되어있지 않고 중요하지 않으면 이 방법도 괜찮다고 한다
장점
- JOIN이 필요없으므로 조회 성능이 빠름
- 조회 쿼리가 단순
단점
- Null이 허용되는 Column이 생긴다
- 단일 테이블에 모든것을 저장하므로 테이블이 커질 수 있음. 그에 따라 조회 성능이 느려질수도?
구현 클래스마다 테이블 전략
마지막으로 구현 클래스마다 테이블을 만드는 전략이다.
ITEM_ID에 있던 NAME과 PRICE가 각각의 구현 테이블로 내려온것을 볼 수 있다
언뜻 보면 제일 괜찮은것 같지만 코드 변경에 유연하지 못하다는 단점을 가지고 있다.
장점
- Not Null 제약조건 사용 가능
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION 때문)
- 자식 테이블을 통합해서 Query하기 어려움
조인 전략을 잘 이용하자!
Mapped Superclass
요놈은 공통 매핑 정보가 필요할 때 사용하는 클래스이다.
Base Entity라는 Mapped Superclass를 만들고
Member와 Seller라는 Entity들이 상속받게 만들면
속성을 상속받아 실제 DB Table에도 적용된다
이때 Mapped Superclass는 실제 DB에 매핑되는 Entity가 아니며 따라서 Entity라고 볼 수 없다
따라서 EntityManager.find() 같은 메소드로 가져올수도 없다.
또한 그 자체로 사용되는일이 거의 없기 때문에 관례상 abstract로 선언한다고 한다
주로 등록일, 수정일, 등록자, 수정자 같은 모든 Table이 가지고 있어야 하는 속성을
이 Mapped Superclass로 올려서 전체적으로 관리한다고 한다
출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'Back-End > JPA' 카테고리의 다른 글
[JPA] 7. 값 타입 (0) | 2022.08.12 |
---|---|
[JPA] 6. 프록시와 Cascade 및 고아 객체 (0) | 2022.08.04 |
[JPA] 4. Entity간의 연관관계 Mapping (0) | 2022.07.30 |
[JPA] 3. Entity Mapping (0) | 2022.07.21 |
[JPA] 2. Persistent에 대한 이해 (0) | 2022.07.20 |