@Entity
public class Member {
//...
**@ManyToOne(fetch = FetchType.LAZY) // 지연로딩 설정**
@JoinColumn
private Team team;
}
위와 같이 하고 조회시, Member만 조회된다.
try {
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("AAA");
member.setTeam(team);
em.persist(member);
Member m = em.find(Member.class, member.getId()); // 멤버만 조회됨.
}
//...
Member만 조회된다.
대신,
try {
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("AAA");
member.setTeam(team);
em.persist(member);
Member m = em.find(Member.class, member.getId()); // 멤버만 조회됨.
m.getTeam().getClass(); // Team의 proxy 객체반환
m.getTeam.getName(); // 이 시점에 team의 대한 쿼리가 날아감!
}
//...
이처럼 프록시와 LAZY(지연)로딩을 이용하면 member만 가져온 후, 프록시로 가져온 가짜 엔티티프록시 객체에 접근할때, 그때 JPA가 쿼리를 실행하여 가져온다.