일정 관리 프로젝트를 하던 중 생긴 N+1 문제이다.

todo 라는 일정 테이블과 user 라는 유저 테이블이 존재한다.
user_todo 라는 테이블은 todo 의 일정과 user 의 유저가 매칭 됐을 때, 해당 정보를 저장하기 위한 테이블이다.
만약 1번 일정을 3번 유저가 담당하게 된다면,

사진에서 볼 수 있듯이 각 테이블의 PK 값을 같이 넣어 저장한다.
그렇기에 하나의 일정은 user_todo 테이블에선 여러 개가 들어갈 수 있다. 즉, OneToMany 인 셈이다.
그럼 당연히 한 명의 유저도 user_todo 테이블에선 여러 번 들어갈 수 있다. 이것 또한 OneToMany.
자, 이런 상황에서 다음과 같은 정보를 조회하고 싶다면?
"3 번 일정을 담당하는 user의 정보를 알고 싶어"
그럼 아주 간단하게 SELECT USER_ID FROM USER_TODO WHERE TODO_ID = 3 이렇게 작성하면 user_id 를 조회할 수 있다.
근데 문제는 JPA 로 구축한 엔티티에선 아래와 같이 todo_id 는 Todo 객체를 의미한다.

그렇기에 JPA 내부에서 Todo 객체를 찾기 위해 다시 Todo 엔티티에서 조회를 한다.
그래서 아래와 같이 추가적인 조회 쿼리가 또 생기게 되는 것이다.

user 와 todo 객체를 처음부터 같이 불러오면 된다.

@EntityGraph 어노테이션을 통해 attributePaths 안에 존재하는 값들을 처음에 같이 조회하게 하고
이를 통해 N + 1 을 해결한다.