Spring/스프링 JPA

고급 맵핑

코징 2022. 3. 30. 16:02

상속관계 매핑

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


상속관계 매핑

  • 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
    • 각각 테이블로 변환 > 조인 전략
    • 통합 테이블로 변환 > 단일 테이블 전략
    • 서브타입 테이블로 변환 > 구현 클래스마다 테이블 전략

1) 조인 전략

  • Join을 할 때 @DiscriminatorColumn을 넣지 않으면 DTYPE이 안 들어가게 된다. 이렇게 될 시 객체적으로 볼 때는 문제가 안되지만 DB만을 보게 될 시 어떻게 값이 들어오는지 찾기가 어려워진다. 때문에 조인 전략을 사용 할때@DiscriminatorColumn을 써주자.

장점

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

단점

  • 조회 시 조인을 많이 사용, 서능 저하
  • 조회 쿼리가 복잡함
  • 데이터 저장 시 INSERT SQL 2번 호출

2) 단일 테이블 전략

  • 단일 테이블 전략은 @DiscriminatorColumn이 없어도 DTYPE이 생성된다.
  • 단일 테이블 전략은 내가 앨범, 무비, 북인지 알 수가 없기 때문에 필수로 생성이 된다.

장점

  • 조인이 필요 없다
  • 조회 쿼리가 단순함

단점

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

 

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

사용하면 안 되는 전략

 

장점

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

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL)
  • 자식 테이블을 통합해서 쿼리 하기 어려움

주요 어노테이션

  • @Inheritance(stragegy=InheritanceType.XXX)
    • JOINED: 조인 전략
    • SINGLE_TABLE: 단일 테이블 전략
    • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name="DTYPE")
  • @DiscriminatorValue("XXX")

 


Mapped Superclass

  • 공통 매핑 정보가 필요할 때 사용(id, name)
  • 상속관계 맵핑이 아니다
  • 엔티티가 아니다, 테이블과 매핑하는 게 아니다.
  • 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
  • 조회, 검색 불가(em.find(BaseEntity) 불가)
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장


@MappedSuperclass

  • 테이블과 관계없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
  • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
  • 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능
package helloJpa;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass // 속성을 같이 쓰고 싶다고 할때 사용한다. 공통적으로 사용할 속성을 사용 할 때 쓴다.
public abstract class BaseEntity {

    @Column(name = "INSERT_MEMBER") //이런식으로 변경도 가능
    private String createBy;
    private LocalDateTime createDate;
    @Column(name = "UPDATE_MEMBER") //이런식으로 변경도 가능
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;
package helloJpa;

import javax.persistence.*;

@Entity
public class Member extends BaseEntity {

  	...
}
public class JpaMain {

    public static void main(String[] args) {
       ...
        try {
            Member member = new Member();
            member.setCreateBy("오늘생성..");
            em.persist(member);
결론

@MappedSuperclass는 공통 매핑 정보를 사용할 때 기본적으로 많이 사용되고, 또한 갑작스러운 DBA의 공통으로 DB날짜 insert를 원할 경우에도 많이 사용된다. 기본 속성으로 묶어서 넣어주고 싶을 때 사용하는 것이라고 생각하면 좀 더 편하게 다가온다.

 

이 글은 인프런의

제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편

강사 : 김영한 님의 동영상을 참조해 만들었습니다.

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'Spring > 스프링 JPA' 카테고리의 다른 글

즉시 로딩과 지연 로딩  (0) 2022.03.31
프록시  (0) 2022.03.30
다양한 연관관계 맵핑  (0) 2022.03.29
연관관계 맵핑 기초  (0) 2022.03.28
JPA 엔티티 매핑  (0) 2022.03.25