자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 7. 고급 매핑
CS/김영한 스프링 강의

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 7. 고급 매핑

자바 객체에는 상속 개념이 있지만 db에는 없다.

그래서 마치 상속인것 처럼 사용하는 전략 3가지가 있는데, 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 구현 전략이다.

 

 

 

실습을 위해 한번 만들어보자.

 

일단 이렇게만 하고 돌려보면 jpa의 기본 전략은 한 테이블에 다 때려박는 단일 테이블 전략인걸 알 수 있다.

 

Inheritance로 JOINED를 넣으면 join방식으로 바뀐다.

 

 

저장하는걸 보면 부모가 가지고 있는 정보도 다 가지고 있으면서 자기만의 정보고 가지고 있어야 하기 때문에 정보를 불러오면 join을 해준다. 부모에게서 가져온 id를 자신의 id로 하고 join도 이걸로 한다.

 

사실 DTYPE이 생략되어 있었는데 @DiscriminatorColumn 어노테이션 추가하면 추가된다. 왠만하면 있는게 좋다. 싱글 테이블에선 꼭 들어가야 함. 이름 바꾸기도 가능.

 

 

단일 테이블 전략은 그냥 타입만 바꿔주면 됨. 얘는 DTYPE이 반드시 있어야 하므로 @DiscriminatorColumn이 없어도 DTYPE column이 생긴다.

모두 한 테이블에 박았으니 join같은거 할 필요도 없고 해서 성능상 제일 좋음.

 

각자 테이블 쓰는것도 타입만 바꿔주면 된다. 부모에 있는 모든 속성을 자식이 다 가지고 있어 부모가 필요없기 때문에 부모용 클래스는 생성되지 않음. 물론 @DiscriminatorColumn은 의미없다.

근데 부모로 참조해서 찾을 때 일일이 뒤지기 위해 union 하면서 막 난리남..

 

 

기본적으론 join 전략이 정석이다. 가끔은 단일 테이블이 더 좋을수도 있고.. 구현 클래스는 쓰지 말자. 컬럼이 추가 및 변경될때도 안좋음.

 

 

@MappedSuperclass는 조금 개념이 다른데, 처음부터 다른 테이블이지만 공통된게 좀 겹쳐서 걍 합쳐서 쓰자는 개념. 속성만 가져오는 거라 진짜 테이블이 아닌 추상 테이블로 하자. 

걍 된다.

 

이제 실전을 보자.

싱글 테이블로 해본다.

한 테이블에 잔뜩 들어가 있고 dtype으로 어떤건지 구분한다.

바꾸고 싶으면 타입만 바꾸면 알아서 바뀐다.

 

모든 데이터는 등록일과 ~~~ 어쩌구 하는건 @MappedSuperclass용 BaseEntity 만들어서 상속하면 끝날 일.

 

 

 

처음부터 어떤 매핑을 써야할 지는 일단 join을 해보고 막 하루에 백만건씩 쌓이면 join이 힘들어지니 그때 single table로 바꿔서 json으로 바꾼다던지.. 정말 정답은 없다.