즉시로딩과 지연로딩
저번예제로 돌아가자. 만약 member를 조회할때마다 team까지 조회할 필요가 없다면? JPA는 이를 위해 지연로딩을 지원한다.
위와같이 member 엔티티내 team 엔티티와 매핑된 애너테이션인 @ManyToOne에 fetch란 속성을 달아준다. 이때 지연로딩을 사용하기 위한 속성 타입은 LAZY이다.
@ManyToOne(fetch = FetchType.LAZY) //지연로딩
@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
private Team team;
우선적으로 프록시객체를 조회한다는 의미이다. 즉 member내에 team필드가 있긴 하지만, member엔티티를 DB에서 조회한다고 해서 바로 team엔티티까지 조회해 가져오는게 아니라 team은 프록시 객체로 조회한후, 쓰이기 전까지는 프록시로 갖고 있는다. 따라서 team을 가져오는 쿼리가 날아가지 않는다.
Member m = em3.find(Member.class, member.getId());
// getTeam()메서드가 반환하는건 team의 프록시 객체이다.
System.out.println("m.getTeam().getClass() = " + m.getTeam().getClass());
반환되는 객체가 프록시임을 확인할 수 있다.
m.getTeam().getName();
프록시객체를 직접 사용하려고 하면.. 그 시점 쿼리가 날아가서 team프록시를 초기화한다.