JPA #7 ๊ณ ๊ธ ๋งคํ (์์ ๊ด๊ณ)
by JiwonDev๐ DB์์์ ์์ ๊ตฌํ
์ฐ์ , DB์๋ ๊ฐ์ฒด์ฒ๋ผ ์์์ด๋ผ๋ ๊ฐ๋ ์ด ์๋ค. ๊ตฌ์กฐ๊ฐ ๋น์ทํ๊ฒ ๋ณด์ผ ๋ฟ ์์์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
๊ฐ์ฒด๋ ์์๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๊ตฌํ๊ฐ๋ฅํ์ง๋ง, DB์์๋ ์์์ ๋ง๋ค๋ ค๋ฉด 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
๊ทธ๋์ JPA๋ @Inheritance ์ต์ ์ ํตํด ์ ๋ต์ ์ ํํ ์ ์๊ฒ ๋ง๋ค์ด๋จ๋ค. ๋ฌผ๋ก ๋ฌด์จ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฐ์ฒด ์ํฐํฐ๋ ๋๊ฐ์ด ๋์ํ๋ค. DB๋ง ๋ค๋ฅผ ๋ฟ.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item{
...
}
@Entity
public class Movie extends Item{
...
}
@Entity
public class Album extends Item{
...
}
- JOINED, ์กฐ์ธ์ ๋ต (๊ฐ๊ฐ ํ ์ด๋ธ๋ก ๋ณํ, Super-Sub Type)
- SINGLE_TABLE, ๋จ์ผ ํ ์ด๋ธ ์ ๋ต (ํตํฉ ํ ์ด๋ธ ์ฌ์ฉ, SuperDTO)
- TABLE_PER_CLASS, ๊ตฌํ ํด๋์ค๋ณ ํ ์ด๋ธ ์ ๋ต (์๋ธํ์ ํ ์ด๋ธ๋ก ๋ณํ) - ์ฌ์ฉํ์ง ๋ง ๊ฒ. ๊ตฌ๋ฆฌ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ๊ฐ ์ต๋จ์๋ก ์์ด๊ณ , ํํฐ์ ๋ํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์์๊ด๊ณ ํ ์ด๋ธ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ธฐ ์ฝ๋ค. ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ ๊ทํํ๋๊ฒ ์ข์๊ฒ ์๋๋ผ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ฌ์ฉํด์ผํ๋ค.
โ ๋ฐ์ดํฐ ํ์ (DTYPE) ๊ฐ์ด ์ ๊ธฐ
์ฐธ๊ณ ๋ก ํ ์ด๋ธ์ ์์ ์ํฐํฐ๋ช (DTYPE)์ ํจ๊ป ๋ฃ์ด์ฃผ๋๊ฒ ์ข๋ค. JPA์์๋ ์๋์ ๊ฐ์ด ์ค์ ํด ์ค ์ ์๋ค.
๋จ์ผ ํ ์ด๋ธ ์ ๋ต์์๋ ํ์ ๊ตฌ๋ถ์ด ์ด๋ ค์์ ๋ฐ๋์ DTYPE์ ๋ฃ์ด์ค์ผํ๋ค. ๋ฌผ๋ก ์นผ๋ผ์ด๋ฆ์ ๋ค๋ฅธ๊ฑธ ์จ๋ ์๊ด์์
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name=“DTYPE”) // DB ์นผ๋ผ ์ถ๊ฐ
public class Item{
...
}
@Entity // ์๋ฌด๊ฒ๋ ์ ์ง์์ผ๋ฉด, ์ํฐํฐ ๋ช
(Movie)๊ฐ DTYPE์ ๋ค์ด๊ฐ๋ค.
public class Movie extends Item{
...
}
@Entity
@DiscriminatorValue(“Custom_Album”) // ์ด๋ ๊ฒ ์ํ๋ ์ด๋ฆ์ ๋ฃ์ด์ค์๋ ์๋ค.
public class Album extends Item{
...
}
๐ @MappedSuperClass, ์ธํฐํ์ด์ค์ฒ๋ผ ์ฌ์ฉํ๊ธฐ
JPA์์ ์์์ ์๋ 2๊ฐ์ง ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅํ๋ค.
- @Entity๋ฅผ ์์๋ฐ๋ ๊ฒฝ์ฐ
- @MappedSuperClass๋ฅผ ์์๋ฐ๋ ๊ฒฝ์ฐ
@MappedSuperClass๋ ์ํฐํฐ, ์์์ด๋์ ์๋ฌด๋ฐ ๊ด๋ จ์ด ์๊ณ ๊ณตํต ๋งคํ ์ ๋ณด๋ฅผ ํธํ๊ฒ ์ฌ์ฉํ ๋ ์ด์ฉํ๋ค.
๊ฐ์ฒด์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋ณต๋๋ ํ๋๋ค์ Interface๋ก ๋ฝ์ ์ฌ์ฉํ๋๊ฑฐ๋ ๋น์ทํ๋ค.
๋ฌผ๋ก @MappedSuperClass๋ฅผ ์ฌ์ฉํด๋ DBํ ์ด๋ธ์ ๋ณํจ์๋ค. ๊ทธ๋ฅ Member, Seller๊ฐ ๊ฐ๊ฐ ์๋ ๊ฑฐ๋ ๋์ผํ๋ค.
@MappedSuperclass
public class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
}
@Entity
public class Member extends BaseEntity {
// private String createdBy;
// private LocalDateTime createdDate;
private String email;
}
@Entity
public class Seller extends BaseEntity {
// private String createdBy;
// private LocalDateTime createdDate;
private String shopName;
}
์ด๋ ํธ์๊ธฐ๋ฅ์ ๊ฐ๊น์ด๊ฑฐ์ง, ์ํฐํฐ๋ฅผ ๋ง๋๋๊ฒ ์๋๋ค.
์์ ํด๋์ค์๊ฒ ๋งคํ ์ ๋ณด๋ง ์ ๊ณตํด์ค ๋ฟ, ์๋์ ๊ฐ์ ์กฐํ๋ ๋น์ฐํ ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ๊ฐ๋ฅํ๋ฉด public abstract class ์ฒ๋ผ ์ถ์ํด๋์ค๋ก ๋ง๋๋ ๊ฑธ ๊ถ์ฅํ๋ค. ์ด์ฐจํผ ์ง์ ์ฌ์ฉํ ์ผ์ด ์์ผ๋๊น
em.find(BaseEntity); // ๋ถ๊ฐ๋ฅ
์คํ๋ง์ด๋ ์คํ๋ง JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ธฐ๋ฅ์ ์ด์ฉํด ์ ๋ง ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๐ ์์ฝ
์์์ด๋ ๊ฐ๋ ์ ๊ฐ์ฒด์๋ง ์กด์ฌํ๋ค.
DB์์๋ ์๋ฒฝํ ์์์ ์ง์ํ์ง ์๊ณ , 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ์์๊ณผ ๋น์ทํ๊ฒ ๋์ํ๋๋ก ๊ตฌํํ๋ค.
๊ฐ์ฒด ๋๋ฉ์ธ ๋ชจ๋ธ์ด ์๋์ ๊ฐ๋ค๋ฉด
DB๋ ์๋์ ๊ฐ์ด ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ๋ ๋ค๋ฅผ ์ ์์์ ๊ธฐ์ตํ์. ( ์๋๋ ์ฑ๊ธ ํ ์ด๋ธ ์ ๋ต ์ฌ์ฉ )
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name=“DTYPE”) // DB ์นผ๋ผ ์ถ๊ฐ
public class Item{
...
}
@Entity
public class Movie extends Item{
...
}
@Entity
public class Album extends Item{
...
}
'๐ฑBackend > JDBC & JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA #9 ๊ฐ ํ์ , ์ปฌ๋ ์ , ์๋ฒ ๋๋ ํ์ (0) | 2021.11.09 |
---|---|
JPA #8 ํ๋ก์์ ์ง์ฐ๋ก๋ฉ (join fetch) (0) | 2021.11.09 |
JPA #6 ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ (1:N, N:1, N:N) (0) | 2021.11.09 |
JPA #5 ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ๋ฌธ์ ์ , ์ฐ๊ด ๊ด๊ณ ๋งคํ (0) | 2021.11.09 |
JPA #4 ์ํฐํฐ ๋งคํ (๊ฐ์ฒด-ํ ์ด๋ธ ๋งคํ) (0) | 2021.11.08 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev