고급 매핑

이상훈·2022년 10월 4일
0

Jpa

목록 보기
6/17

김영한님의 인프런 강의 '자바 ORM 표준 JPA 프로그래밍'을 참고했습니다.

상속 관계 매핑

  • 객체 : 상속
  • 관계형 데이터베이스 : 슈퍼타입 서브타입
    (관계형 데이터베이스에는 상속이라는 개념이 없다.)

🤔 상속 관계 매핑 : 데이터베이스의 슈퍼타입 서브타입 관계 모델을 객체의 상속 구조와 매핑하는 것.

👆 데이터베이스의 슈퍼타입 서브타입 논리 모델


주요 어노테이션

  • @Inheritance(strategy=InheritanceType.XXX) : 부모 클래스에서 매핑 전략을 지정한다.

    • JOINED : 조인 전략

    • SINGLE_TABLE : 단일 테이블 전략

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

  • @DiscriminatorColumn(name=“DTYPE”) : 부모 클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분할 수 있다. 기본값이 DTYPE이므로 @DiscriminatorColumn으로 줄여 사용해도 된다.

  • @DiscriminatorValue(“XXX”) : 엔티티를 저장할 때 구분 컬럼에 입력할 값을 지정한다. 만약 영화 엔티티를 저장하면 구분 컬럼인 DTYPE에 값 XXX가 저장된다.


1. 조인 전략

조인 전략은 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다.

  • 장점
    • 테이블 정규화
    • 외래 키 참조 무결성 제약조건 활용 가능
    • 저장 공간 효율화
  • 단점
    • 조회시 조인을 많이 사용, 성능 저하
    • 조회 쿼리가 복잡함
    • 데이터 저장시 INSERT SQL 2번 호출

2. 단일 테이블 전략

단일 테이블 전략은 이름 그대로 테이블을 하나만 사용한다. 그리고 구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분한다.

  • 장점
    • 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
    • 조회 쿼리가 단순함
  • 단점
    • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 가능해야 함

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

구현 클래스마다 테이블 전략은 자식 엔티티마다 테이블을 만든다. 그리고 자식 테이블 각각에 필요한 컬럼이 모두 있다.

  • 장점
    • 서브 타입을 명확하게 구분해서 처리할 때 효과적
    • not null 제약조건 사용 가능
  • 단점
    • 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
    • 자식 테이블을 통합해서 쿼리하기 어려움

결론

  • 구현 클래스마다 테이블 전략은 쓰지 말자!! 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않는다.❌❌

  • 조인 전략과 단일 테이블 전략을 가지고 무엇을 쓸지 결정하자. 보통 조인 전략을 기본으로 깔고

    • if 관계가 단순 -> 단일 테이블 전략!!
    • if 관계가 복잡, 비즈니스적으로 중요 -> 조인 전략!!

@MappedSuperclass

@MappedSuperclass데이터베이스랑은 상관없고 그냥 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아준다.

  • 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할(주로 등록일, 수정일, 등록자, 수정자 등)
  • 상속관계 매핑 X
  • 엔티티 X, 테이블과 매핑 X (테이블 생성 안됨)
  • 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
  • 조회, 검색 불가(em.find(BaseEntity) 불가)
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
@MappedSuperclass
public abstract class BaseEntity {

	@Id @GeneratedValue
    private Long id;
    private String name;
    ...
}

@Entity
public class Member extends BaseEntity {

	//ID 상속
    //NAME 상속
    private String email;
    ...
}

@Entity
public class Seller extends BaseEntity {

	//ID 상속
    //NAME 상속
    private String shopName;
    ...
}

✔️ 참고
@Entity 클래스는 엔티티나 @MappedSuperclass로 지
정한 클래스만 상속 가능.

@MappedSuperclass는 실무에서 많이 사용함.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글