JPA
상속 관계 매핑
dev-rootable
2023. 8. 16. 19:57
관계형 데이터베이스에서는 슈퍼타입과 서브타입을 통해 상속 관계를 대체한다.
이러한 슈퍼타입과 서브타입이라는 논리 모델을 실제 물리 모델로 구현하는 방법들을 살펴보자
📌 조인 전략
부모(슈퍼타입)와 자식(서브타입)을 각각 테이블로 변환하여, 각자가 가진 필드를 통해 참조하는 전략이다. 가장 논리적이고 객체 지향적인 방법으로 비즈니스적으로
중요도가 높게 사용된다.
아래와 같이 서브타입에 이름을 지정하면 데이터베이스에 해당 이름으로 필드에 저장된다.
🔎 특징
- 서브타입을 구분하는 컬럼(DTYPE)을 슈퍼타입이 가짐
- 슈퍼타입의 PK = 서브타입의 PK이면서 FK
🔎 장단점
✔ 장점
- 테이블 정규화가 되어 중복을 줄일 수 있다.
- 외래키 참조 무결성 제약 조건을 활용할 수 있다.
- 다른 테이블에서 슈퍼타입 엔티티만 살펴보면 서브타입 엔티티에 값이 있는지 알 수 있다.
- 중복이 적으므로, 저장 공간을 효율적으로 관리할 수 있다.
💡 외래키 참조 무결성
외래키는 널이거나 참조할 수 없는 값을 가질 수 없다.
✔ 단점
- 조회 시, 조인을 많이 사용하기 때문에 성능 저하가 있을 수 있다. (실제 영향 미미함)
- 조회 쿼리 시 복잡
- 데이터 저장 시, INSERT 쿼리가 2번 호출된다. (실제 영향 미미함)
📌 단일 테이블 전략
모든 서브타입의 컬럼을 슈퍼 타입 테이블에 넣는 전략으로 통합 테이블로 관리하기 때문에 단순하거나 확장 가능성이 없을 때 종종 사용한다.
🔎 특징
- 서브타입 구분용 컬럼 존재
- @DiscriminatorColumn 필수
- 테이블이 통합되어 있어 구분 컬럼이 필요하기 때문
🔎 장단점
✔ 장점
- INSERT 쿼리가 적게 나가고, 조인을 하지 않으므로 조회 성능이 빠르다.
- 조회 쿼리가 단순
✔ 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null을 허용하게 된다.
- 단일 테이블에 모든 것을 저장하므로 테이블이 커져 상황에 따라 조회 성능이 오히려 느려질 수 있다.
📌 구현 클래스마다 테이블 전략(권장 x)
슈퍼타입 없이 각 서브타입이 슈퍼타입의 컬럼을 가지는 전략
서브타입들을 통합하는 테이블이 없기 때문에 정산과 같은 기능을 수행하려면 각 서브타입을 모두 돌려봐야 한다. 따라서, 실무에서 권장하지 않는 전략이다.
🔎 장단점
✔ 장점
- 서브타입을 명확하게 구분해서 처리할 때 효과적
- NOT NULL 제약 조건 사용 가능
✔ 단점
- 여러 자식 테이블을 함께 조회할 때 UNION SQL을 사용해야 하므로 조회 속도가 느리다.
- 공통 PK를 합치는 것과 같은 공통으로 묶어내는 작업이 필요함
- 자식 테이블을 통합해서 쿼리 하기 어렵다.
- 자식 테이블 사이에 외래키가 없어 공통 PK를 통해 접근해야 하기 때문에 접근성이 떨어진다.
Reference:
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard