[Diary] N+1 검증 (2)

Shaun.the.sheep·2025년 7월 24일

[Dairy] S.C.C TIL

목록 보기
14/22

들어가기 전...

라이브러리의 사용 방법이 곧 코딩 실력이다...

일단 EntityGraph가 뭔지 부터 보자

연관관계가 있는 엔티티를 조회할 경우 지연 로딩으로 설정되어 있으면 연관관계에서 종속된 엔티티는 쿼리 실행 시 select 되지 않고 proxy 객체를 만들어 엔티티가 적용시킨다. 그 후 해당 프락시 객체를 호출할 때마다 그때그때 select 쿼리가 실행된다.
위 같은 연관관계가 지연 로딩으로 되어있을 경우 fetch 조인을 사용하여 여러 번의 쿼리를 한 번에 해결할 수 있다.
@EntityGraph는 Data JPA에서 fect 조인을 어노테이션으로 사용할 수 있도록 만들어 준 기능이다.

저번 검증 시리즈의 내용과 비교해보면
@EntityGraph 어노테이션이 추가 되어 있다

    @EntityGraph(attributePaths = {"members"})
    @Query("select m from Team m")
    public List<Team> findAllList();

결과를 한번 보자

브라우저에서의 데이터는 같다.
그럼 이제 로그도 보게 되면

2025-07-24T17:00:22.338+09:00  INFO 4400 --- [Nplus1] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
Hibernate: 
    /* select
        m 
    from
        Team m */ select t1_0.id, m1_0.team_id, m1_0.memberid,          m1_0.memberage, m1_0.membername, t1_0.name 
        from tbl_team t1_0 
        left join tbl_memeber m1_0 on t1_0.id=m1_0.team_id

이런 식으로 한번의 쿼리로 호출을 하는 것을 볼 수 있다.

attributePaths로 다른 엔티티를 참조하는 경우에 기존에 가지고 있던 프록시 객체에서
가져옴으로 추가적인 호출이 필요 없게 되는 것이다.

위의 테스트에 대한 트러블 슈팅은 따로 정리해서 진행해보고자 한다.

출처

EntityGraph 정의

프로젝트 Url

내 깃헙

0개의 댓글