์ฐ๊ด๊ด๊ณ ๋งคํ
ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ํ๋ฉด, ์ธ๋ํค๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ๋ผ๋ฆฌ ์ฐ๊ด์ ๋งบ๋๊ฒ or ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ(์ฃผ์)์ ์ฌ์ฉํ์ฌ ์ฐ๊ด์ ๋งบ๋๊ฒ.
์ฐ๊ด๊ด๊ณ ๋ฐฉํฅ (Direction)
โฃ ๋จ๋ฐํฅ ์ฐ๊ด๊ด๊ณ
→ ํ์ชฝ๋ง ์ฐธ์กฐํ๋๊ฒ
→ ๊ฐ์ฒด ๊ด๊ณ
โฃ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
→ ์๋ก ์ฐธ์กฐํ๋๊ฒ
→ mappedBy ์์ฑ ์ฌ์ฉ
→ ํ
์ด๋ธ ๋ผ๋ฆฌ ์ฐ๊ด๊ด๊ณ ๋งบ๊ธฐ (์ธ๋ํค ์ด์ฉ) = ์๋ก ๋ค๋ฅธ ๋จ๋ฐฉํฅ ๊ด๊ณ 2๊ฐ
๋ค์ค์ฑ (Multiplicity)
โฃ ๋ค๋์ผ (N:1)
→ ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ
→ @ManyToOne ์ผ๋ก ํํ
→ N ์ ์ธ๋ํค ์กด์ฌ = ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ
→ @ManyToOne ๊ธฐ๋ณธ ํ์น์ ๋ต: ์ฆ์๋ก๋ฉ (EAGER)
โฃ ์ผ๋๋ค (1:N)
→ ๋จ๋ฐฉํฅ(@JoinColumn ๋ช
์ ํ์), ์๋ฐฉํฅ(=์กด์ฌํ์ง ์์. ๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํด์ผํจ)
→ @OneToMay ์ผ๋ก ํํ
→ N ์ ์ธ๋ํค ์กด์ฌ = ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ
→ @OneToMany ๊ธฐ๋ณธ ํ์น์ ๋ต: ์ง์ฐ๋ก๋ฉ (LAZY)
→ ์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ๋ณด๋จ, ๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํ๋๋ก ํ์! (์ธ๋ํค ๊ด๋ฆฌํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ด๋ค.)
โฃ ์ผ๋์ผ (1:1)
→ ์ฃผํ
์ด๋ธ or ๋์ํ
์ด๋ธ ์์ ์ธ๋ํค ๊ฐ์ง ์ ์์.
→ @OneToOne ์ผ๋ก ํํ
→ @OneToOne ๊ธฐ๋ณธ ํ์น์ ๋ต: ์ฆ์๋ก๋ฉ (EAGER)
โฃ ๋ค๋๋ค (N:N)
→ ๋จ๋ฐฉํฅ, ์๋ฐฉํฅ (๋ค๋๋ค ์๋ฐฉํฅ์ ์ผ๋๋ค ์๋ฐฉํฅ๊ณผ ๊ฐ์)
→ @ManyToMany ์ผ๋ก ํํ
→ N:N ์ฌ์ด ์ค๊ฐ ํ
์ด๋ธ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ.
→ ์๋ณ๊ด๊ณ์ ๋น์๋ณ๊ด๊ณ๊ฐ ์๋ค.
→ @ManyToMany ๊ธฐ๋ณธ ํ์น์ ๋ต: ์ง์ฐ๋ก๋ฉ (LAZY)
์ฐ๊ด๊ด๊ณ ๋งคํ ๊ด๋ จ ์ด๋ ธํ ์ด์
@ManyToOne(optional="false ๋ฆฌ๋ฉด ์ฐ๊ด๋ ์ํฐํฐ๊ฐ ํญ์ ์์ด์ผ ํ๋ค. ๊ธฐ๋ณธ๊ฐ: true",
fetch="๊ธ๋ก๋ฒ ํ์น ์ ๋ต(EAGER, LAZY)",
cascade="์์์ฑ ์ ์ด ๊ธฐ๋ฅ ์ฌ์ฉ", targetEntity="์ฐ๊ด๋ ์ํฐํฐ์ ํ์
์ ๋ณด ์ค์ (๊ฑฐ์์ฌ์ฉ์ํจ).")
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
@ManyToOne(fetch = FetchType.LAZY)
@ManyToMany(mappedBy = "items")
@JoinColumn(name="๋งคํํ ์ธ๋ ํค ์ด๋ฆ",
referencedColumnName="์ธ๋ํค๊ฐ ์ฐธ์กฐํ๋ ๋์ ํ
์ด๋ธ์ ์ปฌ๋ผ๋ช
",
foreignKey="์ธ๋ํค์ ์ฝ์กฐ๊ฑด์ ์ง์ ์ง์ ํ ์ ์๋ค. ์ด ์์ฑ์ ํ
์ด๋ธ์ ์์ฑํ ๋๋ง ์ฌ์ฉํ๋ค.")
/**
- ๊ทธ์ธ์์ฑ
unique, nullable, insertable, updatable, columnDefinition, table..
*/
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name="item_id")
)
// ๋ถ๋ชจ ๊ฐ์ฒด์ ์ค์
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // ํํ
์ด๋ธ์ ์ปฌ๋ผ ๋ค ๋๋ ค๋ฐ์
@DiscriminatorColumn(name = "dtype") // ํ์ ์์ํ
์ด๋ธ๋ค ํ์
..
// ์์๊ฐ์ฒด์๋ค๊ฐ ์ค์
@DiscriminatorValue("A")
@Enumerated(EnumType.STRING)
@Embedded
@Id @GeneratedValue
@Column(name = "order_id")
private Long id;
์ฐ๊ด๊ด๊ณ ์ฃผ์ธ (Owner) vs ์ฃผ์ธ์ด ์๋์ชฝ
โฃ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
→ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ด๊ด๊ณ์ ๋งคํ๋๊ณ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ(๋ฑ๋ก,์์ ,์ญ์ )๋ฅผ ํ ์์๋ค.
→ mappedBy ์์ฑ์ ์ฌ์ฉํ์ง ์๋๋ค.
→ ์ธ๋ํค ๊ด๋ฆฌ์๋ฅผ ์ ํ ํ๋๊ฒ์ด๋ค.
→ ์ธ๋ํค์ ์์น์ ๊ด๋ จํด์ ์ ํด์ผํ๊ณ , ๋น์ง๋์ค ์ค์๋๋ก ์ ๊ทผํ๋ฉด ์๋จ
โฃ ์ฃผ์ธ์ด ์๋ ์ชฝ
→ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
→ mappedBy ์์ฑ์ ์ฌ์ฉ ํ์ฌ ์์ฑ์ ๊ฐ์ผ๋ก ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ง์ ํ ์ ์๋ค.
ํ๋ก์
์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋๊ฒ์ด ์๋๋ผ, ์ค์ ์ฌ์ฉํ๋ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ ์ ์์
ํ๋ก์ ๊ฐ์ฒด
โฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ง์ฐํ ์ ์๋ ๊ฐ์ง ๊ฐ์ฒด(์ง์ฐ๋ก๋ฉ์์ ์ฌ์ฉ). ์ค์ ์ํฐํฐ ํด๋์ค๋ฅผ ์์๋ฐ์ ๋ง๋ค์ด์ ธ์์.
โฃ ์ง์ง๊ฐ์ฒด์ธ์ง, ํ๋ก์ ๊ฐ์ฒด์ธ์ง ๊ตฌ๋ถํ์ง ์๊ณ ์ฌ์ฉ ๊ฐ๋ฅ
โฃ EntityManager.getReference(): ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๊ณ ์ถ์๋ ์ฌ์ฉ. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
โฃ ์ฒ์ ์ฌ์ฉํ ๋ ํ๋ฒ๋ง ์ด๊ธฐํ → ์ด๊ธฐํ๋๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด ์ค์ ์ํฐํฐ์ ์ ๊ทผ ๊ฐ๋ฅ.
โฃ ์์์ฑ ์ปจํ
์คํธ์ ์ฐพ๋ ์ํฐํฐ๊ฐ ์ด๋ฏธ ์์ผ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ ํ์๊ฐ ์์ผ๋ฏ๋ก
em.getReference()์ ํธ์ถํด๋ ํ๋ก์๊ฐ ์๋ ์ค์ ์ํฐํฐ๋ฅผ ๋ฐํํจ.
์ฆ์๋ก๋ฉ(FetchType.EAGER) ๊ณผ ์ง์ฐ๋ก๋ฉ(FetchType.LAZY)
โฃ ์ฆ์๋ก๋ฉ(FetchType.EAGER)
→ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์กฐํ
→ ํ์ด๋ฒ๋ค์ดํธ๋ ๊ฐ๋ฅํ๋ฉด SQL ์กฐ์ธ์ ์ฌ์ฉํด์ ํ ๋ฒ์ ์กฐํ
→ ์ฐ๊ด๋ ์ํฐํฐ๊ฐ ํ๋๋ฉด ์ฆ์๋ก๋ฉ ์ฌ์ฉ
โฃ ์ง์ฐ๋ก๋ฉ(FetchType.LAZY)
→ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ค์ ์ฌ์ฉํ ๋ ์กฐํ
→ ํ๋ก์๋ฅผ ์ค์ ์ฌ์ฉํ ๋ ์ด๊ธฐํํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํ
→ ์ฐ๊ด๋ ์ํฐํฐ๊ฐ ์ปฌ๋ ์
์ด๋ฉด ์ง์ฐ๋ก๋ฉ ์ฌ์ฉ
โฐ ์ง์ฐ๋ก๋ฉ์ ์ฌ์ฉํ๋๋ก ํ์. (N+1๋ฌธ์ ๋ฐฉ์ง)
โฐ ์ปฌ๋ ์
์ ํ๋์์ ๋ฐ๋ก ์ด๊ธฐํ๋ฅผ ํ๋๋ก ํ์. (ex. Apple apple = new Apple();)
โฐ ๋ง์ฝ ์ํฐํฐ์กฐํ์, ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์กฐํํด์ผํ๋ค๋ฉด fetch join์ ์ฌ์ฉํ์.
์ฐธ๊ณ
- ์ฑ : http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
- ๋งํฌ: https://velog.io/@lsj8367/JPA-%ED%94%84%EB%A1%9D%EC%8B%9C
'๊ฐ๋ฐ > jpa' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ฐ์ฒด์งํฅ ์ธ์ด - JPQL (0) | 2022.03.02 |
---|---|
[JPA] ๋ณ๊ฒฝ๊ฐ์ง (save() ์ ํ์ง ์์๋๋ฐ db์ ์ ์ฅ?) (0) | 2022.02.20 |
[JPA] ์์์ฑ ๊ด๋ฆฌ (0) | 2022.02.20 |