본문 바로가기

framework/jpa

[JPA] 상속관계 매핑, mappedSuperclass

상속관계 매핑이란 ?

관계형 데이터베이스는 상속 관계가 존재하지 않는다.

슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.

상속관계 매핑 : 객체의 상속, 구조와 DB의 슈퍼타입 서브타입 관계를 매핑

JPA에서 기본전략으로 하나의 테이블(Rollup)이 생성된다.

 

슈퍼타입 서브타입 관계

슈퍼타입 서브타입 테이블 구조

주요 어노테이션

@Inheritance(strategy = InheritanceType.XXXX

  • JOINED : 조인 전략
  • SINGLE_TABLE : 단일 테이블 전략
  • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략

@DiscriminatorColumn(name = "DTYPE")

  • 어떤 엔티티 객체와 연결되는지 확인하기 위해 사용한다.
  • 조인전략에서 필수는 아니지만(테이블을 조인하여 확인할 수 있다) 편의성을 위해 사용하는게 좋고,
  • 단일 테이블 전략에서는 작성하지 않으면 default값이 들어간다.
  • default : DTYPE

@DiscriminatorValue("XXX")

  • @DiscriminatorColumn에서 설정한 컬럼의 엔티티별 값을 설정한다.
  • default: Entity name

 

조인 전략

조인 전략 ERD
Item Class
Item을 상속받는 Movie Class
실행 결과

조인 전략을 사용하므로 각각의 테이블(Item, Movie)가 생성된다.

또한 @DiscriminatorColumn 설정에 따라 DTYPE 컬럼이 생성되고, @DiscriminatorValue 설정에 따라 "Movie" 값이 입력된다.

MOVIE 테이블의 ITEM_ID 컬럼은 PK이면서 FK로 설정된다.

MOVIE 테이블 생성

장점

정규화가 되어있다.

제약조건을 슈퍼테이블 하나로 관리할 수 있다.

외래키 참조 무결성 제약조건 활용이 가능하다.

저장공간의 효율화가 가능하다.

단점

조회시 조인을 많이 사용하므로 성능이 저하된다.

조회 쿼리가 복잡해진다.

데이터 저장시 INSERT SQL이 두번 호출된다.

 

단일 테이블 전략

단일 테이블 전략 ERD
Item Class

@Inheritance의 strategy의 값만 변경하면 동작한다.

@DiscriminatorColumn의 값으로 어떤 엔티티인지 구분하고, 동작한다.

실행 결과

장점

조인이 필요 없으므로 일반적으로 조회 성능이 빠르다.

조회 쿼리가 단순하다.

단점

자식 엔티티가 매핑한 컬럼은 모두 null이 허용되어야 한다.

단일 테이블에 모든 데이터를 저장하므로 테이블의 크키가 커질 수 있고, 상황에 따라 조회 성능이 더 느려질 수 있다.

 

현 클래스마다 테이블 전략

현 클래스마다 테이블 전략 ERD

이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않는 방법이다.

장점

서브 타입을 명확하게 구분해서 처리할 때 효과적이다.

not null 제약조건 사용 가능하다

단점

여러 자식 테이블을 함께 조회할 때 성능이 느리다.

자식 테이블을 통합해서 쿼리하기 어렵다.(예를 들면 price를 통한 정산을 할 때)

 

@MappedSuperclass

데이터베이스와 상관없이 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.

주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통적으로 적용하는 정보를 모을 때 사용한다.

  • 상속관계, 엔티티, 테이블과 매핑되지 않는다.
  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.
  • 조회, 검색이 불가능하다(em.find(BaseEntity) 불가)
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 사용을 권장한다.

 

mappedSuperclass인 BaseEntity Class

@MappedSuperclass이 설정된 클래스를 Entity에서 상속받으면 된다.

실행 결과

'framework > jpa' 카테고리의 다른 글

[JPA] 엔티티 매핑 3  (0) 2023.04.23
[JPA] 엔티티 매핑 2  (0) 2023.04.09
[JPA] 엔티티 매핑 1  (0) 2023.04.08
[JPA] 기본 사용 방법  (0) 2023.04.07
[JPA] JPA 사용 이유 및 개념 정리  (0) 2023.04.07