Inflearn brand logo image

인프런 커뮤니티 질문&답변

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

페치 조인 1 - 기본

N+1문제

작성

·

56

0

fetch join을 하는것이 즉시로딩을 하는 개념과 비슷하다고 이해했습니다.

근데 강의에서 지연로딩이든 즉시로딩이든 N+1 문제를 피하기 위해 페치조인을 사용한다고 하셨는데 지연로딩일때는 추가적인 쿼리가 발생하게되어 N+1문제가 생기지만 즉시로딩일때는 모든 데이터를 하나의 쿼리로 가져오기때문에 추가적인 쿼리 없이 N+1문제가 생기지 않는다고 생각했습니다.

 

em.find()등으로 즉시로딩을 할때 N+1문제가 생기지 않는것이고 jpql로 즉시로딩을 하면 N+1문제가 생기는것인가요? 이에따른 이유도 함께 궁금합니다ㅜㅜ

답변 2

0

오리쉐리님의 프로필 이미지
오리쉐리
질문자

즉시로딩인 상태에서 jpql로 조회할때 어떻게 하면 N+1문제가 생기는것인가요??

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 오리쉐리님

즉시로딩시에

예를 들어서 팀 -> 회원의 관계가 있을 때 팀만 조회하게 되면 N + 1이 발생합니다.

왜냐하면 팀을 select 쿼리하면 팀 10개가 조회할 수 있습니다. 이후 각 팀별로 데이터가 즉시 로딩되어야 하기 때문에 N + 1 문제가 발생합니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.

N+1 문제는 JPA를 사용하는 개발자가 자주 직면하는 이슈 중 하나입니다. 이를 이해하는 데 도움이 될 내용을 설명하겠습니다.

N+1 문제와 즉시 로딩

  1. N+1 문제란:

    • N+1 문제는 특정 엔티티를 조회할 때, 그와 연관된 하위 엔티티를 개별적으로 조회하게 되어 불필요한 추가 쿼리가 발생하는 문제입니다. 예를 들어, Team과 관련된 Member를 즉시 로딩(EAGER) 설정을 통해 가져올 경우, 초기에는 Team을 조회하기 위한 쿼리가 나가고(N), 그와 관련된 각각의 Member들을 조회하기 위해 N번의 쿼리가 추가로 발생하게 됩니다.
  2. 즉시 로딩 (EAGER Loading):

    • 즉시 로딩을 사용하면 특정 연관 엔티티를 함께 조회하는 방식으로, 주로 FetchType.EAGER로 설정됩니다. 이런 경우, 연관된 엔티티가 많을수록 쿼리 수가 증가하여 N+1 문제가 발생할 수 있습니다. 특히, JPQL을 사용할 때 더 자주 문제가 발생합니다. 이는 JPQL이 기본적으로 FetchType을 무시하고 쿼리를 생성하기 때문입니다.
  3. 지연 로딩 (Lazy Loading)과 N+1 해결 방법:

    • 지연 로딩(FetchType.LAZY)을 사용하면 초기에는 상위 엔티티만 조회하고, 실제로 연관된 엔티티에 접근하는 시점에 별도의 쿼리가 나가게 됩니다. 하지만, 이 방법 역시 N+1 쿼리가 나갈 수 있기 때문에, 페치 조인(Petch Join)과 같은 방식으로 최적화해야 합니다.

페치 조인과 그 이점

  • 페치 조인(Fetch Join):

    • 페치 조인은 JPQL에서 사용하는 조인 전략 중 하나로, 연관된 엔티티를 함께 한 번의 쿼리로 가져올 수 있도록 돕습니다. 이를 통해 N+1 문제를 효과적으로 해결할 수 있습니다, 왜냐하면 필요한 모든 데이터를 한 번의 쿼리로 얻기 때문입니다.
  • JPQL에서의 사용:

    • JPQL에서 FETCH JOIN 키워드를 사용하면, 지연 로딩 상황에서도 연관된 모든 데이터를 한 번에 가져와 N+1 문제를 피할 수 있습니다.

질문에 도움을 드리기 위해 관련된 기존 질문을 몇 가지 찾아보았습니다. 아래 링크들을 확인해 보시면 더 많은 정보를 얻으실 수 있습니다:

이해가 안 되시거나 추가 질문이 있으시면 언제든지 추가 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기