고급 매핑

유동우·2023년 8월 1일
0
post-thumbnail

상속관계 매핑

상속관계 매핑은 크게 3 가지

- @Inheritance(strategy = InheritanceType.JOINED)
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

1. 조인 전략
2. 싱글테이블 전략
3. 구현 클래스마다 테이블 전략

JPA에서 DB의 상속관계를 매핑하고 싶은경우, 단순히 자식클래스에 extends만 붙인다면

 create table Item (
       DTYPE varchar(31) not null,
        id bigint not null,
        name varchar(255),
        price integer not null,
        artist varchar(255),
        author varchar(255),
        isbn varchar(255),
        actor varchar(255),
        director varchar(255),
        primary key (id)
    )

위와 같이 싱글테이블(한 테이블에 모두 때려박음) 형식으로 생성된다


조인 전략

부모클래스에

@Inheritance(strategy = InheritanceType.JOINED)

어노테이션을 추가하면, 싱글테이블이 아닌 조인을 활용한 테이블로 나뉘게 된다.

이후 부모클래스만 조회에서 어떤 자식클래스인지 식별하기 위해서

@DiscriminatorColumn

어노테이션을 추가하면 , 부모클래스만을 조회하여 어떤 자식테이블의 데이터가 있는지 확인이 가능하다.
(싱글테이블 전략은 이 어노테이션을 추가하지 않아도 자동으로 추가가 되어있다.. 생각해보면 당연히 자동으로 추가가 되어 있어야 자식들간 구분이 가능하기 때문)

조인 전략의 장점

  • 테이블이 정규화되어 있다
  • 외래키 참조 무결정 제약조건 활용가능 (ex 주문 테이블에서 찾을때 아이템(부모)만 찾으면 된다)
  • 저장공간의 효율화

조인 전략의 단점

  • 조회시 조인을 많이 사용하여 성능 저하 및 조회 쿼리가 복잡하다. (많이 저하되지는 않음)

기본적으로 조인 전략이 객체랑 잘 맞기 때문에 정석이다


싱글테이블 전략

** 싱글 테이블의 장점 ** - 조인이 필요없으므로 일반적으로 조회 성능이 빠르다 - 조회 쿼리가 단순하다

싱글 테이블의 단점

  • 자식 엔티티가 매핑한 칼럼은 모두 null을 허용한다
  • 오히려 테이블이 커져서 상황에 따라 조회성능이 느려질수도 있다.

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

(얘는 쓰지 말자)

부모클래스의 속성까지 물려받아서 fit하게 movie 클래스에만 값이 저장된다.
-> 굉장히 좋아보이지만 별로일 수 있다...
(Item 객체도 생성하지 않는다)

부모클래스를 통해 찾을 경우

Item item = em.find(Item.class, movie.getId());
System.out.println("item = " + item);

모든 자식클래스를 union all 하여 값을 찾는다 ..


정리

조인 전략 vs 싱글 테이블 전략 중 무엇을 사용할지 고민하면 된다.

Mapped SuperClass - 매핑 정보 상속

전체적으로 공통적인 속성을 사용하고 싶은 경우 사용

@MappedSuperclass
public class BaseEntity {

    @Column(name = "INSERT_MEMBER")
    private String createdBy;
    
    private LocalDateTime createdDate;
    
    @Column(name = "UPDATE_MEMBER")
    private String lastModifiedBy;
    
    private LocalDateTime lastModifiedDate;
    ...
}

이후 Member, Team 클래스에서 extends BaseEntity를 해주면 끝

주의

  • 상속관계 매핑이 아니다
  • 엔티티가 아니고, 테이블과 매핑 할 수 없다
  • 자식 클래스에 "매핑 정보"만 제공한다
  • 조회, 검색(em.find(BaseEntity) 가 불가능하다)
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장한다

정리

extends를 사용할 경우의 매핑은 두 가지

@Entity -> 상속관계 매핑
@MappedSuperClass -> "속성"만 상속

실무에서 굉장히 편하게 사용할 수 있다

실전 예제 4 - 상속관계 매핑

Reference
김영한 님 - 자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
효율적이고 꾸준하게

0개의 댓글