[JPA] ๊ณ ๊ธ ๋งคํ : ์์ ๊ด๊ณ ๋งคํ
by Dongwoongkim๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์์์ด๋ผ๋ ๊ฐ๋ ์ด ์๋ ๋์ ์์๊ณผ ์ ์ฌํ ์ํผํ์ ์๋ธํ์ ๊ด๊ณ๋ผ๋ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ์ด ์์ต๋๋ค.
ORM์์์ ์์๊ด๊ณ ๋งคํ์ ์ํผํ์ ์๋ธํ์ ๊ด๊ณ๋ฅผ ๋งคํ์ ๋งํฉ๋๋ค.
์ํผํ์ ์๋ธํ์ ๋ ผ๋ฆฌ ๋ชจ๋ธ์ ์ค์ ๋ฌผ๋ฆฌ ๋ชจ๋ธ์ธ ํ ์ด๋ธ๋ก ๊ตฌํํ ๋๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. ๊ฐ๊ฐ์ ํ ์ด๋ธ๋ก ๋ณํ (์กฐ์ธ ์ ๋ต) : ์ํผํ์ ์๋ธํ์ ์ํฐํฐ๋ฅผ ๋ชจ๋ ๊ฐ๊ฐ ํ ์ด๋ธ๋ก ๋ง๋ค๊ณ ์กฐํํ ๋ ์กฐ์ธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
2. ํตํฉ ํ ์ด๋ธ๋ก ๋ณํ (๋จ์ผ ํ ์ด๋ธ ์ ๋ต): ์๋ธํ์ ์ํฐํฐ์ ์ํผํ์ ์ํฐํฐ๋ฅผ ํ๊ณณ์ ๋ชจ์ ํ๋์ ์ํฐํฐ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
3. ์๋ธํ์ ํ ์ด๋ธ๋ก ๋ณํ (๊ตฌํ ํด๋์ค๋ง๋ค ํ ์ด๋ธ ์ ๋ต) : ์๋ธํ์ ์ํฐํฐ๋ฅผ ๋ชจ๋ ๊ฐ๊ฐ ํ ์ด๋ธ๋ก ๋ง๋ค๊ณ , ์์ ํ ์ด๋ธ์ด ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ ๊ทธ๋
์กฐ์ธ ์ ๋ต
์ํผํ์ ์๋ธํ์ ์ํฐํฐ๋ฅผ ๋ชจ๋ ๊ฐ๊ฐ ํ ์ด๋ธ๋ก ๋ง๋ค๊ณ , ์์ ํ ์ด๋ธ์ด ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ ๋ฐ์์ ๊ธฐ๋ณธ ํค + ์ธ๋ํค์ธ ๋ณตํฉํค๋ฅผ ์ฌ์ฉํ๋ ์ ๋ต์ ๋๋ค.
์ํผํ์ ์๋ธํ์ ๊ด๊ณ๋ฅผ ์กฐ์ธ์ ๋ต์ผ๋ก ๋งคํํ ๋๋ Dtype์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฒด๋ ํ์ ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ง๋ง ํ ์ด๋ธ์๋ ํ์ ์ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ Dtype์ ๊ตฌ๋ถํ๋ ์ปฌ๋ผ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด Item์ด๋ผ๋ ๋ถ๋ชจ ์ํฐํฐ, Item์ ์์๋ฐ์ ์์ ์ํฐํฐ Album, Movie, Book ์ํฐํฐ๊ฐ ์๋ค๊ณ ํด๋ด ์๋ค.
์ด ์์๊ด๊ณ๋ฅผ ์ํผํ์ ์๋ธํ์ ์กฐ์ธ์ ๋ต์ผ๋ก ๋งคํํด๋ด ์๋ค.
Super Type - Item
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // ์กฐ์ธ ์ ๋ต์ผ๋ก ์ํผ-์๋ธํ์
๋งคํ
@DiscriminatorColumn(name = "DTYPE") // ์์ ๊ตฌ๋ถ ์ปฌ๋ผ์ Dtype์ ์ค์
public abstract class Item { // ์ค์ ์ํฐํฐ๋ก ์ฌ์ฉํ์ง ์์ ๋ ์ถ์ ํด๋์ค๋ก ์ ์ธ
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
- ์์ ๋งคํ์ ๋ถ๋ชจ ํด๋์ค์ @Inheritance๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งคํ ์ ๋ต์ ์กฐ์ธ ์ ๋ต์ ์ฌ์ฉํ๋ฏ๋ก startegy ์์ฑ์ Inheritance.JOINED๋ก ์ค์ ํ์ต๋๋ค.
- ์ถ๊ฐ์ ์ผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ํ์ ์ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๊ตฌ๋ถ ์ปฌ๋ผ์ @DiscriminatorColuimn ์ด๋ ธํ ์ด์ ์ Dtype์ผ๋ก ์ง์ ํด์ค๋๋ค.
- ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ ์ด๋ธ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ถ์ ํด๋์ค๋ก ์ ์ธํด์ ๋งคํํด์ค๋๋ค.
Sub Type - Album
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
}
- Item์ ์์๋ฐ์ ์์ ํด๋์ค์ด๋ฏ๋ก extends ํค์๋๋ฅผ ์ฌ์ฉํฉ์๋ค.
- ์ํฐํฐ๋ฅผ ์ ์ฅํ ๋ ๊ตฌ๋ถ ์ปฌ๋ผ์ ์ ๋ ฅํ ๊ฐ์ ์ง์ ํฉ๋๋ค. ๋ง์ฝ ๋ณ๋๋ก ์ง์ ํ์ง ์์ผ๋ฉด ํด๋์ค ์ด๋ฆ์ผ๋ก ์๋ ์ง์ ๋ฉ๋๋ค.
๋ง์ฝ ์์ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ์ปฌ๋ผ๋ช (item_id)๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ
@PrimaryKeyJoinColumn(name = "์ง์ ํ๊ณ ์ถ์ ์ปฌ๋ผ๋ช ")์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์กฐ์ธ์ ๋ต ์ฅ-๋จ์
์ฅ์
- ํ
์ด๋ธ์ด ์ ๊ทํ ๋ฉ๋๋ค.
- ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ต์ํ ํจ์ผ๋ก์จ ์ ์ฅ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ ( ๊ฐ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ณ๋์ ํ ์ด๋ธ๋ก ์์ฑํ์ง ์๊ณ , ํ์ํ ํ๋๋ง์ ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ์ ์ฅํ์ฌ ์ ์ฅ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. )
- ์ธ๋ ํค ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ํ์ฉ ๊ฐ๋ฅ : ์ฐธ์กฐํ๋ ํ
์ด๋ธ์ ๋ฌด๊ฒฐ์ฑ์ด ์ ์ง๋์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ
- ์๋ฅผ๋ค์ด, ์์ ์ํฐํฐ๊ฐ ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด, ์ธ๋ํค ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ์ํฐํฐ์ ๊ธฐ๋ณธํค ๊ฐ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ญ์ ๋ ๋ ์์ ์ํฐํฐ์์๋ ์ธ๋ํค ๊ฐ์ ํจ๊ป ์์ ํ๊ฑฐ๋ ์ญ์ ํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋จ์
- ์กฐํํ ๋ join์ด ๋ง์ด ์ฌ์ฉ๋๋ฏ๋ก ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ๋ฑ๋กํ ๋ insert SQL์ n๋ฒ ์คํ
๋จ์ผ ํ ์ด๋ธ ์ ๋ต
์ด๋ฆ ๊ทธ๋๋ก ํ ์ด๋ธ์ ํ๋๋ง ์ฌ์ฉํด์ ๊ตฌ๋ถ ์ปฌ๋ผ์ผ๋ก ์ด๋ค ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์๋์ง ๊ตฌ๋ถํ๋ ์ ๋ต์ ๋๋ค. ํ ํ ์ด๋ธ ๋ด์์ ์กฐํํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์กฐํ๊ฐ ๊ฐ์ฅ ๋น ๋ฆ ๋๋ค.
์์ ์ํฐํฐ๊ฐ ๋งคํํ ์ปฌ๋ผ์ ๋ชจ๋ null์ ํ์ฉํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE")
public abstract class Item{
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {...}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {...}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {...}
- @Inheritance.strategy๋ฅผ InheritanceType.SINGLE_TABLE ๋ก ์ค์ ํ๋ฉด ๋จ์ผ ํ ์ด๋ธ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
- ํ
์ด๋ธ ํ๋์ ๋ชจ๋ ๊ฒ์ ํตํฉํ๋ฏ๋ก ๊ตฌ๋ถ ์ปฌ๋ผ์ ํ์๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- Dtype์ผ๋ก ์ด๋ค ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์๋์ง ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ @DiscriminatorColumn์ ์ค์ ํด์ฃผ์ด์ผํฉ๋๋ค.
์ฅ์
- join ํ์ง ์๊ณ ์กฐํํ ์ ์์ด์ ์กฐํ ์ฑ๋ฅ์ด ๋น ๋ฆ
๋๋ค.
- select * from item where ..
- ์กฐํ ์ฟผ๋ฆฌ๊ฐ ๋จ์ํฉ๋๋ค.
๋จ์
- ์์ ์ํฐํฐ๊ฐ ๋งคํํ ์ปฌ๋ผ์ ๋ชจ๋ null์ ํ์ฉํด์ผ ํฉ๋๋ค.
- ๋จ์ผ ํ ์ด๋ธ์ ๋ชจ๋ ๊ฒ์ ์ ์ฅํ๋ฏ๋ก ํ ์ด๋ธ์ด ์ปค์ง ์ ์์ต๋๋ค.
๊ตฌํ ํด๋์ค๋ง๋ค ํ ์ด๋ธ ์ ๋ต
์์ ์ํฐํฐ๋ง๋ค ํ ์ด๋ธ์ ๊ฐ๊ฐ ๋ง๋๋ ๋ฐฉ์์ ๋๋ค.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name="DTYPE")
public abstract class Item{
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
...
}
@Entity
public class Album extends Item {...}
@Entity
public class Movie extends Item {...}
@Entity
public class Book extends Item {...}
- @Inheritance.strategy๋ฅผ InheritanceType.TABLE_PER_CLASS ๋ก ์ค์ ํ๋ฉด ๊ตฌํ ํด๋์ค๋ง๋ค ํ ์ด๋ธ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
- ์ด ์ ๋ต์ ์์ ์ํฐํฐ๋ง๋ค ํ ์ด๋ธ์ ๋ง๋ญ๋๋ค.
- not null ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๊ณ , ์๋ธํ์ ์ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌํ ๋ ํจ๊ณผ์ ์ ๋๋ค.
์ฌ๋ฌ ์์ ํ ์ด๋ธ์ ํจ๊ป ์กฐํํ ๋ UNION์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋๋ฆฌ๊ณ ์์ ํ ์ด๋ธ์ ํตํฉํด์ ์ฟผ๋ฆฌํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด ์ ๋ต์ ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฐ ์ ๋ต๋ ์๊ตฌ๋ ์ ๋๋ก๋ง ์์๋ก์๋ค.
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ํ๋ก์(Proxy)์ ์ง์ฐ๋ก๋ฉ(Lazy Loading) (0) | 2023.05.04 |
---|---|
[JPA] ๊ณ ๊ธ ๋งคํ : ๋งคํ ์ ๋ณด๋ง ์ ๊ณตํ๊ธฐ using @MappedSuperClass (0) | 2023.05.03 |
[JPA] ๋ค๋๋ค ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2023.05.02 |
[JPA] ๋ค๋์ผ, ์ผ๋๋ค, ์ผ๋์ผ (๋จ๋ฐฉํฅ, ์๋ฐฉํฅ) ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2023.05.01 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ - ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (1) | 2023.04.30 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
Dongwoongkim