Back End/Spring Data JPA

[Spring JPA] 슈퍼-서브타입 관계 모델링 (상속관계 매핑)

DevPing9_ 2022. 1. 14. 21:00

 

DB 모델링기법 중에 슈퍼-서브타입 모델링(엔티티가 상속관계를 이룸)이라는게 있는데,

논리모델은 같지만 실제 물리모델은 RollUp, RollDown, Identity 중 하나로 구현한다.

 

 

[SQL] 슈퍼-서브타입 모델의 물리모델 결정기준 (feat. JPA)

DB 모델링기법 중에 슈퍼-서브타입 모델링(엔티티가 상속관계를 이룸)이라는게 있는데, 논리모델은 같지만 실제 물리모델은 RollUp, RollDown, Identity 중 하나로 구현한다. # 논리모델 * 전구모양의 x

developer-ping9.tistory.com

 

 

즉, 물리모델중 어느 방법으로 구현하냐에 따라서

테이블의 구조와 갯수가 변동된다.

 

 

실제 서비스 중,

성능이 너무 안나와서 다른 물리모델로 교체하자라는 콜이 나왔을 때

JPA가 없다면 뜯어고칠게 엄청많을 것이다.

 

 

하지만 JPA와 함께라면,

두려움없이 코드 몇줄의 수정으로

입맛에 맞추어 물리모델에 매핑시킬 수 있다.

 

 

JPA의 가장 큰 장점 중 하나라고 할 수 있다.

 


 

# 예시 논리모델

 

 

 

# 코드 베이스 

1. [물품 - Item] - 슈퍼타입

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
public abstract class Item{
    @Id @generatedValue
    private Long id;
    
    private String name;
    private BigDecimal price;
}

2. [음반 - Album] - 서브타입

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
public class Album extends Item{
    private artist;
}

3. [영화 - Movie] - 서브타입

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
public class Movie extends Item{
    private director;
}

4. [책 - Book] - 서브타입

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
public class Book extends Item{
    private author;
}

 

# 물리모델에 따른 매핑 변경

 @Inheritance 한줄로 매핑변경 가능하다. 

  >> Single_Table , Table_Per_Class , Joined

 

1. RollUp (Single-Type)

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Item{
    @Id @generatedValue
    private Long id;
    
    private String name;
    private BigDecimal price;
}

2. RollDown (Plus-Type)

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item{
    @Id @generatedValue
    private Long id;
    
    private String name;
    private BigDecimal price;
}

3. Identity (One-To-One Type)

//@Getter ...~~ @ NoArgsConstructor // 본인 입맛대로 
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Item{
    @Id @generatedValue
    private Long id;
    
    private String name;
    private BigDecimal price;
}

 


 

# JPA 에서의 각 전략의 장단점

 1. Joined 전략

 

  insert 쿼리가 두번 나간다. (영한님이 큰 단점은 아니라고 하심...)

  비즈니스적으로 복잡할때 많이 사용 (확장에 용이)

 

 2. Single_Table 전략

 

  일반적 조회성능이 빠름 (데이터의 갯수가 어느 분기점을 넘으면 성능이 저하)

  자식엔티티의 컬럼은 모두 nullable. (데이터무결성에 문제) 

  비즈니스적으로 단순할때 많이 사용 (확장에 썩 용이하진 않음)

 

 3. Table_Per_Class 전략

 

  DB 설계자와 ORM 전문가 둘다 비호인 전략

  (묶어서 정산이나, ID에 따라 아이템을 찾을때나 여러모로 골치아픔)

728x90