작성
·
61
·
수정됨
0
비슷한 게시글을 봐도 이해가 잘 가지 않아서 재차 질문 드립니다
제가 이해하는 상황이 맞는지 고견 부탁드립니다
1. fetch = EAGER 쿼리가 두 번 실행
이것이 프록시 강의영상에서 말씀하시는 (N+1) 문제인지 궁금합니다
첫 번째 쿼리는
em.flush(), em.clear() 실행되면 영속성 컨텍스트가 비워지고
이후 jpql 쿼리가 실행되면서 EAGER 패치 전략에 따라 Team도 함께 조회가 됩니다.
두 번째 쿼리는
영속성 컨텍스트가 비워졌고 EAGER 패치 전략으로 조회되어야 합니다.
실제 엔티티로 조회되어야 하는걸로 알고있습니다
하지만 특정 시점에서 Team이 프록시로 로드 되었고 이후 프록시가 초기화되면서 다시 데이터베이스에서 조회하면서 발생한 쿼리로 생각이 듭니다
답변 1
0
안녕하세요. 뚜방님, 공식 서포터즈 y2gcoder입니다.
말씀하신 것과 같이 N+1 문제는 EAGER 로딩 전략에서도 JPQL을 사용할 때 발생할 수 있습니다 🙂
Member:Team = N:1 관계이고, JPQL에서는 Member 와 Team을 조인 후 Member만 조회하고 있습니다. (수정: 이 때 연관관계에 있는 Team은 영속성 컨텍스트에 없기 때문에 아마도 프록시로 영속성 컨텍스트에 존재할 것입니다!)
이 JPQL이 첫번째 쿼리입니다 🙂
다만 조회 대상이 select m from
에서 보이듯이 Member 엔티티이기 때문에 Member 엔티티만 영속화되게 됩니다. 하지만 영속화되고 보니 Member에 Team 엔티티가 연관관계로(프록시로) 존재하고 EAGER 로딩 전략이기 때문에 Team 엔티티도 영속화해야 합니다. 그래서 Member 엔티티가 가지고 있는 teamId 로 Team 엔티티도 조회해서 실제 객체를 영속화(프록시 초기화)해주게 됩니다.
이 때 나가는 것이 두번째 쿼리입니다!
감사합니다.