TIL_20250425_JPA 상속 관계 매핑

Kim jisu·2025년 4월 25일

TIL

목록 보기
37/43

JPA에서 상속 관계 매핑은 객체 지향의 상속 개념을 관계형 데이터베이스에 효과적으로 매핑하는 방법을 제공합니다. @Inheritance 어노테이션을 사용하여 구현할 수 있으며, 크게 세 가지 전략이 있습니다.

1. 조인 전략 (InheritanceType.JOINED)

부모 클래스와 자식 클래스를 각각의 테이블로 매핑하고, 조인을 통해 함께 조회하는 방식입니다.

구현 방식:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE") // 구분 컬럼
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

@Entity
@DiscriminatorValue("A") // 구분 값
public class Album extends Item {
    private String artist;
}

@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
    private String director;
    private String actor;
}

장점:

  • 테이블이 정규화되어 있습니다.
  • 외래 키 제약조건으로 참조 무결성이 보장됩니다.
  • 저장공간을 효율적으로 사용합니다.
  • 객체 지향적 설계와 가장 잘 맞는 전략입니다.

단점:

  • 조회 시 조인이 필요하여 성능이 저하될 수 있습니다.
  • 조회 쿼리가 복잡해집니다.
  • 데이터 등록 시 INSERT SQL이 부모, 자식 테이블 각각 실행됩니다 (총 2번).

2. 단일 테이블 전략 (InheritanceType.SINGLE_TABLE)

모든 자식 클래스를 하나의 테이블에 통합하여 매핑하는 방식입니다. 구분 컬럼(DTYPE)으로 어떤 자식 엔티티인지 구분합니다.

구현 방식:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

@Entity
@DiscriminatorValue("A")
public class Album extends Item {
    private String artist;
}

@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
    private String director;
    private String actor;
}

장점:

  • 조인이 필요 없어 조회 성능이 빠릅니다.
  • 조회 쿼리가 단순합니다.
  • 하나의 테이블만 사용하므로 관리가 단순합니다.

단점:

  • 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 합니다.
  • 테이블이 커질 수 있어 오히려 조회 성능이 느려질 수 있습니다.
  • 단일 테이블에 모든 컬럼이 있어 서브타입마다 불필요한 컬럼도 함께 저장됩니다.

3. 구현 클래스마다 테이블 전략 (InheritanceType.TABLE_PER_CLASS)

자식 클래스마다 별도의 테이블을 만들고, 각 테이블에 필요한 컬럼을 모두 포함하는 방식입니다.

구현 방식:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
}

@Entity
public class Album extends Item {
    private String artist;
}

@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}

장점:

  • 서브 타입을 구분해서 처리할 때 효과적입니다.
  • not null 제약조건을 사용할 수 있습니다.
  • 각 타입마다 최적화된 테이블 구조를 가질 수 있습니다.

단점:

  • 여러 자식 테이블을 함께 조회할 때 UNION을 사용해야 해서 성능이 느립니다.
  • 자식 테이블을 통합해서 쿼리하기 어렵습니다.
  • 추후 컬럼 변경 시 모든 테이블을 수정해야 합니다.
  • 상속 관계 매핑 전략 중 가장 비추천되는 방식입니다.

실무 권장사항

  • 기본적으로 조인 전략을 사용하는 것이 객체지향 설계와 데이터 무결성 측면에서 좋습니다.
  • 단순한 도메인이나 확장 가능성이 낮은 경우, 조회 성능이 중요하다면 단일 테이블 전략을 고려할 수 있습니다.
  • 구현 클래스마다 테이블 전략은 여러 문제가 있어 가급적 사용하지 않는 것이 좋습니다.
  • 대부분의 JPA 구현체는 조인 전략과 단일 테이블 전략을 효율적으로 지원하고 있습니다.
profile
Dreamer

0개의 댓글