본문 바로가기
개발/JPA

[JPA] 상속관계 매핑 - 상속 전략

by Allonsy 2022. 4. 6.
반응형

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 프로그래밍 - 기본편(김영한 강사님) 강의를 수강하며 정리한 글입니다 :)

반응형

댓글