em.find() : DB를 통해서 실제 엔티티 객체 조회
em.getReference() : DB 조회를 미루는 가짜 엔티티 객체 조회
여기서 가짜 엔티티가 프록시이다.
em.getReference()를 알아보기 전
member와 team 엔티티가 양방향 연관관계를 가지고 있다.
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(name = "name")
private String name;
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
Member member = new Member();
member.setName("user1");
em.persist(member);
em.flush();
em.clear();
System.out.println("=================================");
Member findMember = em.find(Member.class, member.getId());
System.out.println("=================================");
System.out.println(findMember.getName());
tx.commit();
em.find()를 사용하면
등호 사이에 select 쿼리가 나가는 것을 볼 수 있다.
그렇다면 이번에는 em.getReference()를 사용해보자.
Member member = new Member();
member.setName("user1");
em.persist(member);
em.flush();
em.clear();
System.out.println("=================================");
Member findMember = em.getReference(Member.class, member.getId());
System.out.println("=================================");
System.out.println(findMember.getName());
em.getReference()를 사용하면
등호 사이에 select 쿼리가 있는 것이 아닌 findMember.getName() 위에 쿼리가 있는 것을 볼 수 있다.
즉, em.getReference()를 사용할 때 select가 되는게 아닌 findMember.getName()을 실행할 때 select 한다는 것을 알 수 있다.
여기서 findMember의 클래스를 출력하면
위와 같이 Member 후에 Proxy가 있는 것을 볼 수 있다.
Proxy는 다음에 자세히 알아보자.
참고 : 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard