DB의 슈퍼타입 서브타입 관계를 JPA에서는 객체의 상속 관계로 풀어낼 수 있다
아래 세 가지 전략 중 조인 전략을 기본으로 사용하고, TABLE PER CLASS 전략은 사용하지 않도록 하는 것이 좋다
상속 관계 (세 가지 전략 모두 상속 관계는 동일)
부모 클래스 - Item 엔티티
자식 클래스 - Album, Movie, Book 엔티티
1. 조인 전략 - 기본
상속 전략 - @Inheritance(strategy = InheritanceType.JOINED)
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
private Long id;
... 생략
}
- 조회 시 ITEM_ID 로 조인해서 조회
- 부모 엔티티에서 @DiscriminatorColumn 어노테이션이 있어야 부모 테이블에 DType 컬럼 생성
컬럼이름 지정하려면 name 속성 추가, 컬럼에 들어가는 값은 기본이 자식 엔티티 이름
- 자식 엔티티에서 @DiscriminatorValue 어노테이션으로 DiscriminatorColumn에 들어갈 값 지정할 수 있음
ex. @DiscriminatorColumn("A")
# 장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능
- 저장공간 효율화
# 단점
- 조회 시 조인 많이 사용, 성능 저하
- 조회 쿼리 복잡
- 데이터 저장 시 INSERT SQL 2번 호출(부모 테이블 1번, 자식 테이블 1번)
2. 단일 테이블 전략 - 진짜 단순할 때
상속 전략 - @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item {
@Id @GeneratedValue
private Long id;
... 생략
}
- @DiscriminatorColumn 어노테이션 없어도 DTYPE 컬럼 생성됨(어떤 엔티티인지 구분하려면 반드시 필요하니까)
# 장점
- 조인 필요 없음. 일반적으로 조회 성능 빠름
- 조회 쿼리 단순
# 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용해야함
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있음. 상황에 따라서 조회 성능이 오히려 느려질 수 있음
3. 구현 클래스마다 테이블 전략 - 쓰지 말자 후회할 날이 반드시 온다
상속 전략 - @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id @GeneratedValue
private Long id;
... 생략
}
- Item 클래스를 추상 클래스로 만들어줘야한다 (Item 테이블 생성 안 함)
# 장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
# 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION ALL)
- 자식 테이블을 통합해서 쿼리하기 어려움
ex.
em.find(Movie.class, movie.getId()) 로 조회할 경우 movie 테이블에서만 조회
em.find(Item.class, movie.getId()) 로 조회할 경우 Item 클래스를 상속받은 자식 클래스 전부 union all로 조회해서 찾음
인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편(김영한 강사님) 강의를 수강하며 정리한 글입니다 :)
'개발 > JPA' 카테고리의 다른 글
[JPA] 지연 로딩 LAZY , 즉시 로딩 EAGER (0) | 2022.04.06 |
---|---|
[JPA] 프록시 (0) | 2022.04.06 |
[JPA] 영속성 컨텍스트 / 엔티티의 생명주기 (0) | 2022.03.31 |
[JPA] Spring Data JPA - Query Method / 쿼리 메소드 / 간단한 쿼리는 쿼리 메소드 사용하면 편리 (0) | 2022.01.20 |
[JPA] Querydsl 조회 결과 DTO에 담는 법 / 예문 (0) | 2022.01.20 |
댓글