N + 1이 도대체 뭔데?

N + 1문제란 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미한다.

1 + N이 맞는 것 같은데 N+1이라고 불리니까 넘어가도록 하자.

JPA Repository를 활용한 메소드로 1:N이나 N:1 관계를 가진 엔티티를 조회할 때 발생한다.

Fetch 전략이 EAGER든 LAZY든 발생할 수 있기 때문에 각 타입 별로 어떤 경우에 발생하는지 알아야 한다.

  1. JPQL에서 만든 SQL을 날린다.
  2. JPA에서 Fetch 전략을 가지고 해당 데이터의 연관 관계인 하위 엔티티들을 조인해서 조회한다.
  3. 2번 때문에 N+1 문제가 발생한다.

Untitled

즉시 로딩으로 설정해놓은게 한번에 조회하려고 한건데 N+1 이라고 볼 수 있나요?

N+1 자체가 1개를 조회할 때 의도치 않은 쿼리문이 N개 발생한다는 의미다.

Member에 대한 데이터만 가져오면 되는데 즉시 로딩으로 설정해놓으면 어쩔 수 없이 Member와 연관된 객체들 까지 한번에 조회가 되기 때문에 N+1 이 발생한다고 보는 것.

지금 우리 프로젝트는 규모가 작기 때문에 상관없지만 테이블 관계가 복잡할 수록 N+1 문제는 커질 것이다.