즉시로딩과 지연로딩

학습 페이지

저번예제로 돌아가자. 만약 member를 조회할때마다 team까지 조회할 필요가 없다면? JPA는 이를 위해 지연로딩을 지원한다.

지연로딩은 어떻게 사용하는가?

Untitled

위와같이 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());

Untitled

반환되는 객체가 프록시임을 확인할 수 있다.

m.getTeam().getName();

프록시객체를 직접 사용하려고 하면.. 그 시점 쿼리가 날아가서 team프록시를 초기화한다.

Untitled

즉시 로딩