1. 프록시

Untitled

//...

try {
	Member member = em.find(Member.class, 1L);
	printMemberAndTeam(member); // 멤버&팀 출력 비지니스로직
	printMember(member); // 멤버만 가져오고 싶을때.. 

	//어떨땐 멤버만 가져오고 싶을때가 있는데... 팀까지 같이 조회하면 손해.
	//지연로딩과 프록시로 해결이 가능.	

}
//...

private static void printMember(Member member) {
	System.out.println(member.getName());
}

private static void printMemberAndTeam(Member member) {
	String username = member.getName();
	//...
	Team team = member.getTeam();
	String teamName = team.getName();
	//...
}

1-1. 프록시 기초

em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회

em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시)엔티티 객체 조회

//...
try {
	Member member = new Member();
	member.setName("AAA");

	em.persist(member);

	em.flush();
	em.clear(); //영속성해제

	Member findMember = em.find(Member.class, member.getId());
	
	System.out.println(findMember.getId());
	System.out.println(findMember.getName());

}
//...

위 경우에 멤버와 팀을 조인하여 select하는 쿼리가 나간다.

try {
	Member member = new Member();
	member.setName("AAA");

	em.persist(member);

	em.flush();
	em.clear(); //영속성해제

	Member findMember = em.getReference(Member.class, member.getId());
	
	//System.out.println(findMember.getId());
	//System.out.println(findMember.getName());

}
//...

위 경우에는 select하는 쿼리가 나가지 않는다.

단, 콘솔출력하는 부분의 주석을 해제하면 select쿼리가 나가게 된다. ( Id는 1차캐시에서 가져오고, getName할때 실제 쿼리가 실행된다.)

getRefernce 를 호출하는 시점에는 쿼리가 동작하지 않는다.