Spring Boot JPA N+1 문제 해결
프로젝트에서 API가 느려서 로그 찍어봤더니 쿼리가 100개 넘게 나가고 있었어요 😱
N+1 문제란?
1개의 쿼리로 N개의 데이터를 가져왔는데, 연관 관계 조회할 때 N개의 추가 쿼리가 발생하는 것
// 게시글 10개 조회 → 쿼리 1개
// 각 게시글의 작성자 조회 → 쿼리 10개
// 총 11개 쿼리 발생!
List<Post> posts = postRepository.findAll();
for (Post post : posts) {
post.getAuthor().getName(); // 여기서 추가 쿼리
}
해결 방법
1. Fetch Join
@Query("SELECT p FROM Post p JOIN FETCH p.author")
List<Post> findAllWithAuthor();
2. EntityGraph
@EntityGraph(attributePaths = {"author"})
List<Post> findAll();
3. Batch Size 설정
spring:
jpa:
properties:
hibernate:
default_batch_fetch_size: 100
결과
쿼리 100개 → 3개로 줄임! API 응답시간 2초 → 200ms
느낀 점
로그를 잘 봐야 한다. show_sql: true 설정 필수!