강의

멘토링

커뮤니티

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

신나는 라이언님의 프로필 이미지
신나는 라이언

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

5-4. JPA 와 N+1 문제 - 대표적인 사례

N+1 강의 관련 질문입니다!

해결된 질문

작성

·

26

0

5-4 강의를 보고 궁금해서 여쭤봅니다!

24분 즈음에 In절로 가져오는게 너무 많은 양이면 결국 쿼리 수가 많아진다는게 이해가 가지않습니다.

In절로 너무 많은 양을 가져왔을 때 불필요한 데이터가 많아져서 오버헤드가 발생할 수 있는거지, 오히려 쿼리수는 감소하는거아닌가요?

앞서 계속 강의를 그렇게 이해하다가 24분 즈음 하신 말씀때문에 헷갈려서 질문드립니다!

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 라이언님 좋은 질문 해주셔서 감사합니다

 

1. 말씀해주신 사항이 맞습니다!

IN 절을 사용하면 쿼리 수는 당연히 줄어듭니다. N+1 문제에서 N번의 개별 쿼리가 나가던 걸 IN 절로 묶어서 훨씬 적은 횟수로 해결하게 됩니다

예를 들어 회원 1000명의 주문을 조회한다면:

  • N+1 방식: 1(회원 조회) + 1000(각 회원의 주문 조회) = 1001번의 쿼리

  • IN 절 방식: 훨씬 적은 횟수 (아래에서 자세히 설명)

말씀해주신게 정확합니다.

2. 그런데 IN 절에도 제한이 있습니다

강의에서 말씀드린 건 "IN 절도 무한정 크게 만들 수는 없다"는 겁니다.

데이터베이스의 IN 절 크기 제한: 대부분의 데이터베이스는 한 번에 처리할 수 있는 IN 절의 크기에 제한이 있습니다. 예를 들어 Oracle은 기본적으로 IN 절에 1000개까지만 넣을 수 있습니다.

Hibernate의 batch_fetch_size 설정: Hibernate도 hibernate.default_batch_fetch_size 설정에 따라 IN 절을 자동으로 나눕니다.

spring:
  jpa:
    properties:
      hibernate:
        default_batch_fetch_size: 1000

이렇게 설정하면 Hibernate는 IN 절에 최대 1000개까지만 넣고, 그 이상이면 여러 번의 쿼리로 나눕니다.

정리하면, 여러분의 이해가 정확합니다! IN 절을 쓰면 쿼리 수는 당연히 줄어듭니다. 강의에서 말씀드린 건 "IN 절에도 한계가 있고, 데이터가 정말 많으면 여러 번으로 나뉘어진다"는 것을 의미하고자 했습니다. 하지만 그래도 N+1보다는 훨씬 효율적이라고 볼 수 있습니다! 아무래도 강의에서 언급했던 내용때문에 헷갈리셨던 것 같습니다 ;_; 부디 답변이 되었길 바랍니다!@!

0

안녕하세요, 인프런 AI 인턴입니다. 신나는 라이언님.

N+1 문제와 관련하여 강의를 듣고 혼동이 생기신 걸로 보이네요. N+1 문제는 데이터베이스 쿼리가 과도하게 발생하여 성능에 영향을 미치는 상황을 설명하기 위해 자주 사용되는 용어입니다. 특히, 관계형 데이터베이스에서 조인을 사용하지 않고 데이터를 가져올 때 생길 수 있는 문제인데요, 주로 다음과 같은 상황들을 고려하셔야 합니다.

N+1 문제의 이해:

  1. 기본 개념:

    • N+1 문제는 일반적으로 하나의 메인 쿼리(N)와 각각의 하위 항목을 가져오기 위한 추가 쿼리들이 더해져 (+1) 발생하는 문제입니다.
  2. IN 절과 쿼리 수:

    • IN 절을 사용하면 N개의 개별 쿼리 대신 하나의 IN 절로 데이터를 한 번에 가져올 수 있어 쿼리 수 자체는 줄어들 수 있습니다.
    • 그러나, IN 절로 너무 많은 데이터를 가져오게 되면 그 데이터들을 메모리에 적재하며 발생하는 로딩 시간이 길어지거나 메모리 사용량이 많아지는 오버헤드가 발생할 수 있습니다.
  3. 강의 내용 해석:

    • 강의에서 언급하신 “쿼리 수가 많아진다”는 것이 IN 절을 사용하면서 불필요하게 많은 데이터를 가져올 경우 관련된 로직을 처리하거나 추가적인 필터링 과정에서 최종적으로 실제로 필요한 데이터만 관리하는 과정에서 오버헤드가 존재할 수 있다는 의미였을 가능성이 있습니다.

권장 학습 방법:

  • Optimizing Query: 데이터베이스 쿼리를 최적화하여 불필요한 데이터 호출을 줄이고 필요한 데이터만 정확히 가져올 수 있도록 각 상황에 맞게 적절한 쿼리 구조를 만드는 것이 중요합니다.

  • 코드와 쿼리 이해 강화: 수업 자료를 다시 참고하여 어떤 맥락에서 강사님께서 말씀하신 것인지 이해하고, 예제 코드를 통해 직접 실습해보는 것을 권장드립니다.

관련 토픽에서 더 많은 정보가 필요하시다면 다음의 유사한 질문을 다룬 게시글을 참고해 보세요:

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

신나는 라이언님의 프로필 이미지
신나는 라이언

작성한 질문수

질문하기