JPA의 N + 1 문제에 대해서 설명해 주세요.

2024. 11. 30. 19:51·백엔드 면접

JPA N + 1 문제는 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상입니다. 예를 들어 블로그 게시글과 댓글이 있는 경우, 게시글을 조회한 후 각 게시글마다 댓글을 조회하기 위해 추가 쿼리가 발생한다면 N + 1 문제가 발생한 것입니다. 댓글 10개가 달린 게시글 1개를 조회하는 데 총 11개의 쿼리(게시글 조회 1개 + 게시글의 댓글 조회 10개)가 실행된 것이지요.

 


 

findAll 메서드의 글로벌 페치 전략별 N + 1 문제 상황에 대해서 설명해 주세요.

글로벌 페치 전략을 즉시로딩으로 설정하고 findAll()을 실행하면 N + 1 문제가 발생합니다. findAll()은 select e from Entity e라는 JPQL 구문을 생성해서 실행하기 때문입니다. JPQL은 글로벌 페치 전략을 고려하지 않고 쿼리를 실행합니다. 모든 엔티티를 조회하는 쿼리 실행 후, 즉시로딩 설정을 보고 연관관계에 있는 모든 엔티티를 조회하는 쿼리를 실행합니다.

 

글로벌 페치 전략을 지연로딩으로 설정하고 findAll()을 실행하면 N + 1 문제가 발생하지 않습니다. 이는 연관관계에 있는 엔티티를 실제 객체 대신에 프록시 객체로 생성하여 주입하기 때문입니다. 하지만 프록시 객체를 사용할 경우에 실제 데이터가 필요해 조회하는 쿼리가 발생하고 N + 1 문제가 발생할 수 있습니다.

 


 

N + 1 문제는 어떻게 해결할 수 있을까요?

 

N + 1 문제를 해결하기 위해서는 fetch join, @EntityGraph, batch size 설정 등으로 해결할 수 있습니다.

 

fetch join과 @EntityGraph는 페치 전략이 지연로딩인 엔티티를 한 번에 즉시로딩으로 불러올 수 있습니다.

다만 컬렉션은 fetch join 시 페이징이 불가능한데 batch size로 최적화 할 수 있습니다.

 

 

'백엔드 면접' 카테고리의 다른 글

일급 컬렉션에 대해서 설명해 주세요.  (0) 2024.12.02
Checked Exception과 Unchecked Exception에 대해서 설명해 주세요.  (0) 2024.12.01
엔티티 매니저에 대해 설명해 주세요.  (0) 2024.11.30
JPA의 ddl-auto 옵션에 대해서 설명해 주세요.  (0) 2024.11.29
Spring Data JPA에서 새로운 Entity인지 판단하는 방법은 무엇일까요?  (0) 2024.11.29
'백엔드 면접' 카테고리의 다른 글
  • 일급 컬렉션에 대해서 설명해 주세요.
  • Checked Exception과 Unchecked Exception에 대해서 설명해 주세요.
  • 엔티티 매니저에 대해 설명해 주세요.
  • JPA의 ddl-auto 옵션에 대해서 설명해 주세요.
이런개발
이런개발
geun-00의 흔적 보관소
  • 이런개발
    내일이 기대되는 오늘
    이런개발
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 백엔드 면접
      • SQL N
        • SUM, MAX, MIN
        • SELECT
        • GROUP BY
        • JOIN
      • Spring
      • JPA
      • 트러블슈팅
      • Infra
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    raid
    스프링
    데브코스
    자바
    토스 페이먼츠
    JPA
    오블완
    백엔드 면접
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
이런개발
JPA의 N + 1 문제에 대해서 설명해 주세요.
상단으로

티스토리툴바