[JPA] 연관관계 매핑(2)
본 포스트는 Inflearn
의 김영한님 강의를 바탕으로 작성했습니다.
오늘은 JPA에서 상속관계를 매핑하는 방법에 대해서 알아보자!
상속관계 매핑
관계형 데이터베이스는 상속 관계에 대한 매핑을 따로 지원하지 않는다. 슈퍼타입, 서브타입 관계라는 모델링 기법을 통해서 상속관계를 표현할 수 있다.
슈퍼타입, 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 크게 3가지가 있다. 이 중에서 구현 클래스마다 테이블을 만드는 전략은 실제로 사용되지 않기 때문에 조인 전략
과 단일 테이블 전략
에 대해서 알아보자.
조인 전략
조인 전략은 상속관계를 매핑하는데 가장 많이 사용되는 전략이다. 공통되는 속성들을 하나의 테이블(여기서는 Item)에 넣고 공통되지 않는 고유의 속성들은 각각의 테이블(Album, Movie, Book)에 넣는다. 그리고 조인을 통해서 데이터를 가져온다.
장점
- 테이블이
정규화
된다. 외래키 참조 무결성 제약조건
을 활용가능하다.- 저장공간을 효율적으로 사용할 수 있다.
- 정규화되서 관리되기 때문에 중복되지 않고 잘 관리된다.
단점
- 조회할 때 조인을 많이 사용하기 때문에 약간의 성능 저하가 있다.
- 조인으로 쿼리가 나가기 때문에 복잡하다.
- 각각의 테이블이 있기 때문에 하나를 저장할 때 INSERT SQL이 2번 호출된다.
적용
@Inheritance(strategy = inheritanceType.JOINED)
- 이 에노테이션을 부모 엔티티에 붙여주면 된다.
@DiscriminatorColumn(name="DTYPE")
- 이 에노테이션을 넣으면 슈퍼타입 테이블에 서브타입 테이블의 종류를 표현하는
DTYPE
이라는 컬럼이 생긴다. - JOIN 전략에서는 안넣어줘도 동작하기는 하지만 운영을 편하게 하기 위해서 넣어주는 것이 좋다.
@DiscriminatorValue("xxx")
- DTYPE에 저장되는 타입의 이름을 지정할 수 있는 에노테이션이다.
- 자식 엔티티에 붙여줄 수 있다. 기본값은 클래스 이름이고 기본값을 사용하면 된다.
- 이 에노테이션을 넣으면 슈퍼타입 테이블에 서브타입 테이블의 종류를 표현하는
단일 테이블 전략
단일 테이블 전략은 한 테이블에 자식 엔티티 컬럼까지 다 때려박고 운영하는 방식이다.
###
장점
- 조인이 필요 없어서 일반적으로 조회 성능이 좋다.
- 조회 쿼리가 단순하다.
단점
- 자식 엔티티가 매핑한 칼럼은 모두 null 허용을 해야한다.
- 한 테이블에 모든 속성을 때려박기 때문에 테이블이 커져서 상황에 따라서 조회가 느려질 수 있다.
- 임계점을 넘겨야 느려지는데 이런 경우는 잘 발생하지 않는다.
정리
그래서 어떤것을 사용하면 좋을까?
기본적으로 조인 전략을 사용하고 진짜 단순한 경우에 단일 테이블 전략을 사용하면 된다.
참고 사이트 출처
- https://www.inflearn.com/course/ORM-JPA-Basic/dashboard