ํ๋ก์

Member๋ฅผ ์กฐํํ ๋ Team๋ ํจ๊ป ์กฐํํด์ผ ํ ๊น?
--> ์ค์ ๋ก ํ์ํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
๋น์ฆ๋์ค ๋ก์ง์์ ํ์ํ์ง ์์ ๋๊ฐ ์๋๋ฐ, ํญ์ Team์ ํจ๊ป ๊ฐ์ ธ์์ ์ฌ์ฉํ ํ์๋ ์๋ค.
๋ญ๋น๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
JPA๋ ์ด ๋ญ๋น๋ฅผ ํ์ง ์๊ธฐ ์ํด, ์ง์ฐ๋ก๋ฉ๊ณผ ํ๋ก์๋ผ๋ ๊ฐ๋ ์ผ๋ก ํด๊ฒฐํ๋ค.
ํ๋ก์ ๊ธฐ์ด
์ง์ฐ ๋ก๋ฉ์ ์ดํดํ๋ ค๋ฉด, ํ๋ก์์ ๊ฐ๋ ์ ๋ํด์ ๋ช ํํ๊ฒ ์ดํดํด์ผ ํ๋ค.
em.find() vs em.getReference()
em.find() : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ค.
em.getReference() : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฐ์ง(ํ๋ก์) ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ค.
DB์ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์๋๋ฐ ๊ฐ์ฒด๊ฐ ์กฐํ๋๋ค !
Member findMember = em.getReference(Member.class, member.getId());
System.out.println("findMember = " + findMember.getName());
getReference() ํธ์ถํ๋ ์์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์๋๋ค.
๊ทธ๋ฐ๋ฐ ์กฐํํ ๊ฐ์ฒด(findMember)๊ฐ ์ค์ ์ฌ์ฉ๋๋ ์์ (getName()) ์ DB์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค.
ํ๋ก์ ํน์ง
ํ๋ก์๋ ์ค์ ์ํฐํฐ๋ฅผ ์์๋ฐ์์ ๋ง๋ค์ด์ง๋ค.
์ค์ ํด๋์ค์ ๊ฒ๋ชจ์์ด ๊ฐ๋ค.
์ฌ์ฉํ๋ ์ ์ฅ์์๋ ์ง์ง ๊ฐ์ฒด์ธ์ง ํ๋ก์ ๊ฐ์ฒด์ธ์ง ๊ตฌ๋ถํ์ง ์๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ์ฐธ์กฐ(target)์ ๋ณด๊ดํ๋ค.
ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
ex) getName() ํธ์ถ -> target์ ์๋ getName()์ ํธ์ถ
๊ทธ๋ฐ๋ฐ ์ฒ์์๋ target ์ ๊ฐ์ด ์๋ค.
ํ๋ก์ ๊ฐ์ฒด์ ์ด๊ธฐํ
Member findMember = em.getReference(Member.class, member.getId());
findMember.getName();
1. getName() ํธ์ถ์ ํ๋ค.
2. ํ๋ก์ ๊ฐ์ฒด์ target์ ๊ฐ์ด ์๋ค.
JPA๊ฐ ์์์ฑ ์ปจํ ์คํธ์ " ์ง์ง ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ " ์์ฒญ์ ํ๋ค.
3. ์์์ฑ ์ปจํ ์คํธ๊ฐ DB ์กฐํ๋ฅผ ํ๋ค.
4. ์ค์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
5. ๊ทธ๋ฆฌ๊ณ ์ง์ง ๊ฐ์ฒด์ ํ๋ก์ ๊ฐ์ฒด์ target ์ ์ฐ๊ฒฐ์ ์์ผ์ค๋ค .
ํ๋ก์์ ํน์ง
ํ๋ก์ ๊ฐ์ฒด๋ ์ฒ์ ์ฌ์ฉํ ๋ ํ๋ฒ๋ง ์ด๊ธฐํ๋๋ค.
ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ๋ , ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ค์ ์ํฐํฐ๋ก ๋ฐ๋๋ ๊ฒ์ ์๋๋ค.
์ด๊ธฐํ๋๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋๋ ๊ฒ์ด๋ค.
ํ๋ก์ ๊ฐ์ฒด๋ ์๋ณธ ์ํฐํฐ๋ฅผ ์์๋ฐ๋๋ค. ๋ฐ๋ผ์ ํ์ ์ฒดํฌ์ ์ฃผ์ํด์ผํ๋ค.
( == ๋น๊ต์ ์คํจํ๋ค . instance of ๋ฅผ ์ฌ์ฉํ์ )
Member member1 = em.find(Member.class, member.getId());
System.out.println("member1 = " + member1.getClass());
Member reference = em.getReference(Member.class, member.getId());
System.out.println("reference = " + reference.getClass());
์์์ฑ ์ปจํ ์คํธ์ ์ฐพ๋ ์ํฐํฐ๊ฐ ์ด๋ฏธ ์์ผ๋ฉด em.getReference() ๋ฅผ ํธ์ถํด๋ ์ค์ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค.
Member reference = em.getReference(Member.class, member.getId());
System.out.println("reference = " + reference.getClass());
Member member1 = em.find(Member.class, member.getId());
System.out.println("member1 = " + member1.getClass());
๊ทธ ๋ฐ๋๋ ๋น์ทํ๋ค.
์ฒ์์ ํ๋ก์๋ก ์กฐํํด๋ฒ๋ฆฌ๋ฉด ๊ทธ๋ค์์ em.find() ์กฐํํ๋ฉด ํ๋ก์๋ก ์กฐํ๊ฐ ๋๋ค.
Member reference = em.getReference(Member.class, member.getId());
System.out.println("reference = " + reference.getClass()); // Proxy
em.detach(reference);
reference.getName();
์์์ฑ ์ปจํ ์คํธ์ ๋์์ ๋ฐ์ ์ ์๋ ์ค์์ ์ํ์ผ ๋, ํ๋ก์๋ฅผ ์ด๊ธฐํํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
em.detach(): ์ค์์ ์ํ , ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌํ์ง ์๋ ์ํ
์์์ฑ ์ปจํ ์คํธ์ ๋์์ ๋ฐ์ง ๋ชปํ๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ก์ ํ์ธ ๋ฉ์๋/์ ํธ๋ฆฌํฐ
System.out.println("isLoaded = " + emf.getPersistenceUnitUtil().isLoaded(reference));
ํ๋ก์ ์ธ์คํด์ ์ด๊ธฐํ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
System.out.println("reference = " + reference.getClass());
ํ๋ก์ ํด๋์ค๋ฅผ ํ์ธํ๋ค.
Hibernate.initialize(reference);
ํ๋ก์๋ฅผ ๊ฐ์ ๋ก ์ด๊ธฐํํ๋ค.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ
www.inflearn.com