• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

N+1 문제를 맞게 이해한 것인지 잘 모르겠습니다.

22.07.03 16:40 작성 조회수 409

3

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.
 
이번 강의를 통해 공부하면서 N+1문제를 아래와 같이
이해하였습니다.
 
ex) 모든 주문 내역을 가져오는 경우
 
-> 실제로 나가는 쿼리는 select * from orders
쿼리 한방이지만,
 
1) 이때 지연로딩인 경우 , 조회한 order에 대해 member나 delivery를 필요로 하는 경우에 각 order별로 member나 delivery 조회 쿼리가 N번씩 나가게 되고
 
2) 즉시 로딩인 경우, select * from orders
라는 모든 주문 조회 쿼리 한방이 나간 후,
곧바로 조회한 order들과 연과된 member와 delivery 조회 쿼리가 이어서 나가게 된다.
(단 이떄 예측할 수 없는 쿼리가 나갈 수 있음.)
 
즉 정리하면 즉시로딩과 지연로딩 모두 N+1 문제가 발생할 수 있지만,
즉시로딩은 예측할 수 없는 쿼리가 나갈 수도 있어 최적화 시키기 어려운 반면,
지연 로딩은 페치 조인을 사용하여 order를 조회하면서 동일 쿼리 상에서 member나 delivery도 함께 가져오게 하는방법으로 최적화 시킬 수 있으니,
지연로딩을 사용하는것이 옳다.
라고 이해하였는데,
맞게 이해한 것인지 잘 모르겠습니다.
 
감사합니다.

답변 1

답변을 작성해보세요.

1

안녕하세요. khd1692님

생각하신 내용이 맞습니다. 한가지 보충해드리면 즉시 로딩도 fetch join으로 최적화는 가능합니다.

감사합니다.