자바 ORM 표준 JPA 프로그래밍(기본편) - 고급 매핑

최준석·2022년 11월 8일
0

고급 매핑


목차

  • 상속관계 매핑
  • @MappedSuperclass

1. 상속관계 매핑

관계형 데이터베이스에는 객체의 상속 관계가 존재하지 않는다. 다만 슈퍼타입과 서브타입 관계라는 모델링 기법이 객체 상속과 유사한데, 객체의 상속구조와 DB의 슈퍼타입 서브타입 관계를 매핑해서 해결 가능하다.

슈퍼타입 서브타입 논리모델을 실제 물리모델로 구현하는 방법 3가지

  1. 각각을 테이블로 변환하는, 조인 전략
  2. 통합 테이블로 변환하는, 단일테이블 전략
  3. 서브타입 테이블로 변환하는, 구현 클래스마다 테이블

주요 어노테이션

  • @Inheritance(strategy = InheritanceType.XXX)

    • JOINED : 조인전략
    • SINGLE_TABLE : 단일 테이블 전략
    • TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name = "DTYPE)

  • @DiscriminatorValue("XXX")

조인 전략

장점

  • 테이블을 정규화 하므로 무결성 보장가능
  • 외래키를 참조하는 무결성 제약조건을 활용가능하다
  • 저장공간을 효율적으로 사용할 수 있다

단점

  • 조회시 조인을 많이사용해 조인비용 증가
  • 조회시 쿼리가 복잡하다
  • 데이터 저장시 ISNERT 쿼리를 2번 호출한다

단일 테이블 전략

장점

  • 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다
  • 조회 쿼리가 단순하다

단점

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

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

위 두 전략이 DB 설계자와 ORM 전문가 둘 중 하나에 편향적이었다면 이 전략은 양쪽다에게 추천되지 않는다

장점

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

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 느리다(UNION SQL 필요)
  • 자식 테이블을 통합해서 쿼리하기 어렵다

2. @MappedSuperclass

공통된 매핑정보가 필요할 때 사용한다

상속관계 매핑이 아니며, 엔티티도 테이블과 매핑되는 것도 아니다. 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공하는 클래스이며, 조회와 검색이 불가능하다(em.find(BaseEntity) 불가). 직접 생성해서 사용할 일이 업으므로 추상 클래스로 구현하는것이 권장된다. 테이블과 관계없이 단순히 엔티티가 공통으로 사용하는 매핑정보를 모으는 역할이며, 주로 등록일, 수정일, 등록자, 수정자 가타은전체 엔티티에서 공통적으로 적용하는 정보를 모을 때 사용한다.

참고)

@Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속가능하다.

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
(자바 ORM 표준 JPA 프로그래밍 - 기본편)

profile
Back-End Web Developer

0개의 댓글