ํ๋ก์
Team์ ์ํด์๋ Member ๋ฅผ ์กฐํํ ์ Team๊น์ง ์กฐํํ ํ์๊ฐ ์์๊น?
๋น์ง๋์ค ๋ก์ง์์ ํ์ํ์ง ์์ ๋๊ฐ ์๋๋ฐ ํญ์ Team์ ํจ๊ป ์กฐํํ๋ค๋ฉด ๋ญ๋น๊ฐ ๋ฐ์๋๋ค.
์ด ๋ญ๋น๋ฅผ ํ์ง ์๊ธฐ ์ํด ํ๋ก์๋ผ๋ ๊ฐ ๋ฉฐ์ผ๋ก ํด๊ฒฐํ๋ค.
- ์ค์ ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฒ ๋ชจ์์ด ๊ฐ๋ค
- ์ฌ์ฉํ๋ ์ ์ฅ์์๋ ์ง์ง, ๊ฐ์ง ๊ฐ์ฒด์ธ์ง ๊ตฌ๋ถํ์ง ์๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ณด๊ด -> ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ
em.find() : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ ๊ฐ์ฒด ์กฐํ
em.getReference() : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฐ์ง(ํ๋ก์) ์ํฐํฐ ๊ฐ์ฒด ์กฐํ
// ํธ์ถํ ์๊ฐ ์ฟผ๋ฆฌ ์คํ
Member findMember = em.find(Member.class, member.getId());
// ํธ์ถํ์ ๋ ์คํ ์ํจ
Member findMember2 = em.getReference(Member.class, member.getId());
// ์ด๋ ์ฟผ๋ฆฌ ์คํ ํจ -> ์ค์ ํ์ํ ์์ ์ ์ฟผ๋ฆฌ ์คํ
System.out.println("findMember = " + findMember.getName());
ํ๋ก์ ๊ฐ์ฒด์ ์ด๊ธฐํ
Client์์ Member์ ์ด๋ฆ์ ์์ฒญํ์ ๋ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ผ ๋จผ์ ์ด๊ธฐํ๋ฅผ ์์ฒญํ ํ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ค์ Entity๋ฅผ ๋ง๋ ๊ฒ์ ์ฌ์ฉํด์ ์ด๊ธฐํ๋ฅผ ํ๋ค. ๊ทธ ์ดํ๋ก ์ด๋ฆ์ ์์ฒญํ์ ๋ taget์ผ๋ก ๋์ด์๋ Member๋ฅผ ์กฐํํ๊ธฐ ๋๋ฌธ์ ๋ค์ DB์กฐํ๋ฅผ ํ์ง ์์๋ ๋๋ค.
ํ๋ก์์ ํน์ง
- ํ๋ก์ ๊ฐ์ฒด๋ ์ฒ์ ์ฌ์ฉํ ๋ ํ ๋ฒ๋ง ์ด๊ธฐํ
- ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ๋, ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ค์ ์ํฐํฐ๋ก ๋ฐ๋๋ ๊ฒ์ ์๋ -> ์ด๊ธฐํ๋๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ์ ์ ๊ทผ ๊ฐ๋ฅ
- ํ๋ก์ ๊ฐ์ฒด๋ ์๋ณธ ์ํฐํฐ๋ฅผ ์์๋ฐ์, ๋ฐ๋ผ์ ํ์ ์ฒดํฌ์ ์ฃผ์ํด์ผํจ ( == ๋น๊ต ๋์ instance of ์ฌ์ฉ )
Member m1 = em.find(Member.class, member1.getId());
Member m2 = em.find(Member.class, member2.getId());
Member reference1 = em.getReference(Member.class, member1.getId());
Member reference2 = em.getReference(Member.class, member2.getId());
// true
System.out.println("m1 == m2 : "+(m1.getClass() == m2.getClass()));
// false
System.out.println("reference1 == reference2 : " +(m1.getClass() == reference2.getClass()));
// true
System.out.println("reference1 == reference2 : " +(m1 instanceof Member));
// true
System.out.println("reference1 == reference2 : " +(m2 instanceof Member));
ํ๋ผ๋ฏธํฐ๋ก ํ๋ก์๋ก ๋ค์ด์ฌ์ง ์ค์ ๋ก ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ == ๋น๊ต๋ ์ ๋ ์ฌ์ฉํ์ง ๋ง๊ฒ
ํ์ ์ ๋น๊ตํ ๋๋ ๊ผญ instanceof ๋ฅผ ์ฌ์ฉํด๋ผ!
- ์์์ฑ ์ปจํ ์คํธ์ ์ฐพ๋ ์ํฐํฐ๊ฐ ์ด๋ฏธ ์์ผ๋ฉด em.getreference()๋ฅผ ํธ์ถํด๋ ์ค์ ์ํฐํฐ๊ฐ ๋ฐํํ๋ค.
// m1.getClass -> ์ค์ ํด๋์ค ๋ฐํ
Member m1 = em.find(Member.class, member1.getId());
// m1.getClass -> ์ค์ ํด๋์ค ๋ฐํ
Member reference = em.getReference(Member.class,member1.getId());
* ํ ์์์ฑ ์ปจํ ์คํธ์์ ํธ์ถํ๊ณ , PK๊ฐ ๊ฐ๋ค๊ณ ํ๋ค๋ฉด ์ด๋ฏธ ์์์ฑ ์ปจํ ์คํธ์ ์๋ ๊ฐ์ฒด๋ฅผ ํ๋ก์๋ก ๋ฐํํด๋ดค์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ํด๋์ค๋ฅผ ๋ฐํํ๋ค.
* JPA๋ ํ๋์ ์์์ฑ ์ปจํ ์คํธ์์ ์กฐํํ๋ ๊ฐ์ ์ํฐํฐ์ ๋์ผ์ฑ์ ๋ณด์ฅํ๋ค.
๋ฐ๋๋ก ์๋์ ๊ฐ์ด proxy ๊ฐ์ฒด๋ฅผ ๋จผ์ ํธ์ถํ๊ณ ์ค์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๊ฒ ๋๋ค๋ฉด?
// m1.getClass -> Proxy ๊ฐ์ฒด ๋ฐํ
Member reference = em.getReference(Member.class,member1.getId());
// m1.getClass -> Proxy ๊ฐ์ฒด ๋ฐํ
Member m1 = em.find(Member.class, member1.getId());
- ์์์ฑ ์ปจํ ์คํธ์ ๋์์ ๋ฐ์ ์ ์๋ ์ค์์ ์ํ์ผ ๋, ํ๋ก์๋ฅผ ์ด๊ธฐํํ๋ฉด ๋ฌธ์ ์
-> clear ํ์ getName์ ์กฐํํ๋ฉด not initialize proxy ์๋ฌ๊ฐ ๋ฌ๋ค.( ๋์ด์ ์ปจํ ์คํธ์ ๋์์ ๋ฐ์ง ๋ชปํจ)
Member reference1 = em.getReference(Member.class, member1.getId());
System.out.println(reference1.getClass());
em.clear();
System.out.println(reference1.getName());
ํ๋ก์ ํ์ธ
- ํ๋ก์ ์ธ์คํด์ค์ ์ด๊ธฐํ ์ฌ๋ถ ํ์ธ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
PersistenceUnitUtil persistenceUnitUtil = emf.getPersistenceUnitUtil();
Member reference1 = em.getReference(Member.class, member1.getId());
System.out.println(reference1.getName());
// true
System.out.println(persistenceUnitUtil.isLoaded(reference1));
- ํ๋ก์ ํด๋์ค ํ์ธ ๋ฐฉ๋ฒ
entitiy.getClas().getName() ์ถ๋ ฅ
- ํ๋ก์ ๊ฐ์ ์ด๊ธฐํ
ํด๋น entity๋ฅผ ๊ฐ์ ์ด๊ธฐํ ํ๋ค.
Hibernate.initalize(member);
์ฆ์ ๋ก๋ฉ๊ณผ ์ง์ฐ ๋ก๋ฉ
* Member์ Team์์ Team์ ์ ์ฌ์ฉํ์ง ์๋๋ค ํ์ ๋
์ง์ฐ ๋ก๋ฉ LAZY์ ์ฌ์ฉํด์ ํ๋ก์๋ก ์กฐํ
Member ์ ManyToOne ๊ด๊ณ์ ์๋ Team์ ์กฐํํ ๋ ํ๋ก์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค. ๋ผ๊ณ ์ ์ ํ๋ ๊ฒ์ด๋ค.(Member๋ง DB์์ ์กฐํ)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
- ์๋์ ๊ทธ๋ฆผ ์ฒ๋ผ Member๋ง ์กฐํ ํ์ ๋ ์ฐ๊ด๊ด๊ณ์ ์๋ Team์ ์กฐํํ์ง ์๊ณ Member ๋ง์ ์กฐํํ๋ค. (Team๋ ๊ฐ์ง์ธ proxy๊ฐ์ฒด๊ฐ ์์ด์ ์กฐํ๋์ง ์์)
- ๋ง์ฝ Member์์ Team ๊ด๋ จ ์กฐํ๋ฅผ ํ์ ๋ ๊ทธ ์์ ์์ ์ด๊ธฐํ๊ฐ ๋๋ค( DB์์ ์ง์ ์กฐํ )
* Member์ Team์์ ์์ฃผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด?
์ฆ์ ๋ก๋ฉ EAGER๋ฅผ ์ฌ์ฉํด์ ํจ๊ป ์กฐํ ( Proxy๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค )
- ๊ฐ๋ฅํ๋ฉด JPA๋ ์กฐ์ธ์ผ๋ก ํ๋ฒ์ ์กฐํํ๋ค.
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
* ์ฃผ์ํ ์
- ๊ฐ๊ธ์ ์ง์ฐ ๋ก๋ฉ๋ง ์ฌ์ฉ ํ๋ค. -> Member์ Team์ ๊ฐ์ด ์กฐํํ๊ณ ์ถ๋ค๋ฉด JPQL fetch join์ด๋ ์ํฐํฐ ๊ทธ๋ํ ๊ธฐ๋ฅ์ผ๋ก ํด๊ฒฐํ๋ค.
- ์ฆ์ ๋ก๋ฉ์ ์ ์ฉํ๋ฉด ์์ํ์ง ๋ชปํ SQL ๋ฐ์
- ์ฆ์ ๋ก๋ฉ์ JPQL์์ N+1 ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
- @ManyToOne, @OneToOne ์ ๊ธฐ๋ณธ์ด ์ฆ์ ๋ก๋ฉ --> LAZY๋ก ์ค์
- @OneToMany, @ManyToMany ๋ ๊ธฐ๋ณธ์ด ์ง์ฐ ๋ก๋ฉ
์์์ฑ ์ ์ด : CASCADE
ํน์ ์ํฐํฐ๋ฅผ ์์ ์ํ๋ก ๋ง๋ค ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์์ ์ํ๋ก ๋ง๋ค๊ณ ์ถ์ ๋
-> ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ ์ฅํ ๋ ์์ ์ํฐํฐ๋ ํจ๊ป ์ ์ฅํ๋ค.
์๋์ ๊ฐ์ด ์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค.
@Entity
public class Parent{
@OneToMany(mappedBy="parent",cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
public void addChild(Child child){
childList.add(child);
child.setParent(this);
}
์ฌ๊ธฐ์ cascade๋ฅผ ๊ฑธ์ด์ฃผ๋ฉด Parent๋ฅผ persistํ ๋ Child๋ ๊ฐ์ด persist ํด์ค๋ค.
์ฃผ์ ) ์์์ฑ ์ ์ด๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งคํํ๋ ๊ฒ๊ณผ ์๋ฌด ๊ด๋ จ์ด ์์!!!
๊ทธ์ ์ํฐํฐ๋ฅผ ์์ํํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์์ํ ์ํค๋ ํธ๋ฆฌํจ์ ์ ๊ณตํ ๋ฟ์ด๋ค.
CASCADE์ ์ข ๋ฅ
- ALL - ๋ชจ๋ ์ ์ฉ * ํด๋น ์ํฐํฐ์ ๋ผ์ดํ์ฌ์ดํด์ด ๊ฐ์ ๋ ์ฌ์ฉํ๋ค -> ํด๋น ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ๊ณณ์์๋ ์ฌ์ฉ๋ ๋ ์ฌ์ฉ X
- PERSIST - ์์ * ์ ์ฅํ ๋๋ง ์ธ๊ฒ (์ญ์ ์ ๋ํด ์กฐ์ฌํ ๋)
- REMOVE - ์ญ์
๋ฑ ๋ค๋ฅธ ์ข ๋ฅ๋ ์์ง๋ง ๋ณดํต ALL or PERSIST๋ฅผ ์ฌ์ฉํ๋ค.
๊ณ ์ ๊ฐ์ฒด
๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ : ๋ถ๋ชจ ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ๊ฐ ๋์ด์ง ์์ ์ํฐํฐ๋ฅผ ์๋์ผ๋ก ์ญ์
Cascade ์ orphanRemoval๋ฅผ๊ฑธ์ด์ค๋ค.
@OneToMany(mappedBy="parent",cascade = CascadeType.ALL, orphanRemoval=true)
๋ก์ง์์ Parent ์ Child List ์์ ์ ํํ Child ์์๋ฅผ remove ํ๋ฉด DB์์๋ ์ญ์ ๊ฐ ๋๋ค.
( ์ปฌ๋ ์ ์์ remove ํ๋๋ฐ๋ DB์์ ๊ฐ์ด ์ฌ๋ผ์ง)
* ์ฃผ์ *
- ์ฐธ์กฐํ๋ ๊ณณ์ด ํ๋์ผ ๋ ์ฌ์ฉํด์ผํจ!
- ํน์ ์ํฐํฐ๊ฐ ๊ฐ์ธ ์์ ํ ๋ ์ฌ์ฉ
- @OneToOne, @OneToMany๋ง ๊ฐ๋ฅํ๋ค.
- CascadeType.Remove์ฒ๋ผ ์๋ํ๋ค.
์์์ฑ ์ ์ด + ๊ณ ์ ๊ฐ์ฒด, ์๋ช ์ฃผ๊ธฐ
๋๋ค ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ํตํด์ ์์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
์๋ฅผ ๋ค์ด์ ๋ถ๋ชจ ์ํฐํฐ๊ฐ Repository๋ฅผ ์ด์ฉํ์ฌ ์ญ์ ๋ฅผ ํ์ ๋ ์์์ Repository๋ฅผ ๋ง๋ค ํ์ ์์ด ์ง์์ง๊ฒ ๋๋ค.
'๐ WEB > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Hibernate ์์ ์ ๊ณตํ๋ @NotNull & @NotEmpty & @NotBlank ์ฌ์ฉํ๊ธฐ (0) | 2022.08.16 |
---|---|
[Querydsl] ๋ด๊ฐ ์ฐพ์ ์ฐ๋ ค๊ณ ์ ๋ฆฌํ ๊ธ (0) | 2022.03.15 |
6. ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ณ ๊ธ๋งคํ (0) | 2021.05.17 |
5. ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2021.05.14 |
4. ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ์ฐ๊ด๊ด๊ณ (0) | 2021.05.14 |