관리 메뉴

Rootable의 개발일기

상속 관계 매핑 본문

JPA

상속 관계 매핑

dev-rootable 2023. 8. 16. 19:57

관계형 데이터베이스에서는 슈퍼타입과 서브타입을 통해 상속 관계를 대체한다.

 

슈퍼타입과 서브타입

 

이러한 슈퍼타입과 서브타입이라는 논리 모델을 실제 물리 모델로 구현하는 방법들을 살펴보자

 

📌 조인 전략

 

슈퍼타입 - 조인 전략

 

부모(슈퍼타입)와 자식(서브타입)을 각각 테이블로 변환하여, 각자가 가진 필드를 통해 참조하는 전략이다. 가장 논리적이고 객체 지향적인 방법으로 비즈니스적으로
중요도가 높게 사용된다.

 

조인 전략 엔티티 설계

 

아래와 같이 서브타입에 이름을 지정하면 데이터베이스에 해당 이름으로 필드에 저장된다.

 

서브타입 - 조인 전략
변경 전(좌), 변경 후(우)

 

🔎 특징

 

  • 서브타입을 구분하는 컬럼(DTYPE)을 슈퍼타입이 가짐
  • 슈퍼타입의 PK = 서브타입의 PK이면서 FK

 

🔎 장단점

 

✔ 장점

 

  • 테이블 정규화가 되어 중복을 줄일 수 있다.
  • 외래키 참조 무결성 제약 조건을 활용할 수 있다.
    • 다른 테이블에서 슈퍼타입 엔티티만 살펴보면 서브타입 엔티티에 값이 있는지 알 수 있다.
  • 중복이 적으므로, 저장 공간을 효율적으로 관리할 수 있다.

 

💡 외래키 참조 무결성

외래키는 널이거나 참조할 수 없는 값을 가질 수 없다.

 

✔ 단점

 

  • 조회 시, 조인을 많이 사용하기 때문에 성능 저하가 있을 수 있다. (실제 영향 미미함)
  • 조회 쿼리 시 복잡
  • 데이터 저장 시, INSERT 쿼리가 2번 호출된다. (실제 영향 미미함)

 

📌 단일 테이블 전략

 

슈퍼타입 - 단일 테이블 전략

 

모든 서브타입의 컬럼을 슈퍼 타입 테이블에 넣는 전략으로 통합 테이블로 관리하기 때문에 단순하거나 확장 가능성이 없을 때 종종 사용한다.

 

단일 테이블 전략 엔티티 설계

 

DB 저장 결과

 

🔎 특징

 

  • 서브타입 구분용 컬럼 존재
  • @DiscriminatorColumn 필수
    • 테이블이 통합되어 있어 구분 컬럼이 필요하기 때문

 

🔎 장단점

 

✔ 장점

 

  • INSERT 쿼리가 적게 나가고, 조인을 하지 않으므로 조회 성능이 빠르다.
  • 조회 쿼리가 단순

 

✔ 단점

 

  • 자식 엔티티가 매핑한 컬럼은 모두 null을 허용하게 된다.
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커져 상황에 따라 조회 성능이 오히려 느려질 수 있다.

 

📌 구현 클래스마다 테이블 전략(권장 x)

 

슈퍼타입 - 구현 클래스마다 테이블 전략

 

슈퍼타입 없이 각 서브타입이 슈퍼타입의 컬럼을 가지는 전략

 

서브타입들을 통합하는 테이블이 없기 때문에 정산과 같은 기능을 수행하려면 각 서브타입을 모두 돌려봐야 한다. 따라서, 실무에서 권장하지 않는 전략이다.

 

구현 클래스마다 테이블 전략 엔티티 설계

 

DB 저장 결과

 

🔎 장단점

 

✔ 장점

 

  • 서브타입을 명확하게 구분해서 처리할 때 효과적
  • NOT NULL 제약 조건 사용 가능

 

✔ 단점

 

  • 여러 자식 테이블을 함께 조회할 때 UNION SQL을 사용해야 하므로 조회 속도가 느리다.
    • 공통 PK를 합치는 것과 같은 공통으로 묶어내는 작업이 필요함
  • 자식 테이블을 통합해서 쿼리 하기 어렵다.
    • 자식 테이블 사이에 외래키가 없어 공통 PK를 통해 접근해야 하기 때문에 접근성이 떨어진다.

 

Reference:

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

성장하는 IT인의 축제! 인프콘 2023 개최를 함께 기념해요 ❤️

www.inflearn.com

 

'JPA' 카테고리의 다른 글

즉시 로딩과 지연 로딩  (0) 2023.08.17
프록시(Proxy)  (0) 2023.08.17
연관 관계 매핑  (0) 2023.08.15
객체와 테이블 매핑  (0) 2023.08.15
영속성 관리  (0) 2023.08.12