Spring

상속관계 매핑

yougeun 2023. 3. 21. 23:32
728x90

상속관계 매핑

관계형 데이터베이스의 슈퍼타입 서브타입 관계 모델링 기법이 객체상속과 유사하다.

상속관계 매핑은 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑한다.

 

어노테이션

@Inheritance(strategy=InheritanceType.XXX) 

JOINED:조인전략

SINGLE_TABLE:단일 테이블 전략

TABLE_PER_CLASS:구현 클래스마다 테이블 전략

@DiscriminatorColumn(name=“DTYPE”) 

부모클래스에 선언하고 하위 클래스를 구분하는 용도의 컬럼인 DTYPE을 추가한다.

@DiscriminatorValue(“XXX”)

 하위클래스에 선언하고 엔티티를 저장할 때 슈퍼타입의 DTYPE에 저장할 값을 지정한다.

default:클래스 이름

 

방법

(1)각각 테이블로 변환 -> 조인 전략

 

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item {

    @Id @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;

    private int price;

    private int stockQuantity;

}

장점

(1)테이블 정규화가 가능하다.

(2)외래 키 참조 무결성 제약조건 활용가능하다.

(3)저장공간을 효율화할 수 있다.

단점

(1)조회시 조인을 많이사용하여 성능이 떨어질 수 있다.

(2)조회 쿼리가 복잡하다.

(3)데이터 저장시 INSERT QUERY가 2번 호출된다.

 

(2)통합테이블로 변환 -> 단일 테이블 전략

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item extends Timestamped {

    @Id @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;

    private int price;

    private int stockQuantity;
    
}

장점

(1)조인이 필요 없으므로 일반적으로 조회 성능이 빠르다

(2)조회 쿼리가 단순하다.

단점

(1)자식 엔티티가 매핑한 컬럼은 모두 null을 혀용해야 한다.

(2)단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다.

 

(3) 서브타입 테이블로 변환 ->구현 클래스마다 테이블 전략

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {

    @Id @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;

    private int price;

    private int stockQuantity;

}

장점

(1)서브 타입을 명확하게 구분해서 처리할 때 효과적이다.

(2)not null 제약조건 사용 가능하다.

단점

(1)여러 자식 테이블을 함께 조회할 때 성능이 느리다(UNION SQL 필요) 

(2)자식 테이블을 통합해서 쿼리하기 어렵다.

728x90