상속관계 매핑

2021. 1. 19. 22:58JPA/JPA

상속관계 매핑

  • 관계형 데이터베이스는 상속관계를 기술적으로 지원하지 않는다.
  • 하지만 슈퍼타입과 서브타입이라는 모델링 기법으로 상속관계를 설계할 수 있다.
  • 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략 이렇게 3가지 전략이 있다.

@Inheritance(strategy=InheritanceType.XXX)

  • 부모 클래스에 설정한다.
  • 부모 클래스는 상황에 맞게 Abstract 추상 클래스로 만들어 사용.

InheritanceType.JOINED

  • 조인 전략
  • 부모 클래스에 맞는 슈퍼타입 테이블이 생성되고 자식 클래스에 맞는 서브타입 테이블이 생성된다.

장점

  1. 테이블 정규화
  2. 외래키 참조 무결성 제약조건 활용가능
  3. 저장공간 효율화

단점

  1. 조회시 조인을 많이 사용
  2. 데이터 저장시 INSERT SQL 2번 호출

InheritanceType.SINGLE_TABLE

  • 단일테이블 전략
  • 하나의 테이블에 모든 컬럼을 생성하여 관리한다.

장점

  1. 조회시 조인이 필요없어 성능이 좋다.

단점

  1. 자식 엔티티가 매핑한 컬럼은 모두 null이 허용된다.
  2. 자식 엔티티가 많아질수록 테이블이 커져 상황에 따라 조회 성능이 오히려 느려질 수 있다.

InheritanceType.TABLE_PER_CLASS

  • 구현 클래스마다 테이블 전략
  • 슈퍼타입 테이블은 생성하지 않고 서브타입 테이블마다 슈퍼타입의 공통된 컬럼들을 전부 생성한다.
  • 실무에서 사용하면 여러 문제점이 있어 사용하지 않는다.

장점

  1. 서브 타입을 명확하게 구분해서 사용할 때 효과적
  2. NOT NULL 제약조건을 사용할 수 있다.

단점

  1. 여러 서브타입 테이블을 함께 조회할때 성능이 느림(UNION 필요)
  2. 서브타입 테이블을 통합해서 쿼리하기 어려움

@DiscriminatorColumn(name=“DTYPE”)

  • 부모 클래스에 설정한다.
  • 조인 전략에 사용할 경우 어떤 서브타입의 데이터인지 구분하는 컬럼(DTYPE)이 생성된다.
  • 단일 테이블 전략은 해당 어노테이션을 설정하지 않아도 테이블에 DTYPE이 생성된다.

@DiscriminatorValue(“XXX”)

  • 자식 클래스에 설정한다.
  • DTYPE에 들어갈 타입 데이터를 지정할 수 있다.
  • 기본값은 엔티티명이다.

@MappedSuperclass

  • 부모 클래스에 설정
  • 자식 클래스의 공통된 필드를 제공할 때 사용(수정자, 수정일, 등록자, 등록일 등..)
  • 해당 부모 클래스는 엔티티가 아니여서 테이블과 매핑도 안되고 엔티티로서 다룰수가 없다.
  • 직접 생성해서 사용할 일이 없어서 Abstract 추상 클래스로 설정을 권장한다.
  • 참고로 엔티티는 @Entity나 @MappedSuperclass로 설정된 클래스만 상속받을 수 있다.