enginner_s2eojeong

[자바 ORM 표준 JPA 프로그래밍] 07. 고급 매핑 본문

Backend/Database

[자바 ORM 표준 JPA 프로그래밍] 07. 고급 매핑

_danchu 2025. 5. 5. 15:25


1. 상속관계 매핑이란?

  • 관계형 데이터베이스에는 객체지향의 상속 개념이 존재하지 않음
  • 대신, 슈퍼타입-서브타입 관계로 모델링할 수 있음
  • JPA에서는 객체의 상속 구조를 데이터베이스에 맞춰 매핑할 수 있는 방법을 제공

JPA에서는 상속 구조를 테이블로 옮기기 위한 3가지 전략을 제공하고 있다.


2. 상속 매핑 전략 3가지

JPA에서 상속 매핑을 설정하려면 @Inheritance(strategy = ...) 어노테이션을 사용.

2.1 조인 전략 (JOINED)

  • 슈퍼타입과 서브타입을 각각 테이블로 매핑
  • 조인을 통해 하나의 객체 완성
@Inheritance(strategy = InheritanceType.JOINED)

장점

  • 테이블 정규화
  • 외래키 무결성 제약조건 사용 가능
  • 저장 공간 효율적

단점

  • 조회 시 조인 연산이 많아져 성능 저하
  • 복잡한 조회 쿼리
  • 저장 시 INSERT 두 번 호출

2.2 단일 테이블 전략 (SINGLE_TABLE)

  • 모든 엔티티를 하나의 테이블에 저장
  • 구분 컬럼(DTYPE)을 통해 타입 구분
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")

장점

  • 조회 시 조인 불필요, 성능 우수
  • 쿼리가 단순함

단점

  • 불필요한 null 컬럼 다수
  • 테이블이 커져 조회 성능 저하 가능

2.3 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS)

  • 자식 엔티티마다 각각 테이블 생성
  • 공통된 부모 필드는 자식 테이블마다 포함됨
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

장점

  • 서브타입을 확실히 분리 가능
  • NOT NULL 제약조건 가능

단점

  • 자식 테이블 간 통합 조회가 어려움 (UNION 필요)
  • 성능 저하 우려

대부분의 경우 조인 전략 또는 단일 테이블 전략을 사용한다.

 

3. @MappedSuperclass - 공통 필드 상속을 위한 방법

비즈니스 상속관계와 달리, 단순히 공통 매핑 정보(id, 등록일 등)만 상속하고 싶을 때는 @MappedSuperclass를 사용한다.

@MappedSuperclass
public abstract class BaseEntity {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

특징

  • 엔티티로 매핑되지 않음 → 테이블 X
  • 공통 매핑 정보를 자식 엔티티에 전달
  • em.find(BaseEntity.class) 불가
  • 보통 추상 클래스로 선언

등록일, 수정일, 등록자 등 공통 필드를 재사용할 때 매우 유용하다.