Skip to content

Commit

Permalink
πŸ“[Docs]: 상속관계 맀핑 (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
hw130 authored Aug 5, 2023
1 parent 7bb1621 commit 2119829
Showing 1 changed file with 154 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,4 +1,157 @@
# 상속관계 맀핑
> μž‘μ„±μž: @hw130
## λͺ©μ°¨
## λͺ©μ°¨
- [상속관계 맀핑](#상속관계-맀핑)
- [쑰인 μ „λž΅](#쑰인-μ „λž΅)
- [단일 ν…Œμ΄λΈ” μ „λž΅](#단일-ν…Œμ΄λΈ”-μ „λž΅)
- [κ΅¬ν˜„ 클래슀 μ „λž΅](#κ΅¬ν˜„-클래슀-μ „λž΅)
- [κ²°λ‘  및 정리](#κ²°λ‘ -및-정리)


### 상속관계 맀핑
---
- κ°μ²΄λŠ” 상속관계가 μ‘΄μž¬ν•˜μ§€λ§Œ, κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” 상속 관계가 μ—†λ‹€.(λŒ€λΆ€λΆ„)

- κ·Έλ‚˜λ§ˆ μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… κ΄€κ³„λΌλŠ” λͺ¨λΈλ§ 기법이 객체 상속과 μœ μ‚¬ν•˜λ‹€.

- 상속관계 λ§€ν•‘μ΄λΌλŠ” 것은 객체의 상속 ꡬ쑰와 DB의 μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 관계λ₯Ό λ§€ν•‘ν•˜λŠ” 것이닀. 즉, μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž…μ„ 논리 λͺ¨λΈμ„ μ‹€μ œ 물리 λͺ¨λΈλ‘œ λ³€ν™˜ν•˜λŠ” 방법이닀.
<img width="780" alt="스크란샷 2023-08-06 α„‹α…©α„Œα…₯ᆫ 1 43 13" src="https://github.com/hw130/Algorithm_practice/assets/87763333/2ed855e0-eca0-4de4-9c6f-4f0da327de26">
#### μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 논리 λͺ¨λΈμ„ μ‹€μ œ 물리 λͺ¨λΈλ‘œ κ΅¬ν˜„ν•˜λŠ” 방법
- κ°μ²΄λŠ” 상속을 μ§€μ›ν•˜λ―€λ‘œ λͺ¨λΈλ§κ³Ό κ΅¬ν˜„μ΄ λ˜‘κ°™μ§€λ§Œ, DBλŠ” 상속을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 논리 λͺ¨λΈμ„ 물리 λͺ¨λΈλ‘œ κ΅¬ν˜„ν•  방법이 ν•„μš”ν•˜λ‹€.
- DB의 μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž… 논리 λͺ¨λΈμ„ μ‹€μ œ 물리 λͺ¨λΈλ‘œ κ΅¬ν˜„ν•˜λŠ” 방법은 세가지가 μžˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œκ±΄, DBμž…μž₯μ—μ„œ μ„Έκ°€μ§€λ‘œ κ΅¬ν˜„ν•˜μ§€λ§Œ JPAμ—μ„œλŠ” μ–΄λ–€ 방식을 μ„ νƒν•˜λ˜ 맀핑이 κ°€λŠ₯ν•˜λ‹€.
- 각각 ν…Œμ΄λΈ”λ‘œ λ³€ν™˜ν•˜λŠ” 쑰인 μ „λž΅(JOINED)
- 단일 ν…Œμ΄λΈ” μ „λž΅μ΄λΌλŠ” 논리 λͺ¨λΈμ„ ν•œ ν…Œμ΄λΈ”λ‘œ ν•©μΉ˜λŠ” μ „λž΅(SINGLE_TABLE)
- κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” μ „λž΅(TABLE_PER_CLASS)

### 쑰인 μ „λž΅
---
- κ°€μž₯ μ •κ·œν™” 된 λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ν•˜λŠ” 방식이닀.
- μ—”ν‹°ν‹° 각각을 ν…Œμ΄λΈ”λ‘œ λ§Œλ“€κ³  μžμ‹ ν…Œμ΄λΈ”μ΄ λΆ€λͺ¨ ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€λ₯Ό λ°›μ•„ κΈ°λ³Έ ν‚€ + μ™Έλž˜ ν‚€λ‘œ μ‚¬μš©ν•˜λŠ” μ „λž΅
- μžμ‹ ν…Œμ΄λΈ” 쀑 μ–΄λŠ ν…Œμ΄λΈ”μ„ μ‘°νšŒν•΄μ•Όν•˜λŠ”μ§€ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ DTYPEμ΄λž€ ꡬ뢄 μ»¬λŸΌμ„ μ‚¬μš©ν•œλ‹€.
- NAME, PRICEκ°€ ITEM ν…Œμ΄λΈ”μ—λ§Œ μ €μž₯되고, ALBUM, MOVIE, BOOK이 각자의 λ°μ΄ν„°λ§Œ μ €μž₯ν•œλ‹€.
<img width="939" alt="스크란샷 2023-08-06 α„‹α…©α„Œα…₯ᆫ 1 48 17" src="https://github.com/hw130/Algorithm_practice/assets/87763333/51166a9d-1238-4c95-b9ec-10a1845661c7">

#### μ˜ˆμ œμ½”λ“œ
```
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {

@GeneratedValue @Id
private Long id;
...
```
```
@Entity
@DiscriminatorValue("TEST")
@PrimaryKeyJoinColumn(name = "Album_ID")
public class Album extends Item {

private String artist;

...
```
- @Inheritance(strategy = InheritanceType.JOINED)
- λΆ€λͺ¨ ν΄λž˜μŠ€μ— 지정. 쑰인 μ „λž΅μ΄λ―€λ‘œ InheritanceType.JOINED μ„€μ •
- @DiscriminatorColumn(name = "DTYPE")
- ꡬ뢄 컬럼 지정. λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ„ μ–Έν•œλ‹€. ν•˜μœ„ 클래슀λ₯Ό κ΅¬λΆ„ν•˜λŠ” μš©λ„μ˜ μ»¬λŸΌμ΄λ‹€. κ΄€λ‘€λŠ” default = DTYPE이고, Default값이 DTYPEμ΄λ―€λ‘œ name 속성은 μƒλž΅ κ°€λŠ₯
- @DiscriminatorValue("TEST")
- ꡬ뢄 μ»¬λŸΌμ— μž…λ ₯ν•  κ°’ 지정.
- ν•˜μœ„ ν΄λž˜μŠ€μ— μ„ μ–Έν•œλ‹€. μ—”ν‹°ν‹°λ₯Ό μ €μž₯ν•  λ•Œ μŠˆνΌνƒ€μž…μ˜ ꡬ뢄 μ»¬λŸΌμ— μ €μž₯ν•  값을 μ§€μ •ν•œλ‹€.
- μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•˜μ§€ μ•Šμ„ 경우 κΈ°λ³Έκ°’μœΌλ‘œ 클래슀 이름이 λ“€μ–΄κ°„λ‹€.
- @PrimaryKeyJoinColumn(name = "Album_ID")
- Default둜 μžμ‹ ν…Œμ΄λΈ”μ€ λΆ€λͺ¨ ν…Œμ΄λΈ” id 컬럼λͺ…을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ‚˜, λ³€κ²½μ‹œ ν•΄λ‹Ή μ„€μ •κ°’ μΆ”κ°€
- μž₯점
- ν…Œμ΄λΈ”μ˜ μ •κ·œν™”
- μ™Έλž˜ ν‚€ μ°Έμ‘° 무결성 μ œμ•½μ‘°κ±΄ ν™œμš© κ°€λŠ₯
- ITEM의 PKκ°€ ALBUM, MOVIE, BOOK의 PK이자 FK이닀. κ·Έλž˜μ„œ λ‹€λ₯Έ ν…Œμ΄λΈ”μ—μ„œ μ•„μ΄ν…œ ν…Œμ΄λΈ”λ§Œ 바라보도둝 μ„€κ³„ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
- μ €μž₯곡간을 효율적으둜 μ‚¬μš© κ°€λŠ₯
- ν…Œμ΄λΈ” μ •κ·œν™”λ‘œ μ €μž₯곡간이 λ”± ν•„μš”ν•œ 만큼 μ†ŒλΉ„λœλ‹€.
- 단점
- μ‘°νšŒμ‹œ μž¦μ€ 쑰인으둜 인해 μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯μ„±
- λ³΅μž‘ν•œ 쑰회 쿼리
- 데이터 등둝 μ‹œ, λ‘λ²ˆ μ‹€ν–‰λ˜λŠ” INSERTλ¬Έ
- 정리
- μ„±λŠ₯ μ €ν•˜λΌκ³  λ˜μ–΄μžˆμ§€λ§Œ, μ‹€μ œλ‘œλŠ” 영ν–₯이 크지 μ•Šλ‹€.
- 였히렀 μ €μž₯곡간이 νš¨μœ¨ν™” 되기 λ•Œλ¬Έμ— μž₯점이 크닀.
- κΈ°λ³Έμ μœΌλ‘œλŠ” 쑰인 μ •λž΅μ΄ 정석이라고 보면 λœλ‹€. κ°μ²΄λž‘λ„ 잘 맞고, μ •κ·œν™”λ„ 되고, κ·Έλž˜μ„œ 섀계가 κΉ”λ”ν•˜κ²Œ λ‚˜μ˜¨λ‹€.

### 단일 ν…Œμ΄λΈ” μ „λž΅
---
- ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜λ©° ꡬ뢄 컬럼(DTYPE)을 ν™œμš©ν•΄ 데이터λ₯Ό ν™œμš©ν•˜λŠ” μ „λž΅
-
<img width="814" alt="스크란샷 2023-08-06 α„‹α…©α„Œα…₯ᆫ 1 48 48" src="https://github.com/hw130/Algorithm_practice/assets/87763333/39ba9e53-3eb7-4733-9c1e-728fabf34764">
#### 예제 μ½”λ“œ
```
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@GeneratedValue @Id
private Long id;
...
```
```
@Entity
@DiscriminatorValue("TEST")
public class Album extends Item{
private String artist;
}
```
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- λΆ€λͺ¨ ν΄λž˜μŠ€μ— 지정. 단일 ν…Œμ΄λΈ” μ „λž΅μ΄λ―€λ‘œ InheritanceType.SINGLE_TABLE μ„€μ •
- μž₯점
- INSERT 쿼리도 ν•œ 번, SELECT 쿼리도 ν•œ λ²ˆμ΄λ‹€. 쑰인할 ν•„μš”κ°€ μ—†κ³ , 쑰회 μ„±λŠ₯이 μ’‹λ‹€.
- λ‹¨μˆœν•œ 쑰회 쿼리
- 단점
- μžμ‹ μ—”ν‹°ν‹°κ°€ λ§€ν•‘ν•œ μ»¬λŸΌμ€ λͺ¨λ‘ NULL ν—ˆμš©
- 높은 ν…Œμ΄λΈ”μ΄ 컀질 κ°€λŠ₯μ„±μœΌλ‘œ 인해 였히렀 쑰회 μ„±λŠ₯이 μ•ˆμ’‹μ•„μ§ˆ 수 있음

### κ΅¬ν˜„ 클래슀 μ „λž΅
---
- μžμ‹ μ—”ν‹°ν‹°λ§ˆλ‹€ ν…Œμ΄λΈ” μƒμ„±ν•˜λŠ” μ „λž΅
- λ°μ΄ν„°λ² μ΄μŠ€ μ„€κ³„μžμ™€ ORM μ „λ¬Έκ°€ λ‘˜ λ‹€ μΆ”μ²œν•˜μ§€ μ•ŠλŠ” μ „λž΅
<img width="965" alt="스크란샷 2023-08-06 α„‹α…©α„Œα…₯ᆫ 1 49 16" src="https://github.com/hw130/Algorithm_practice/assets/87763333/f7ff3b1f-a354-439b-8615-94e9905b5298">
#### κ΅¬ν˜„ 예제
```
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@GeneratedValue @Id
private Long id;
...
```
```
@Entity
@DiscriminatorValue("TEST")
public class Album extends Item{
private String artist;
}
```
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- λΆ€λͺ¨ ν΄λž˜μŠ€μ— 지정. κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ ν…Œμ΄λΈ” μ „λž΅μ΄λ―€λ‘œ InheritanceType.TABLE_PER_CLASS μ„€μ •
- μž₯점
- μ„œλΈŒ νƒ€μž…μ„ κ΅¬λΆ„ν•΄μ„œ μ²˜λ¦¬ν•  λ•Œ 효과적
- not null μ œμ•½μ‘°κ±΄ μ‚¬μš© κ°€λŠ₯
- 단점
- μ—¬λŸ¬ μžμ‹ ν…Œμ΄λΈ” ν•¨κ»˜ μ‘°νšŒμ‹œ μ„±λŠ₯이 λŠλ¦¬λ‹€. (UNION SQL)
- μžμ‹ ν…Œμ΄λΈ”μ„ 톡합해 쿼리가 어렀움
- λ³€κ²½μ΄λΌλŠ” κ΄€μ μœΌλ‘œ μ ‘κ·Όν•  λ•Œ ꡉμž₯히 쒋지 μ•Šλ‹€.
- 예λ₯Ό λ“€μ–΄, ITEM듀을 λͺ¨λ‘ μ •μ‚°ν•˜λŠ” μ½”λ“œκ°€ μžˆλ‹€κ³  κ°€μ •ν•  λ•Œ, ITEM ν•˜μœ„ ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λ©΄ μ •μ‚° μ½”λ“œκ°€ λ³€κ²½λœλ‹€. μΆ”κ°€λœ ν•˜μœ„ 클래슀의 μ •μ‚° κ²°κ³Όλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ ν•΄μ•Ό ν•œλ‹€.

### κ²°λ‘  및 정리
---
- κΈ°λ³Έμ μœΌλ‘œλŠ” 쑰인 μ „λž΅μ„ κ°€μ Έκ°€μž.

- 쑰인 μ „λž΅κ³Ό 단일 ν…Œμ΄λΈ” μ „λž΅μ˜ trade offλ₯Ό μƒκ°ν•΄μ„œ μ „λž΅μ„ μ„ νƒν•˜μž.

- ꡉμž₯히 μ‹¬ν”Œν•˜κ³  ν™•μž₯의 κ°€λŠ₯성도 적으면 단일 ν…Œμ΄λΈ” μ „λž΅μ„ κ°€μ Έκ°€μž. κ·ΈλŸ¬λ‚˜ λΉ„μ¦ˆλ‹ˆμŠ€ 적으둜 μ€‘μš”ν•˜κ³ , λ³΅μž‘ν•˜κ³ , ν™•μž₯될 ν™•λ₯ μ΄ λ†’μœΌλ©΄ 쑰인 μ „λž΅μ„ κ°€μ Έκ°€μž.

0 comments on commit 2119829

Please sign in to comment.