[3] JPA 프로그래밍 (8) - 상속 관계 매핑 / @MappedSuperclass

김정욱·2021년 3월 8일
0

[3] JPA 프로그래밍

목록 보기
8/15
post-thumbnail
post-custom-banner

상속 관계 매핑

[ Intro ]

  • RDB에는 상속관계가 없다
  • 객체의 상속과 유사한 관계가 바로 슈퍼타입-서브타입 모델링 기법
  • 슈퍼타입-서브타입모델을 실제 물리 모델로 구현하는 3가지 방법이 존재
    • 조인 전략 : 각각 테이블로 변환
    • 단일 테이블 전략 : 하나의 통합 테이블로 변환
    • 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환

조인(JOIN) 전략

[ 설명 ]

  • 하위 Table을 구별하는 Column(DTYPE)을 두고, 사용시 해당 Column으로 JOIN하는 방법
  • 실제 객체의 상속과 가장 유사
  • 정규화를 통해 디테일한 구조를 만들 수 있음

[ 사용 ]

(Item.java)

  • 슈퍼타입에 해당하는 Item객체를 추상화 클래스로 만든다
    (TABLE_PER_CLASS전략에서는 필수지만 다른 전략은 필수는 아님)
    --> 추상화 클래스로 한다는 것은 단독적으로 쓰지 않는다는 것을 의미!
  • @Inheritance를 사용해서 stategyJOINED로 설정
  • 자동으로 하위 Table을 구분하기 위한 DTYPE라는 Column이 생성
  • @DiscriminatorColumn 옵션으로 DTYPE 말고 이름을 지정할 수 있음
  • @DiscriminatorValueDTYPE에 들어가는 Value를 바꿀 수 있음
    (하위 Table에 해당하는 Entity에 추가해야 함)
/* 하위 테이블을 구분하는 컬럼을 DTYPE으로 설정 */
@DiscriminatorColumn(name = "DTYPE")
/* DTYPE의 Value가 ALBUM으로 설정 -- Album.java에 추가해야 함 */
@DiscriminatorValue("ALBUM")

(Album.java)

  • 서브타입에 해당하는 Entity에서 extends로 상속받는다

[ 장&단점 ]

  • 장점
    • 테이블 정규화
    • 외래키 참조 무결성 제약조건 활용 가능
      --> 외래키를 통한 쿼리 등 사용 가능
    • 저장공간 효율화
  • 단점
    • 조회시 조인을 많이 사용, 성능 저하
      --> 실무에서는 이러한 저하보다 장점의 이득이 많은 경우가 많음
    • 조회 쿼리가 복잡
    • 데이터 저장시 INSERT SQL 2번 호출

단일 테이블 전략

[ 설명 ]

  • 슈퍼타입을 기준으로 하나의 Table로 통합해버리는 방식
  • 하위 객체임을 구분하는 DTYPE이 기본적으로 들어감
    (@DiscriminatorColumn 할 필요가 없음)
    --> 그래야 하위 객체를 구분하기 때문
  • @Inheritance기본전략

[ 사용 ]

  • JOIN 전략에서 strategy만 바꾸어주면 됨
/* Default가 SINGLE TABLE 전략이라서 생략해도 된다 */
@Inheritance
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

[ 장&단점 ]

  • 장점
    • 조인이 필요없음 --> 조회 성능이 빠름
    • 조회 쿼리가 단순
  • 단점
    • 자식 Entity가 매핑한 컬럼은 모두 null 허용해야 함
      --> 데이터 무결성 입장에서 볼때
      null이 허용되는 컬럼이 많으면 좋지 않을 수 있음
    • 하나에 모든것을 저장하므로, 상황에 따라 조회성능이 오히려 느려질 수 있음
      --> 보통 이러한 임계값을 넘기지 않아서 괜찮다

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

[ 설명 ]

  • 서브타입을 기준으로 슈퍼타입속성을 모두 삽입해주는 방식

[ 사용 ]

  • 슈퍼타입에 해당하는 객체를 반드시 추상클래스로 생성(필수)
    abstract class
  • JOIN 전략에서 strategy만 바꾸어주면 됨
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

[ 장&단점 ]

  • 장점
    • 서브타입을 명확하게 구분해서 처리할때 효과적
    • not null제약조건 사용 가능
  • 단점
    • 여러 자식 테이블 함께 조회시 성능이 느리다
      --> 모든 테이블을 union해서 가져오기 때문에 비효율적
    • 자식 테이블을 통합해서 쿼리하기 어렵다
  • 결과적으로 이 방법은 실무에서 절대 사용하지 않는 것을 권장

@MappedSuperclass

[ 설명 ]

  • DB와 상관없이 중복되는 속성들을 상속받아 편리하게 사용하기 위한 것
  • 중요한 것은 DB 연관관계에 영향을 주지 않는다는 것
  • 단순 정보 제공 목적
  • 직접 생성해서 사용할 일이 없으므로 추상클래스 권장
  • 주로 등록일 / 수정일 / 등록자 / 수정자 같은 전체 엔티티 공통 정보를 모을 때 사용
  • 참고 : @Entity@Entity@Mappedsuperclass만 상속 가능

[ 사용 ]

(BaseEntity.java)

  • 보통 BaseEntity라는 이름으로 추상 클래스를 생성
  • 필요한 속성 정의

(Member.java)

  • 필요한 객체에서 extends로 상속

[ 결과 ]

  • 이런식으로 공통된 속성들이 Column으로 들어간다

정리

  • RDB에는 상속이 없으므로, 이와 비슷한 슈퍼타입-서브타입 모델링을 사용
  • 슈퍼타입-서브타입을 실제 물리 모델로 구현하는 방법은 3가지
    • 조인 전략 : 각각 테이블로 변환
    • 단일 테이블 전략 : 하나의 통합 테이블로 변환
    • 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환
  • 보통 조인 전략을 기본으로 사용
    --> 객체의 상속과 가장 유사한 논리로 구성할 수 있음
  • 필요에 따라 단일 테이블 전략을 사용해 성능을 올리기도 함
  • 구현 클래스마다 테이블 전략은 절대 사용하지 않는 것을 권장!
profile
Developer & PhotoGrapher
post-custom-banner

0개의 댓글