JAVA/JPA

[JPA] 상속관계 매핑

4Legs 2021. 3. 30. 18:19

상속관계 매핑

객체는 상속관계가 존재하지만, 관계형 데이터베이스는 대부분 상속 관계가 존재하지 않는다.

하지만 관계형 데이터베이스의 슈퍼/서브타입 모델링 기법이 객체의 상속 관계와 꽤 유사하다. 우리는 이를 이용해 객체의 상속 구조를 매핑할 수 있다.

상속 관계를 매핑하는 방법은 다음과 같다.

@Entity
@Inheritance(strategy = InheritanceType.XXX) // 상속전략 선택
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int price;
}

@Entity
public class Album extends Item {

    private String artist;
}

@Entity
public class Movie extends Item {

    private String director;
    private String actor;
}

@Entity
public class Book extends Item {

    private String author;
    private String isbn;
}

 

상속관계 전략

관계형 데이터베이스의 슈퍼/서브타입 모델링 기법에는 세 가지 전략이 존재한다. 우리는 이중 하나를 선택해 상속관계를 매핑할 수 있다.

@Inheritance(stragegy=InheritanceType.JOINED

JOINED 전략의 테이블 구조

JOINED 전략은 각 하위 엔티티들을 별도의 테이블로 만들고, 상위 엔티티에 해당하는 테이블을 참조하도록 하는 전략이다.

위 그림에서와 같이, BOOK, MOVIE, ALBUM 테이블은 ITEM 테이블의 ID를 외래 키로 사용한다.

만약 우리가 Book 객체의 가격을 알고 싶다면 BOOK 테이블의 ID로 ITEM 테이블을 조인해 검색할 수 있다.

쿼리가 복잡해 이후 두 방식에 비해 비교적 성능이 낮다는 단점이 있지만, 유의미한 성능 저하는 잘 일어나지 않는다.

오히려 저장 공간을 효율적으로 사용할 수 있다는 장점으로 인해 정석적인 방법이라 할 수 있다.

 

@Inheritance(stragegy=InheritanceType.SINGLE_TABLE

단일 테이블 전략의 테이블 구조

 

SINGLE_TABLE (단일 테이블) 전략은 위 그림과 같이 하위 엔티티들에 대한 클래스를 모두 통합해 하나의 상위 엔티티 테이블로 운영하는 전략이다.

DTYPE 칼럼을 통해 한 ROW가 어떤 하위 객체에 해당하는 행인지 파악한다.

만약 "MOVIE" 타입의 데이터를 담은 행이라면 AUTHOR, ISBN, ARTIST 칼럼에는 아무 값도 들어가지 않는다. 따라서, 하위 엔티티가 매핑하는 칼럼들은 모두 Nullable이어야 한다.

작은 규모의 서비스거나, 굳이 조인 전략을 선택할 필요가 없다고 판단될 때 사용할 수 있는 전략이며, 쿼리가 단순하기 때문에 비교적 성능이 좋다.

하지만 테이블 하나의 크기가 과도하게 커지면 공간 효율이 매우 떨어진다는 단점이 존재한다.

 

@Inheritance(stragegy=InheritanceType.TABLE_PER_CLASS

TABLE_PER_CLASS 전략의 테이블 구조

TABLE_PER_CLASS 전략은 상위 엔티티의 공통 속성들을 모두 하위 엔티티로 내려 각각의 테이블로 만드는 전략이다.

위 그림에서 ITEM 테이블의 속성 ID, NAME, PRICE 가 모두 하위 엔티티 테이블에 포함된 것을 볼 수 있다.

하위 엔티티마다 테이블을 생성하기 때문에, 상위 엔티티는 실제로 생성되지 않는다. 따라서, Item 엔티티는 추상 클래스여야 한다.

만약 하위 엔티티가 아닌 상위 엔티티 Item으로 조회를 해야 할 경우, 하위 엔티티 테이블들을 모두 UNION한 뒤에 조회해야 하므로, 이 경우 성능이 좋지 않다.

또한 데이터 변경 관점에서 좋지 않은 방법이므로, 권장되지 않는 전략이다.

 

 

Reference

자바 ORM 표준 JPA 프로그래밍