본 정리 내용은 "김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편" 을 듣고 정리한 내용이며, 중요한 내용이 판단된 부분은 강의자료의 사진자료를 사용하였습니다.
1. 상속관계 매핑
관계형 데이터베이스는 상속관계가 없다. 그나마 비슷한 모델은 슈퍼타입 서브파입 관계라는 논리 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑은 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다.
주요 애노테이션
1. @Inheritance(strategy = InheritanceType.xxx)
JOIND : 조인전략 - 가장 정규화된 데이터베이스 모델.
장점 :
- 가장 정규화된 데이터베이스 모델이다.
- 외래키 참조 무결성 제약조건을 활용 가능하다.
- 저장공간이 효율적이다.
단점 :
- 조회시 조인을 많이 사용하여 성능이 저하된다.
- 조회 쿼리가 복잡하다.
- 데이터 저장 시 INSERT SQL을 2번 호출한다.
SINGLE_TABLE : 단일 테이블 전략 - 한개의 테이블에 모두 다 집어 넣고 DTYPE으로 구분한다.
장점 :
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다.
- 조회 쿼리가 단순하다.
단점 :
- 자식 엔티티가 매핑한 컬럼은 모두 null을 허용한다.
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수도 있다.
TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 - 슈퍼타입 테이블을 없애고 슈퍼타입에 속성들이 서브타입의 속성들로 중복되어서 들어간다.
장점 :
- 서브 타입을 명확하게 구분해서 처리할 때 효과적이다.
- not null 제약조건을 사용가능하다.
단점 :
- 여러 자식 테이블을 함께 조회할 때 성능이 느리다.(UNION SQL이 필요)
- 자식 테이블을 통합해서 쿼리하기 어렵다.
- 최대한 사용을 하지 말자.
@DiscriminatorColumn(name="DTYPE")
DTYPE이라는 컬럼을 추가하여 어떤 서브타입 테이블의 데이터가 들어왔는지 쉽게 파악이 가능하다.
@DiscriminatorValue("xxx")
서브타입 객체의 DTYPE 필드 value를 바꿀 수 있다.
2. @MappedSuperclass
공통 매핑 정보가 필요할 때 사용한다. 공통 속성만 부모클래스에 두고 상속하여 사용하고 싶을 때 사용한다. DB 입장에서는 똑같은데 객체 입장에서 속성만 상속받아서 사용하는 것이다.
테이블과 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할이며, 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
참고 : @Entity 클래스는 엔티티나 @MappedSuperClass로 지정한 클래스만 상속가능
특징
- 상속관계 매핑이 아니다.
- 엔티티가 아니므로 테이블과 매핑이 되는것이 아니다.
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만을 제공하는 것이다.
- 조회, 검색이 불가하다.(em.find()불가)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장한다.
위와 같이 @MappedSuperclass 애노테이션을 붙인 클래스를 만들고 extends를 이용하여 상속받아서 사용하면 된다. BaseEntity는 @MappedSuperclass이기 때문에 테이블이 생성되지는 않는다.
'JAVA > Spring JPA' 카테고리의 다른 글
JPA의 값 타입 (0) | 2022.01.05 |
---|---|
JPA의 프록시와 연관관계 관리 (0) | 2022.01.03 |
다양한 연관관계 매핑 (0) | 2021.12.29 |
단방향 연관관계와 양방향 연관관계 (0) | 2021.12.28 |
엔티티 매핑 (0) | 2021.12.25 |