N+1 문제

sseongeun·2024년 4월 9일

스프링

목록 보기
2/13

N+1 문제란?

: JPA에서 지연로딩 전략때문에 발생하는 성능 문제

📌 N+1 문제는 언제 발생하는가?

지연로딩하는 경우(각 객체에 접근할때마다 쿼리를 실행하게 되므로 쿼리수가 기하급수적으로 증가)

@XToMany 관계_에 있는 엔티티를 조회할때

-> 부모 엔티티 가져오는 쿼리 1번 발생
-> 자식 엔티티 가져오는 쿼리 N번 발생

ex) 10개의 게시글을 가져오고 댓글을 가져오기 위해 지연로딩을 사용할때
게시글들 가져오는 쿼리 1번 (N개의 게시글)
각 게시글에 연관된 댓글 가져오는 쿼리 N번
총 1+N번의 쿼리가 발생함

📌 N+1 문제의 영향

쿼리수 증가 -> 성능 저하, 트래픽 과부화, 서버 부하

📌 그렇다면 N+1 문제의 해결방안은?

1️⃣ fetch join
: 연관된 엔티티를 한번의 쿼리로 가져온다

-) fetch join을 하게되면, 데이터 호출시점에 연관된 데이터를 모두가져오므로 FetchType을 LAZY로 해놓는게 무의미함

-) 하나의 쿼리문으로 가져오다보니, 페이징 처리가 불가능하다

2️⃣ 페이징 처리
: 한번에 가져올 entity개수를 제한함 - @BatchSize(Size=n)

즉시 로딩이어서 발생하는 것은 아니다.

3️⃣ Entity Graph
: JPA 2.1 부터 추가된 Entity Graph를 이용해 연관된 객체들을 어떻게 로드할지 세밀하게 제어가능

profile
공부 기록...

0개의 댓글