상속 관계일 경우 맵핑

정병웅·2024년 5월 19일
0

JPA

목록 보기
4/4

자바에서의 상속 개념을 데이터베이스에 적용을 시키기 위해서는 어떻게 하는 방법들이 있는지 인프런 김영한 강사님의 강의를 들으며 개인적으로 정리한 글입니다.

상속 관계 맵핑이란?

자바의 객체 지향에서는 상속이라는 것이 존재한다. 슈퍼 타입이 있고 슈퍼 타입과 관련된 서브타입이 존재하는 방식이다.
하지만 관계형 데이터베이스에는 상속의 개념은 존재하지 않는다.따라서 JPA에서는 객체 지향의 관점과 관계형 데이터 베이스에서 상속 관계 일 경우 맵핑을 지원해준다.

상속 관계 맵핑 전략

객체마다 테이블 정의(조인 전략)

부모 클래스에서 PK를 정의하고, 자식 클래스에서 부모의 PK를 외래키로 사용하는 전략이다.

구현

부모 클래스

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TYPE")
public class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private String price;
}

자식 클래스

@Entity
@DiscriminatorValue("A")
public class Album extends Item{
    private String artist;
}

@Inheritance(strategy = InheritanceType.JOINED)

  • 부모 클래스에 정의
  • JPA에서 데이터를 insert 할 때, 부모객체와 자식객체에 함께 insert를 함.
  • select 할 때, 연관 관계 테이블을 join 하여 조회

@DiscriminatorColumn(name = "TYPE")

  • 슈퍼타입 테이블에서 서브타입 테이블의 타입을 구분할 수 있게 컬럼을 생성한다.
    name 속성을 사용하면 해당 칼럼에 별도 값을 지정할 수 있다.

@DiscriminatorValue("A")

  • 슈퍼타입 테이블의 @DiscriminatorColumn에 정의된 칼럼에 값을 넣을지 지정할 수 있다.
    속성 값은 해당 칼럼에 별도 값을 지정한다. 기본은 class 명을 지정

장점

  • 테이블 정규화
  • 외래키 참조 무결성 제약조건 활용
  • 저장공간 효율화

단점

  • 조회 시 조인을 많이 사용하여 성능 저하
  • insert 쿼리가 2번 호출 됨
  • 조회 쿼리가 복잡함

통합 테이블 정의(단일 테이블 전략)

테이블을 하나만 생성하여 부모객체, 자식객체를 데이터베이스에서는 구분을 하지 않는 전략

부모 클래스

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE")
public class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private String price;
}

자식 클래스

@Entity
@DiscriminatorValue("A")
public class Album extends Item{
    private String artist;
}

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

  • strategy 속성을 'InheritanceType.SINGLE_TABLE' 로만 정의하면 끝난다.
  • @DiscriminatorColumn(name = "TYPE")은 생략해도 JPA 에서 자체적으로 생성한다.
    이유는 단일 테이블을 사용하기 때문에 자식 클래스에 대한 구분 값이 없기 때문이다.

장점

  • 조인이 되지 않아 조회 성능이 빠름
  • 조회 쿼리 단순

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 해주어야함.
  • 테이블에 모든걸 저장하기 때문에 테이블이 비대, 조회 성능이 느려질 가능성 있음
profile
인생은 IT 노가다

0개의 댓글