본문 바로가기
JPA

[JPA / JPQL] 페치조인 & 지연로딩

by onejunu 2020. 8. 6.

지연로딩을 기본 페치전략으로 가져가는 경우 어떤 문제점이 있을까??

 

예시로 바로 살펴보자.

 

@Entity
class User{
    ...
    
    @ManyToOne(fetch = FetchType.LAZY )
    private Team team;
    
    ...

}


@Entity
class Team{

    @OneToMany(mappedBy = "team")  // 기본적으로 LAZY
    private List<User> users = new ArrayList<>();
    ...

}

영속성 컨텍스트는 깨끗하게 비워져있는 상태라고 가정한다. 아래의 데이터베이스 상황에서 쿼리를 날린다면??

 

List<User> users = em.createQuery("select u from User u",User.class).getResultList();

for (User u : users) {
System.out.println("###"+u.getName()+" : "+u.getTeam().getName());
}

 


 

문제점) 프록시객체의 상태필드값을 묻는 코드에서 매번 쿼리를 날림. 

해결) 페치조인으로 연관된 객체를 다 땡겨오자.

 

List<User> users = em.createQuery("select u from User u join fetch u.team",User.class).getResultList();

 

결과)

 

만약에 그냥 join 하면 기존의 문제점들처럼 똑같은 문제가 발생됨.

댓글