본문 바로가기
스프링/JPA

JPA 상속 관계 (TABLE_PER_CLASS전략)

by 공부 안하고 싶은 사람 2021. 5. 21.
반응형

배치 스케줄을 JPA로 리팩토링하는 과정 중, 스키마가 동일한 Table 4개가 있어

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)으로

abstract 부모 클래스를 만들어 작업? 해보기로 했다.

(일반적으로 SINGLE_TABLE/JOINED 전략이 더 권장되지만, 이미 생성된 테이블이므로..)

 

같은 스키마와, 같은 역할을 하는 테이블이기에 generic을 이용해 JpaRepository를 하나만 생성하도록 꼼수?를 부려봤다.

어림없지Service도 jeneric으로 생성하여 중복 코드를 줄여보고자 했지만, 오히려 구조만 어려워지고, 결과적으론 JpaRepository부터 generic생성을 못하기 때문에 포기하였다. 다른 패턴으로 해결 할 수 있는지 확인필요

 

문제점 1 .

실행 시, global temporary table 생성

상속관계 최적화를 위해 사용됨

https://www.inflearn.com/questions/112738

 

JOINED전략 시 GLOBAL TEMPORARY TABLE HT_ 생성 문의 - 인프런 | 질문 & 답변

안녕하세요. 강사님 수업 잘 듣고 있습니다. JOINED전략을 사용하여 ITEM, ALBUM 등을 실습하고 있습니다. H2 dialect 옵션:

 

문제점 2.

select 시 상속받은 전체 테이블을 union한 뒤 where 조건 검사 -> 성능저하 ( JpaRepository generic 포기)

public interface XXXRepository<T extends XXX> extends JpaRepository<T, Long>

어떤 테이블의 클래스인지 알 수 없으므로 모든 테이블을 union한다.

 

문제점 3.

insert시 각 테이블별 sequence 사용 불가능 -> 상속구조 포기

서로 다른 sequence를 사용중이었으나, 위 구조에선 sequence를 전부 등록하지 못했다.(4개 중 가장 최신등록된 sequence만 사용됨)

-> sequence전략이 아닌 table전략으로 sequence를 사용하면 해결할 수 있어보였지만, 이미 sequence를 여러 곳에서 사용중이므로 변경 불가, 시퀀스가 아닌 자동증가면 사용할 수 있을것으로 보인다.(orcle...)

 

적용할 수 있는 경우

  1. TABLE_PER_CLASS 일반적으로 상속구조에서 가장 비추인 전략이지만, 이미 DB가 그렇게 설계된 상태라면
  2. 로직에서 select가 없거나
  3. sequence를 이용하지 않는 insert만 있다면

JpaRepository를 generic하게 생성하여 코드 수를 줄일 수 있다.

728x90
반응형

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

복합키  (0) 2021.05.26
전체 컬럼 매핑은 필수? DB default값  (0) 2021.05.26
JPA 활용 1  (0) 2021.04.23
JPA 활용 2  (0) 2021.04.23
자바 ORM 표준 JPA  (0) 2021.04.16

댓글