๐ค ๋ฌธ์ ์ํฉ
JPA๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋, ์ง์ ์ฐธ์กฐ
์ ๊ฐ์ ์ฐธ์กฐ
๊ฐ๊ฐ ์ด๋๋์ ์ฌ์ฉํ๋ฉด ์ ์ ํ ์ง์ ๋ํ ๊ณ ๋ฏผ์ด ์๊ฒผ๋ค.
๋๋ถ์ด ํ์ฌ์์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ค๊ฐ ๊ฐ์ ์ฐธ์กฐ๋ก ์ค๊ณ๋ฅผ ํ ํ์์ ์ฝ๋์ ์ ์ฌ๊ธฐ์ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ํ๋์?
or ์ ์ฌ๊ธฐ๋ ์ง์ ์ฐธ์กฐ๋ฅผ ํ๋์?
๋ฑ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๊ณ ๋๋ ์๋ฌด ์๊ฐ์์ด ๊ฐ์ฒด๊ฐ ์ค๊ณ๋ฅผ ํ๊ณ ์๋ ๊ฒ์ ์๋๊ฐ ํ๋ ์๊ฐ์ด ๋ค์๋ค.
๐๏ธ ๋์ ์๊ฐ
์ฐ์ ๊ฐ ์ฉ์ด์ ๋ป์ ๋ณด์๋ฉด
- ์ง์ ์ฐธ์กฐ : ๋ง ๊ทธ๋๋ก Entity๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ง์ ์ ์ผ๋ก ํ๋ ๊ฒ์ด๋ค. ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ JPA ์ฌ์ฉ์
@OneToOne
/@ManyToOne
๋ฑ์ ์ด๋ ธํ ์ด์ ์ ์จ์ ๋งคํ(์ฐธ์กฐ)๋ฅผ ํ๋ ๊ฒ์ ๋งํ๋ค. - ๊ฐ์ ์ฐธ์กฐ : ์ง์ ์ฐธ์กฐ์ ๋ฐ๋์ ์๋ฏธ๋ก, ์ธ๋ํค(FK)๋ฅผ ๋งบ์ง ์๊ณ ๋ค๋ฅธ Entity์ (๋ ๋์๊ฐ์๋ ๋ค๋ฅธ ๋ฃจํธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ) ์๋ณ์(PK)๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ด๋ค.
- ์ฌ๊ธฐ์
์ ๊ทธ๋ฆฌ๊ฑฐํธ
๋ ๊ด๋ จ ๋๋ฉ์ธ์ ํ๋์ ๊ตฐ์ง์ผ๋ก ๋ฌถ์ ๊ฒ์ ๋งํ๋ค.
- ์ฌ๊ธฐ์
์ ๋๊ฐ์ง ์ฉ์ด๊ฐ ์ค์ ๋ก ๊ฐ์ฅ ๋ง์ด ๋์ค๋ ๋ถ๋ถ์ด DDD(๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ) ๊ด์ ์์์ ๊ฐ๋ฐ์ ํ ๋์ด๋ค.
๋ฃจํธ ์ํฐํฐ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ํ ์ํฐํฐ์ด๋ค. ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ํ ์ํฐํฐ๋ ๋ฃจํธ ์ํฐํฐ์ ์ง/๊ฐ์ ์ ์ผ๋ก ์ํ๋ค.
ํ์ง๋ง ๊ฐ๋ ์ ์ผ๋ก๋ง ์๊ฐํ๋ฉด ๋๋ฉ์ธ์ ์ค๊ณ์ ํฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ ๊ฐ์ง๋ง ์ค์ ์ฝ๋๋ก ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๊ทธ ๊ธฐ์ค์ด ๋ชจํธํด์ง๋ ์๊ฐ์ด ์ค๊ฒ๋๋ค.
๐ง ์ง์ ์ฐธ์กฐ์ ๊ฐ์ ์ฐธ์กฐ์ ์ ํ ๊ธฐ์ค
๋ด๊ฐ ๊ฒฝํํด๋ณด๊ณ ๋๋ ์ ์ ํตํด ์ ๋ฐ์ ์ธ ์ ํ ๋ฐฉ๋ฒ์ ์๊ฐํ์๋ฉด
์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฒฝ๊ณ
- ์ง์ ์ฐธ์กฐ: ๊ฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ด๋ถ์ ์ํฐํฐ๋ค ๊ฐ์๋ ์ง์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ผ๊ด์ฑ๊ณผ ์์ง๋๋ฅผ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ค๊ณ ๋๊ผ๋ค.
- ๊ฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ด์ ์ํฐํฐ๋ค์ ์ฃผ๋ก ์๋ช ์ฃผ๊ธฐ๊ฐ ๋น์ทํ๊ฑฐ๋ ์กฐํ์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ๊ฐ์ ์ฐธ์กฐ: ์๋ก ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ํ ์ํฐํฐ๋ค ๊ฐ์๋ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ๋
๋ฆฝ์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋๋ค.
- ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ด์ ์ํฐํฐ๋ค์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ค๋ฅด๊ณ , ์กฐํ์์๋ ์ฐธ๊ณ ํ ์ ์๋ ์๋ณ์(PK)์ ๋๋ง ์์ด๋ ์ถฉ๋ถํ๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
- ์ง์ ์ฐธ์กฐ: ์์ฃผ ํจ๊ป ์กฐํ๋๋ ์ํฐํฐ๋ค ๊ฐ์๋ ์ง์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ด์ ์ด ์์ ์ ์๋ค. JPA์ ์ง์ฐ ๋ก๋ฉ(lazy loading)์ ํ์ฉํ์ฌ ์ฑ๋ฅ์ ๊ทน๋ํ ์ํฌ ์ ์๋ค.
- ๊ฐ์ ์ฐธ์กฐ: ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ฑฐ๋, ํน์ ์ํฐํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ฐธ์กฐ๊ฐ ์ ๋ฆฌํ ์ ์๋ค. ๋ถํ์ํ ๋ฐ์ดํฐ ๋ก๋ฉ์ ๋ฐฉ์งํ๊ณ ์์คํ ์ ํ์ฅ์ฑ์ ๋์ผ ์ ์๋ค.
๋น์ฆ๋์ค ๊ท์น๊ณผ ๋๋ฉ์ธ ๋ชจ๋ธ
- ์ง์ ์ฐธ์กฐ: ๋น์ฆ๋์ค ๊ท์น์ ๊ฐํ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ์ํฐํฐ๋ค ์ฌ์ด์์๋ ์ง์ ์ฐธ์กฐ๊ฐ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ ๋ช ํํ๊ฒ ํํํ ์ ์๋ค.
- ๊ฐ์ ์ฐธ์กฐ: ๋์จํ ์ฐ๊ด ๊ด๊ณ๋ ์ ํ์ ์ธ ๊ด๊ณ๋ฅผ ํํํ ๋๋ ๊ฐ์ ์ฐธ์กฐ๊ฐ ์ ํฉํ ์ ์๋ค.
๐บ๏ธ ์ค์ ์ ์ฉ ์ฌ๋ก
๐ชก ์ง์ ์ฐธ์กฐ ์ฌ๋ก
@Entity
public class Order {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Customer customer;
// ... ๊ธฐํ ํ๋์ ๋ฉ์๋
}
์ด ๊ฒฝ์ฐ, Order
์ Customer
์ฌ์ด์ ๊ฐํ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๊ณ , ์ฃผ๋ฌธ์ ์กฐํํ ๋ ๋๋ถ๋ถ ๊ณ ๊ฐ ์ ๋ณด๋ ํจ๊ป ํ์ํ๋ค๊ณ ํ๋จ๋์ด ์ง์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
๐ช ๊ฐ์ ์ฐธ์กฐ ์ฌ๋ก
@Entity
public class Review {
@Id
@GeneratedValue
private Long id;
private Long productId; // Product์ ID๋ง ์ฐธ์กฐ
// ... ๊ธฐํ ํ๋์ ๋ฉ์๋
}
์ด ์์์๋ Review
์ Product
๊ฐ ์๋ก ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค. ๋ฆฌ๋ทฐ๋ ์ ํ์ ์ ์ฒด ์ ๋ณด๊ฐ ์๋ ์๋ณ์ID๋ง ์๋ฉด ์ถฉ๋ถํ๋ฏ๋ก ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
๐ฏ ๊ฒฐ๋ก
์ง์ ์ฐธ์กฐ์ ๊ฐ์ ์ฐธ์กฐ์ ์ ํ์ ๋จ์ํ ๊ธฐ์ ์ ์ธ ๊ฒฐ์ ์ด ์๋๋ผ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ค๊ณ์ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ค.
๊ฐ ๋ฐฉ์์ ์ฅ๋จ์ ์ ์ดํดํ๊ณ , ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ๊ณผ ๋๋ฉ์ธ ํน์ฑ์ ๋ง๊ฒ ์ ์ ํ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค.
- ๊ฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ด๋ถ: ์ง์ ์ฐธ์กฐ ์ ํธ
- ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฐ: ๊ฐ์ ์ฐธ์กฐ ์ ํธ
- ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ: ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ์ ํ
- ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ช ํ์ฑ: ๋น์ฆ๋์ค ๊ท์น์ ์ ํํํ ์ ์๋ ๋ฐฉ์ ์ ํ
๊ฒฐ๊ตญ, ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ์ค๊ณํ ๋ "์ ์ด๋ ๊ฒ ์ค๊ณํ๋์ง"
์ ๋ํ ๋ช
ํํ ์ด์ ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ์ด๋ ์ฃผ๋์ ์ด๊ณ ์์์ ์ธ ๊ฐ๋ฐ๊ณผ ๋ ๋์๊ฐ ์ ์ฒด ์์คํ
์ ๊ฒฌ๊ณ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค!