상속관계 매핑
2021. 1. 19. 22:58ㆍJPA/JPA
상속관계 매핑
- 관계형 데이터베이스는 상속관계를 기술적으로 지원하지 않는다.
- 하지만 슈퍼타입과 서브타입이라는 모델링 기법으로 상속관계를 설계할 수 있다.
- 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략 이렇게 3가지 전략이 있다.
@Inheritance(strategy=InheritanceType.XXX)
- 부모 클래스에 설정한다.
- 부모 클래스는 상황에 맞게 Abstract 추상 클래스로 만들어 사용.
InheritanceType.JOINED
- 조인 전략
- 부모 클래스에 맞는 슈퍼타입 테이블이 생성되고 자식 클래스에 맞는 서브타입 테이블이 생성된다.
장점
- 테이블 정규화
- 외래키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
단점
- 조회시 조인을 많이 사용
- 데이터 저장시 INSERT SQL 2번 호출
InheritanceType.SINGLE_TABLE
- 단일테이블 전략
- 하나의 테이블에 모든 컬럼을 생성하여 관리한다.
장점
- 조회시 조인이 필요없어 성능이 좋다.
단점
- 자식 엔티티가 매핑한 컬럼은 모두 null이 허용된다.
- 자식 엔티티가 많아질수록 테이블이 커져 상황에 따라 조회 성능이 오히려 느려질 수 있다.
InheritanceType.TABLE_PER_CLASS
- 구현 클래스마다 테이블 전략
- 슈퍼타입 테이블은 생성하지 않고 서브타입 테이블마다 슈퍼타입의 공통된 컬럼들을 전부 생성한다.
- 실무에서 사용하면 여러 문제점이 있어 사용하지 않는다.
장점
- 서브 타입을 명확하게 구분해서 사용할 때 효과적
- NOT NULL 제약조건을 사용할 수 있다.
단점
- 여러 서브타입 테이블을 함께 조회할때 성능이 느림(UNION 필요)
- 서브타입 테이블을 통합해서 쿼리하기 어려움
@DiscriminatorColumn(name=“DTYPE”)
- 부모 클래스에 설정한다.
- 조인 전략에 사용할 경우 어떤 서브타입의 데이터인지 구분하는 컬럼(DTYPE)이 생성된다.
- 단일 테이블 전략은 해당 어노테이션을 설정하지 않아도 테이블에 DTYPE이 생성된다.
@DiscriminatorValue(“XXX”)
- 자식 클래스에 설정한다.
- DTYPE에 들어갈 타입 데이터를 지정할 수 있다.
- 기본값은 엔티티명이다.
@MappedSuperclass
- 부모 클래스에 설정
- 자식 클래스의 공통된 필드를 제공할 때 사용(수정자, 수정일, 등록자, 등록일 등..)
- 해당 부모 클래스는 엔티티가 아니여서 테이블과 매핑도 안되고 엔티티로서 다룰수가 없다.
- 직접 생성해서 사용할 일이 없어서 Abstract 추상 클래스로 설정을 권장한다.
- 참고로 엔티티는 @Entity나 @MappedSuperclass로 설정된 클래스만 상속받을 수 있다.
'JPA > JPA' 카테고리의 다른 글
cascade, orphanRemoval (0) | 2021.01.20 |
---|---|
지연로딩과 즉시로딩 (0) | 2021.01.20 |
연관관계 매핑 (0) | 2021.01.19 |
기본키 매핑 어노테이션 정리 @Id, @GeneratedValue, @SequenceGenerator, @TableGenerator (0) | 2021.01.18 |
컬럼 매핑 어노테이션 정리 @Column, @Temporal, @Enumerated, @Lob, @Transient (0) | 2021.01.18 |