상속관계 매핑

  • 관계형 데이터베이스에는 상속 관계가 없다.
  • 슈퍼타입-서브타입 관계라는 모델링 기법이 객체의 상속관계와 유사하다.
  • 상속관계 매핑 : 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것


주요 어노테이션

  • @Inheritance(strategy = InheritanceType.XXX)
    • JOINED : 조인전략
    • SINGLE_TABLE : 단일 테이블 전략
    • TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name=”DTYPE”) : 부모 클래스에 구분 칼럼을 지정하고 속성값으로 그 칼럼 이름을 설정하는것
  • @DiscriminatorValue(“XXX”) : 엔티티 저장시 구분 컬럼에 입력할 값을 사용하는것 “xxx”면 부모 클래스의 DTYPE에 xxx가 저장된다.


조인 전략

조인전략1

테이블 형태와 같이 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키를 받아(기본키 + FK )로 사용하는 전략이다.


장점

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

단점

  • 조회시 조인을 많이 사용하므로 성능이 저하된다.
  • 조회하는 쿼리가 복잡하다.
  • 데이터 저장시 INSERT SQL 2번 호출


단일 테이블 전략

단일테이블전략1

말 그대로 테이블을 하나만 사용하는 방식으로 DTYPE과 같이 구분 칼럼으로 어떤 자식 데이터가 저장되었는지를 구분한다.


장점

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

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 NULL을 허용한다.
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서는 조회성능이 오히려 느려질수도 있다.

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

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

구현클래스전략

각각의 테이블을 만드는 전략이다. 보통 ITEM과 PENCIL 의 관계로 예를들면 추상클래스를 상속받은 PENCIL을 각각의 엔티티로 만들어서 사용한다. 유지보수와 변경에 용이하지 않아서 사용하지 않는것 같다.


장점

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

단점

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


MappedSuperclass

mappedSuperclass


  • 공통 매핑 정보가 필요할 때 사용한다. (id or name 등등….)
  • BaseEntity 클래스를 생성해서 공통 매핑 정보를 정의하여 사용한다.
  • 테이블과 매핑되지 않고 자식 클래스에게 매핑 정보를 상속하기 위해 사용한다.
  • @MappedSuperclass로 지정한 클래스는 엔티티가 아니기 때문에 em.find() 또는 JPQL에서 사용할 수없다.
  • @MappedSuperclass로 지정하 클래스를 이용해 객체를 생성해 사용할 일은 거의 없기 때문에 추상 클래스로 만드는것을 권장한다.

😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재 , 블로그


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

개인메모

태그:

카테고리:

업데이트: