๋ฐ์ํ
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
โ ํ๋ก์
- ํ๋ก์ ํน์ง
- ์ค์ ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ๋ง๋ค์ด์ก๋ค.
- ์ค์ ํด๋์ค์ ๊ฒ ๋ชจ์์ด ๊ฐ๋ค
- ์ค์ ๊ฐ์ฒด์ ์ฐธ์กฐ(target)๋ฅผ ๋ณด๊ด
- ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- em.find() : DB๋ฅผ ํตํด์ ์ค์ ์ํฐํฐ ๊ฐ์ฒด ์กฐํ!
- em.getReference() : DB ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฐ์ง(ํ๋ก์) ์ํฐํฐ ๊ฐ์ฒด ์กฐํ
ํ๋ก์ ๊ฐ์ฒด์๋ ์ค์ ์ํฐํฐ๋ฅผ ์ฐธ์กฐํ๋ target์ ๊ฐ์ง๊ณ ์๋ค!
ํ๋ก์ ๊ฐ์ฒด์ ์ด๊ธฐํ
Member m1 = em.getReference(Member.class, member.getId()); // ์ด๋๋ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์๊ฒ ๋๋ค.
m1.getName(); // **์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋! ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ค.
ํ๋ก์ ๊ฐ์ฒด์ ์ด๊ธฐํ ๊ณผ์
- m1.getName();
- target ์ด null ์ด๋ฏ๋ก ์์์ฑ ์ปจํ ์คํธ์ ์ด๊ธฐํ ์์ฒญ์ ํ๋ค.
- ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์์ ์กฐํํด์ ์์ผ๋๊น DB์์ ์กฐํ๋ฅผ ํ๋ค.
- ์ค์ Entity๊ฐ ์์ฑ์ด ๋๊ณ ..
- target์ Member๊ฐ ๋ด๊ธฐ๊ฒ ๋๊ณ , target.getName() ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ค!
Proxy ๊ฐ์ฒด์ ์ด๊ธฐํ ๊ณผ์ : em.getReference(T class, id(key) );
public class JpaMain {
// EntityManagerFactory, EntityManager, EntityTransaction ์ด๊ธฐํ ์๋ต
try {
Member member1 = new Member();
member1.setUsername("hello");
em.persist(member1);
em.flush();
em.clear(); // ์์์ฑ ์ปจํ
์คํธ์ 1์ฐจ์บ์๋ฅผ ๋น์ด๋ค.
Member findMember = em.getReference(Member.class, member1.getId()); // (๊ฐ์ง ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ!) ์ด ์์ ์์๋ ์ฟผ๋ฆฌ๊ฐ ์๋๊ฐ๋ค.
System.out.println("findMember : " + findMember.getClass());
System.out.println("findMember.id : " + findMember.getId()); // Id๋ฅผ ์กฐํํ๋๊ฒ๋ ์ฟผ๋ฆฌ๊ฐ ์๋๊ฐ๋ค. ์?
System.out.println("findMember.name : " + findMember.getUsername());
System.out.println("findMember.name : " + findMember.getUsername());
}
}
findMember : class chapter08_ํ๋ก์_์ฐ๊ด๊ด๊ณ๊ด๋ฆฌ.Member$HibernateProxy$waCRsb9J
findMember.id : 1
findMember.name : hello1
findMember.name : hello1
em.getReference()๋ก ์ฐพ์ member๋ฅผ getClass()๋ฅผ ์ถ๋ ฅํด๋ณด๋ proxy๊ฐ ๋์ค๋๊ฑธ ํ์ธํ ์ ์๋ค.
ํ๋ก์์ ํน์ง
- ํ๋ก์ ๊ฐ์ฒด๋ ์ฒ์ ์ฌ์ฉํ ๋ ํ ๋ฒ๋ง ์ด๊ธฐํ
- ํ๋ก์ ๊ฐ์ฒด๋ ์๋ณธ ์ํฐํฐ๋ฅผ ์์ ๋ฐ์๊ธฐ ๋๋ฌธ์, ( == ๋น๊ต ์๋จ! instance of ์ฌ์ฉ!! )
- ์์์ฑ ์ปจํ ์คํธ์ ์ด๋ฏธ ์๋ ์ํฐํฐ๋ em.getReference() ํด๋ ์ค์ ์ํฐํฐ ๋ฐํ!
public class JpaMain {
// EntityManagerFactory, EntityManager, EntityTransaction ์ด๊ธฐํ ์๋ต
try {
Member member1 = new Member();
member1.setUsername("hello");
em.persist(member1);
em.flush();
em.clear(); // ์์์ฑ ์ปจํ
์คํธ์ 1์ฐจ์บ์๋ฅผ ๋น์ด๋ค.
Member findMember = em.find(Member.class, member1.getId()); // ์ฟผ๋ฆฌ ๋๊ฐ.
Member proxyMember1 = em.getReference(Member.class, member1.getId()); // // proxy ๊ฐ์ฒด ์์ฒญ!
System.out.println("findMember : " + findMember.getClass()); // ์ค์ ์ํฐํฐ ๋์ด
System.out.println("proxyMember : " + proxyMember1.getClass()); // proxy๊ฐ์ฒด๋ฅผ ์์ฒญํ์ง๋ง, em.find()์ ์ํด ์ด๋ฏธ ์์์ฑ ์ปจํ
์คํธ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ ์ํฐํฐ๋ฅผ ๋ฐํ์ํจ๋ค.
}
}
๋ฐ์ํ