기록과 정리

JPA 고급 매핑 전략 + @MappedSuperclass 본문

IT/JPA

JPA 고급 매핑 전략 + @MappedSuperclass

zepetto 2021. 2. 20. 18:51

이 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 강의를 참고하였습니다.

 

www.inflearn.com/course/ORM-JPA-Basic/lecture/21699?tab=curriculum

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

객체의 상속 관계 간에 데이터베이스를 어떻게 매핑을 할까? 

 

관계형 데이터베이스에는 상속관계가 없습닏나. 따라서 슈퍼타입 , 서브타입의 개념을 상속 개념과 유사하게 사용합니다.

이러한 상속개념에는 3가지 방법이 있다고 강의와 책에서 설명하고 있습니다.

 

1. 조인 전략

2. 단일 테이블 전략

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

 

1. 조인 전략

@Inheritance의 옵션 값중 전략을 설정할 수 있습니다. 해당 조인 전략은 테이블의 저장공간을 효유적으로 사용할 수 있는 장점이 있으나 성능 저하의 위험이 있습니다. 그만큼 조인을 많이 사용해서 select 하기 때문입니다. 

2. 단일 테이블 전략

단일 테이블 전략은 하나의 테이블에 관리하는 전략입니다. 하나로 관리하는 만큼 바로바로 체크하고 Select 할 수 있어서 성능상에 이점이 있습니다. 하지만 값이 없는 경우에는 null 을 허용하기 때문에 DB입장에서 치명적인 단점을 가져올 수 있습니다. 대

상 테이블 안에 null 이 존재하면 어떤 버그를 일으킬지 모르기 때문이죠. 또한 컬럼 수가 그만큼 늘어나게 됩니다.

ITEM 테이블에 BOOK , ALBUM, MOVIE 가 전부 존재

컬럼수가 늘어난 만큼 조회 성능은 오히려 늘어질 수도 있지만 실무에서 이런 상황은 거의 안나온다고 강사님께서 말씀하셨습니다. 어떤 경우에 어떤 전략을 쓸지는 3번째 전략을 살펴보고 얘기하겠습니다.

 

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

TABLE_PER_CLASS

해당 전략은 자식 엔티티마다 테이블을 만드는 전략입니다. ITEM 의 자식 엔티티가 BOOK, MOVIE, MEMBER 라면 3개의 엔티티가 생성됩니다. 2번 전략에서 발생한 not null 제약 조건의 문제를 해결할 수는 있으나, 부모 엔티티 데이터 조회시 성능상 느린 단점이 있습니다. Sql Union ALL로 모든 자식 테이블을 전부 뒤져야하기 때문입니다. 복잡한 쿼리 발생이 됩니다. 해당 전략은 부모 엔티티는 실제로 존재하지 않는 테이블이므로 abstract 추상 클래스로 만들어줍니다.

 

해당 전략은 추천하지 데이터베이스 설계자 및 ORM 전문가 모두 추천하지 않는 방식이며 특히 김영한님의 TIP은 조인전략을 기본으로 하되 단순하고 데이터 확장가능성이 낮을때는 단일테이블 전략을 선택하시는걸 추천했습니다.

 

@DiscriminatorColumn

해당어노테이션의 default 는 DTYPE 입니다. 어떤 자식 데이터가 저장이 되었는지 구하는 컬럼을 생성시켜줍니다.

@DiscriminatorValue를 통해 M이라고 지정해준 값이 부모 엔티티(Item)안에 @DiscriminatorColumn을 통해 DB에 위와 같이 저장이 됩니다.

@MappedSuperclass

해당 어노테이션은 상속 매핑과 관련이 없습니다. 단지 공통적으로 사용하는 컬럼을 따로 빼어 관리하기 위해 사용합니다.

공통된 부분을 빼낸 BaseEntity

공통된 작성자, 작성시간, 수정자, 수정시간등을 따로 빼놓아서 원하는 클래스에 상속 받도록합니다. 상속 받은 클래스는 공통 속성값을 받아서 해당 테이블에서 사용할 수 있습니다.

BaseEntity를 상속받은 Member

이상 상속 매핑 전략과 @MappedSuperclass에 대한 정리였습니다.