조회 시 1개의 쿼리를 생각하고 설계 했으니 나오지 않아도 되는 조회의 쿼리가 N개가 더 발생하는 문제
// 게시글 목록을 조회
List<Article> articles = articleRepository.findAll();
// 각 게시글에 대해 댓글을 조회 ( 댓글을 포함하기 위해 반복문을 사용)
for(Article article : articles){
List<Comment> comments = commentRepository.findByArticleId(article.getId());
article.setComments(comments);
}
위 코드에서 findAll()을 통해 게시글을 조회한 후, 각 게시글마다 댓글을 조회하는 추가 쿼리가 발생합니다. 게시글이 10개이고, 각 게시글에 댓글이 5개 씩 있다면
SELECT * From articles 쿼리SELECT * FROM comments WHERE article_id = ? 쿼리N+1번의 쿼리가 발생하게 됩니다.JOIN을 사용할 수 있습니다. JOIN 쿼리를 사용하며, 결과적으로 N+1문제를 피할 수 있습니다.@Query"SELECT a From Article a JOIN FETCH a.comments")
List<Article> findAllWithComments();
@OneToMany(fetch = FetchType.EAGER)
privatge List<Comment> commnets;
Article 객체만 필요하지 않다면, 필요한 속성만 포함하는 DTO를 사용하여 성능을 최적화할 수 있습니다.