JPA의 상속 관계 매핑

JooHeon·2021년 11월 15일
0
post-custom-banner

🖊 객체 중심 설계와 테이블 중심 설계의 차이

  • 관계형 데이터베이스는 상속 관계가 존재하지 않는다.
  • JPA는 상속 관계를 객체 상속과 유사한 슈퍼타입 서브타입 관계 모델링 기법에 매핑한다.

🖊 슈퍼타입 서브타입 관계를 물리 모델로 구체화하는 전략

  1. 조인 전략
    (1) 슈퍼타입과 서브타입으로 각각의 테이블을 따로둔다
    (2) 슈퍼타입 테이블에 서브타입 테이블의 정보(DTYPE)를 추가한다.
    (3) 서브타입 테이블의 정보를 가져갈 때 (2)의 정보와 조인을해서 데이터를 가져온다.
    장점 : 정규화가 되어있다. 외래 키 참조 무결성 제약조건 활용가능, 저장공간 효율화
    단점 : 조회시 쿼리가 복잡하고 조인을 많이 사용 (비교적 성능↓)

  2. 단일 테이블 전략
    (1) 하나의 테이블에 모든 상속관계를 다 넣어둔다.
    (2) 서브타입 정보를 알 수 있는 정보(DTYPE)를 추가한다.
    장점 : 조회 쿼리가 단순하고 빠르다.
    단점 : 자식 엔티티가 매핑한 컬럼은 모두 NULL 허용, 상황에 따라 성능↓

  3. 구현 클래스마다 테이블 전략
    (1) 구현 클래스에 저장되어있는 정보로 각각 테이블을 만든다.
    안 쓰는 전략

객체 입장에서는 무슨 전략을 선택하던지 영향을 받지 않는다.

🖊 실제 코드 예제


@Entity
@Inheritance(strategy = InheritanceType.~)
@DiscriminatorColumn //DTYPE
public class Parent{
	...
}
@Entity
@DiscriminatorColumn
public class Child extends Parent{
	...
}
	...
 Child child = new Child();
 child.set(...);
 em.persist(child);
        ...

🖊 Mapped Superclass

중복되는 속성을 모아놓은 클래스에 @MappedSuperClass를 달아두고 
사용할 클래스에서 상속받아놓으면 간단하게 중복코드를 줄일 수 있다.

이 클래스는 Entity가 아니고 매핑 정보만 제공할 뿐이다.
따라서 이 클래스를 직접 사용 할 일이 없으므로 추상 클래스로 만들어두는 게 권장된다.
post-custom-banner

0개의 댓글