JPA

상속관계 매핑 전략(@DiscriminatorColumn 란?)

쿠카이든 2022. 6. 5. 12:28
728x90
  •  통합 테이블로 변환하는 단일 테이블 전략(SINGLE_TABLE)

  • 서비스 규모가 크지 않고, 굳이 조인 전략을 선택해서 복잡하게 갈 필요가 없다고 판단 될 때에는 한 테이블에 다 저장하고, DTYPE으로 구분하는 단일 테이블 전략을 선택할 수 있다.
  • INSERT 쿼리도 한 번, SELECT 쿼리도 한 번이다. 조인할 필요가 없고, 성능이 좋다.
  • 단일 테이블 적용
    • 아래와 같이, strategy를 SINGLE_TABLE로 변경하면 끝난다.
      • JPA의 장점이다. 테이블 구조의 변동이 일어났는데, 코드를 거의 손대지 않고 어노테이션만 수정했다.
      • 만약 JPA를 쓰지 않았더라면, 테이블 구조의 변경이 일어나면 거의 모든 코드를 손대야 할 것이다.
    • 단일 테이블 전략에서는 @DiscriminatorColumn을 선언해 주지 않아도, 기본으로 DTYPE 컬럼이 생성된다.
    • 한 테이블에 모든 컬럼을 저장하기 때문에, DTYPE 없이는 테이블을 판단할 수 없다.
@Entity
@DiscriminatorColumn
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private String name;
   private int price;
}
  • 실행된 DDL
    • 통합 테이블이 하나 생성된다.
    Hibernate: 
        create table Item (
           DTYPE varchar(31) not null,
            id bigint generated by default as identity,
            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)
        )
    • 조인 전략에서 실습했던 Movie 저장, 조회 예제를 그대로 돌려보면?
      • Item 테이블을 그냥 조회한다. 조인하지 않고, DTYPE을 검색 조건으로 추가해서 Movie를 조회
      • @DiscriminatorColumn(DTYPE)인 Movie를 기준으로 한 테이블에 item 정보를 조회할 수 있다.
Hibernate:
   select
      movie0_.id as id2_0_0_,
      movie0_.name as name3_0_0_,
      movie0_.price as price4_0_0_,
      movie0_.actor as actor8_0_0_,
      movie0_.director as director9_0_0_
   from
      Item movie0_
   where
      movie0_.id=?
       and movie0_.DTYPE='Movie'

 

출처: https://ict-nroo.tistory.com/128

728x90