HyeLog

[κΉ€μ˜ν•œ_μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 6. κ³ κΈ‰ 맀핑(상속관계 맀핑) λ³Έλ¬Έ

μ›Ή 개발/Spring Boot

[κΉ€μ˜ν•œ_μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 6. κ³ κΈ‰ 맀핑(상속관계 맀핑)

shj718 2022. 6. 14. 00:07

πŸ‘©‍πŸ‘§‍πŸ‘¦ 상속관계 맀핑

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” '상속관계'와 λΉ„μŠ·ν•œ κ°œλ…μΈ 'μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 관계'κ°€ μžˆλ‹€. 이것을 객체 상속과 λ§€ν•‘ν•˜λŠ” μ „λž΅μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

'μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 관계'λ₯Ό μ‹€μ œλ‘œ ν…Œμ΄λΈ”λ‘œ κ΅¬ν˜„ν•˜λŠ” 방법은 3가지가 μžˆλ‹€.

 

1) 쑰인 μ „λž΅

 

2) 단일 ν…Œμ΄λΈ” μ „λž΅

 

3) κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” μ „λž΅

 

πŸ’Ώ 단일 ν…Œμ΄λΈ” μ „λž΅

이제 μ—”ν‹°ν‹°λ₯Ό λ§Œλ“€μ–΄λ³΄μž. μ•„λž˜μ™€ 같이 μ—”ν‹°ν‹°λ₯Ό λ§Œλ“€λ©΄, λ””ν΄νŠΈλ‘œ 단일 ν…Œμ΄λΈ” μ „λž΅μ΄ μ„ νƒλœλ‹€.

@Entity
public class Item {

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

    private String name;
    private String 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;
}

쿼리문을 보면, Item ν…Œμ΄λΈ” ν•˜λ‚˜μ— λͺ¨λ“  컬럼이 λ“€μ–΄κ°„ 것을 확인할 수 μžˆλ‹€.

 

 

단일 ν…Œμ΄λΈ” μ „λž΅μ„ λͺ…μ‹œν•˜κ³  μ‹Άλ‹€λ©΄, @Inheritance μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ„œ νƒ€μž…μ„ SINGLE_TABLE둜 μ •ν•˜λ©΄ λœλ‹€.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn // 단일 ν…Œμ΄λΈ” μ „λž΅μ—μ„œλŠ” μƒλž΅ν•΄λ„ μžλ™μœΌλ‘œ DTYPE 컬럼이 생성됨. μ•„λž˜μ—μ„œ μ„€λͺ…
public class Item {

 

+ Item 객체λ₯Ό λ”°λ‘œ 생성할 일이 μ—†λ‹€λ©΄, 좔상 클래슀둜 λ§Œλ“œλŠ” 것이 μ’‹λ‹€. (주둜 Book, Album, Movie 객체λ₯Ό 생성함) 

 

πŸ”— 쑰인 μ „λž΅

Item 엔티티에 @Inheritance μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ„œ νƒ€μž…μ„ JOINED둜 μ„€μ •ν•˜λ©΄ Item, Album, Movie, Book ν…Œμ΄λΈ”μ΄ λͺ¨λ‘ μƒμ„±λ˜κ³  Album, Movie, Book ν…Œμ΄λΈ”μ˜ κΈ°λ³Έν‚€μ΄μž μ™Έλž˜ν‚€λŠ” λͺ¨λ‘ Item의 κΈ°λ³Έν‚€λ‘œ μ„€μ •λœλ‹€.

 

@DiscriminatorColumn 을 뢙이면 ITEM ν…Œμ΄λΈ”μ— 'DTYPE' 컬럼이 생긴닀. 이 μ»¬λŸΌμ€ 앨범 / 무비 / 뢁 을 κ΅¬λΆ„ν•΄μ£ΌλŠ” 컬럼으둜, μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. name μ†μ„±μœΌλ‘œ 컬럼 이름을 DTYPE이 μ•„λ‹Œ λ‹€λ₯Έ κ²ƒμœΌλ‘œ 지정할 μˆ˜λ„ μžˆλ‹€.

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

그럼 DTYPE μ»¬λŸΌμ—λŠ” μ–΄λ–€ 값이 λ“€μ–΄κ°ˆκΉŒ? λ””ν΄νŠΈλŠ” μ—”ν‹°ν‹°λͺ…이닀. ν•˜μ§€λ§Œ, μ•„λž˜μ™€ 같이 @DiscriminatorValue둜 μ—”ν‹°ν‹°λ§ˆλ‹€ 지정할 수 μžˆλ‹€. 이제 Movie μ—”ν‹°ν‹°λ₯Ό ν•˜λ‚˜ μƒμ„±ν•˜λ©΄, Item ν…Œμ΄λΈ”μ—λ„ DTYPE이 'M'인 데이터가 λ“€μ–΄κ°ˆ 것이닀.

@Entity
@DiscriminatorValue("M")
public class Movie extends Item {

    private String director;
    private String actor;
}

 

πŸ“š κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” μ „λž΅

κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” μ „λž΅μ„ μ‚¬μš©ν•˜λ €λ©΄, strategyλ₯Ό TABLE_PER_CLASS둜 μ„€μ •ν•˜λ©΄ λœλ‹€.

μ΄λ•Œ Item μ—”ν‹°ν‹°λŠ” λ°˜λ“œμ‹œ 좔상(abstract) ν΄λž˜μŠ€μ—¬μ•Ό ν•œλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ DBμ—λŠ” Album, Movie, Book ν…Œμ΄λΈ”λ§Œ λ§Œλ“€μ–΄μ§€κ³  Item ν…Œμ΄λΈ”μ€ μ•„μ˜ˆ λ§Œλ“€μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€.

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

 

πŸ‘©‍πŸ’» κ²°λ‘ 

μ •λ¦¬ν•˜μžλ©΄, 쑰인 μ „λž΅μ΄ κ°€μž₯ 정석이라고 ν•  수 μžˆλ‹€. 쑰인 μ „λž΅μ„ 기본으둜 μƒκ°ν•˜μž. 단일 ν…Œμ΄λΈ” μ „λž΅μ€ λΉ„μ¦ˆλ‹ˆμŠ€μ μœΌλ‘œ μ•„μ£Ό λ‹¨μˆœν•œ 데이터일 λ•Œ μ‚¬μš©ν•˜λ©΄ μ’‹λ‹€. κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” μ „λž΅μ€ 단점이 많기 λ•Œλ¬Έμ— μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것을 μΆ”μ²œν•œλ‹€.