이 글은 2021년 5월에 작성되었으며 블로그를 이전하며 옮기게 되었습니다.
시작하기 앞서 저의 글에 대한 피드백이나 지적은 언제나 환영입니다 😊
상속관계 매핑
- 관계형 데이터베이스는 상속관계 X
- 슈퍼 타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
- 상속관계 매핑 : 객체의 상속과 DB의 슈퍼 타입 서브타입 관계를 매핑
슈퍼 타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 법
- 각각 테이블로 변환 -> 조인전략
- 통합 테이블로 변환 -> 조인 전략
- 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
@주요 어노테이션
- @Inheritance(strategy=InheritanceType.XXX)
- JOINED : 조인 전략
- SINGLE_TABLE : 단일 테이블 전략
- TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name=“DTYPE”)
- default: DTYPE DTYPE이라는 Column이 super class의 table에 생기고,
DTYPE의 값은 sub class의 이름으로 지정된다. - SingleTable 전략에서 없어도 DTYPE 이 생성되기도 하는데, 그래도 운영상 써주자
- 이 어노테이션은 상위 클래스(Item)에서 명시된다. 데이터베이스의 상위 테이블(Item 테이블)에게 구분자 역할을 DTYPE 컬럼을 넣어준다. 애노테이션의 name 속성으로 컬럼명을 바꿔줄 수 있다(이름 속성으로 쓰자).
- @DiscriminatorValue(“XXX”)
- 이 어노테이션은 하위 클래스(ALBUM, MOVIE, BOOK)에서 사용된다. 상위 테이블(ITEM 테이블)을 조회할 때 DTYPE 컬럼에 사용되는 value를 설정해주는 기능이다. 애노테이션을 사용하지 않을 경우 기본 Default 값인 Entity 이름으로 value값이 채워지게 된다.
- default: classname
조인 전략
Item 엔티티는 abstract(추상) 클래스로 만든다! 자식 엔티티 클래스에서 Item엔티티를 상속받는다.
장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용 가능
- 저장공간 효율화
단점
- 조회 시 조인을 많이 사용(성능 저하)
- 조회 쿼리가 복잡하다
- 데이터 저장 시 insert쿼리문 2번 호출
단일 테이블 전략
장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다
- 조회 쿼리가 단순하 다단점
- 자식 엔티티가 매핑한 컬럼은 모두 null허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있음 (상황에 따라 조회 성능이 오히려 느려질 수 있음)
구현 클래스마다 테이블 전략
이 전략은 데이터베이스 설계자와 개발자 둘 다 추천하지 않는 방법이다 (알아만 두자)
장점
- 서브타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리가 어려움
@MappedSuperclass
- 공통 매핑 정보가 필요할 때 사용한다(id, name)
- 상속관계 매핑 X
- 엔티티 X, 테이블과 매핑 X
- 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
- 조회, 검색 불가
em.find(BaseEntity)
(불가) - 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
정리
- 테이블과 관계없고, 단순이 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
- 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
- 참고 :
@Entity
클래스는 엔티티나@MappedSuperclass
로 지정한 클래스만 상속 가능
결론
조인 전략 or 단일 테이블 전략 중에 고민해보고 결정하자.
기본적으로 가장 객체지향적인 조인 전략을 선택하고
테이블 컬럼 수가 굉장히 적고 가볍다면 단일 테이블 전략을 선택해보는 것도 나쁘지 않은 선택인 것 같다.
'JPA' 카테고리의 다른 글
JPA 값타입 (0) | 2022.03.25 |
---|---|
JPA 프록시와 연관관계 관리 (0) | 2022.03.25 |
JPA 다양한 연관관계 매핑 (0) | 2022.03.25 |
JPA 연관관계 매핑과 연관관계 주인 (0) | 2022.03.25 |
JPA 영속성 컨텍스트란? (0) | 2022.03.25 |
댓글