[JPA] 상속관계 매핑
객체에는 상속관계가 있지만 관계형 데이터베이스에는 상속 개념이 없다.
대신 슈퍼타입과 서브타입이라는 개념이 상속과 유사하고 상속과 유사하게 사용할 수 있다.
위와 같은 데이터베이스 논리 모델을 물리 모델으로 구현할 때 사용하는 전략으로는 세 가지가 있다.
1. Join
Item Album Movie Book 테이블을 각각 만들고 join으로 데이터베이스를 구성하는 방식이다.
insert를 두 번 하고 조회는 PK FK를 통해 join해서 조회한다.
상속하는 클래스에 @Entity 애너테이션과 함께 @Inheritance(strategy = InheritanceType.JOINED) 애너테이션을 사용해서 구현한다.
DTYPE으로 테이블을 구별할 때는 @DiscriminatorColumn 애너테이션을 사용한다. (상속받는 클래스에서는 @DiscriminatorValue 애너테이션을 사용함)
조회 시 join을 많이 사용해 성능이 저하되지만 저장공간을 효과적으로 사용할 수 있다는 장점이 있다.
깔끔하게 설계할 수 있어 정석으로 사용되는 전략이다.
2. 단일 테이블
논리 모델을 한 테이블로 합치는 전략이다.
DTYPE을 통해 어떤 아이템인지 표시한다.
상속하는 클래스에 @InheritanceType(strategy = SINGLE_TABLE) 애너테이션을 붙여서 사용한다.
테이블 하나에 데이터를 모두 넣어두고 DTYPE을 사용 데이터를 구분하는 방식이다.
@DiscriminatorColumn 애너테이션을 붙이지 않아도 DTYPE이 만들어진다.
일반적으로 다른 전략들보다 쿼리를 조금 사용해 성능이 가장 좋지만, 자식 엔티티의 값으로 null을 허용해 줘야 하고 테이블이 커질 경우 성능이 떨어질 수 있다는 단점이 있다.
3. 구현 클래스 별 테이블
세 가지 테이블만 만들어서 사용한다.
테이블별로 이름이 정해지기 때문에 DTYPE필드를 사용하지 않아도 된다.
상속하는 클래스에 @InheritanceType(strategy = TABLE_PER_CLASS) 애너테이션을 붙여서 사용한다.
이 때 상속하는 클래스는 추상클래스로 설정해 테이블로 생성되지 않도록 한다.
부모 타입으로 데이터를 조회 시 자손 타입을 모두 조회해 봐야 하기 때문에 성능이 좋지 않다.
잘 사용하지 않는 전략이다.
위의 세 가지 모델 모두 데이터베이스 설계에서만 차이가 있고 객체 입장에서는 모두 같은 방식으로 설계된다.
기본적으로는 join전략을 사용하고, 데이터베이스 테이블이 단순하게 떨어지는 경우 단일 테이블 전략을 사용하는 방식을 고려하자.
단순히 애너테이션만 변경함으로써 데이터베이스 테이블을 쉽게 수정할 수 있어 편하다.
모든 테이블에 공통적인 정보가 포함되는 경우가 있다. (게시글로 치면 제목, 내용, 등록 날짜 등)
이런 경우 공통되는 요소를 @MappedSuperClass 애너테이션이 붙은 BaseEntity로 뽑아내서 처리할 수 있다.
BaseEntity는 자식 클래스에게 매핑 정보만 제공하고 조회와 검색은 불가능하다.
실수를 방지하기 위해 추상클래스로 설정해서 사용하자.
'Spring > JPA' 카테고리의 다른 글
[JPA] 영속성의 전이와 고아 객체 (0) | 2022.12.24 |
---|---|
[JPA] 프록시와 연관관계 (0) | 2022.12.24 |
[JPA] 다양한 연관관계 매핑 (0) | 2022.12.22 |
[JPA] 연관관계 매핑 (0) | 2022.12.22 |
[JPA] 객체와 테이블 매핑 (0) | 2022.12.22 |
댓글
이 글 공유하기
다른 글
-
[JPA] 영속성의 전이와 고아 객체
[JPA] 영속성의 전이와 고아 객체
2022.12.24 -
[JPA] 프록시와 연관관계
[JPA] 프록시와 연관관계
2022.12.24 -
[JPA] 다양한 연관관계 매핑
[JPA] 다양한 연관관계 매핑
2022.12.22 -
[JPA] 연관관계 매핑
[JPA] 연관관계 매핑
2022.12.22