(7.14) 포스트 삭제 후 무한 스크롤이 작동하지 않는 문제
안녕하세요. 좋은 강의 잘 수강하고 있습니다!
다름이 아니라 포스트 삭제 후에 무한 스크롤이 작동하지 않는 문제가 발생했습니다.
문제 상황은 다음과 같습니다.
첫 페이지(다음 페이지의 데이터를 페칭하지 않은 상태)에서 작성한 포스트를 삭제
이후 페이지 최하단까지 스크롤 했지만 무한 스크롤 데이터 페칭이 이루어지지 않음
부족한 실력이라 AI의 도움을 받아 원인을 분석했을 때 다음과 같았습니다. 아래는 AI의 답변입니다.
무한 스크롤이 작동하지 않는 원인 분석:getNextPageParam의 로직
useInfinitePostData 훅에서 다음 페이지를 불러올지 결정하는 로직은 다음과 같습니다:
// src\hooks\queries\use-infinite-posts-data.ts
// ...
const PAGE_SIZE = 5;
// ...
getNextPageParam: (lastPage, allPages) => {
if (lastPage.length < PAGE_SIZE) return undefined; // 🚫 문제의 원인
return allPages.length;
},
이 로직은 "마지막으로 불러온 페이지의 항목 개수가 PAGE_SIZE (5개)보다 적으면, 더 이상 데이터가 없으므로undefined를 반환하라 (즉, 다음 페이지를 불러오지 마라)"고 지시합니다.
삭제가 로직에 미치는 영향:
초기 상태: 0번 페이지에 5개의 게시글이 있습니다. (
lastPage.length= 5)삭제 이벤트: 사용자가 0번 페이지의 게시글 1개를 삭제합니다.
캐시 업데이트:
useDeletePost의onSuccess에서 해당 게시글 ID를 0번 페이지의 캐시 데이터에서 제거합니다.결과: 0번 페이지의 항목 개수가 5개에서 4개로 줄어듭니다.
무한 스크롤 시도: 사용자가 스크롤하여
ref(inView)가 활성화됩니다.getNextPageParam실행: React Query는 0번 페이지의 현재 캐시 데이터를 확인합니다.lastPage.length는 이제 4입니다.잘못된 판단:
4 < PAGE_SIZE (5)이므로,getNextPageParam은 즉시undefined를 반환합니다.
따라서 1번 페이지(실제 서버에는 데이터가 있을 수 있음)를 불러오기도 전에, 캐시 데이터가 줄어든 것 때문에 다음 페이지 로딩이 차단되어 무한 스크롤이 작동하지 않게 되는 것입니다.
마지막 페이지에 속한 포스트를 삭제했을 때, PAGE_SIZE보다 항상 작아지니 다음 페이지가 없다라고 판단하기에 무한 스크롤이 작동하지 않는다고 이해했습니다.
캐시를 무효화해 리페칭해서 해결하려고 하는데, 다른 대안이 있을까요?
혹여 제 실수로 잘못된 동작이 일어난 건지 GitHub Repo도 같이 첨부했습니다!
https://github.com/scseong/onebite-sns
답변 1
2
안녕하세요 seong2님 이정환입니다.
우선 ... seong2님이 말씀하신 내용이 모두 맞습니다. 이 부분은 미처 생각하지 못했네요 🥲
이 버그를 수정하려면 말씀하신대로 포스트 삭제시에 캐시의 일부만 수정하도록 하지 말고, 아예 전체 캐시를 무효화 하여 리페칭 시키는 방법이 가장 좋을 것 같습니다. 이게 가장 단순하고 안전한 방법일 것 같아요
다음주 중으로 강의에 해당 내용 업데이트 해두도록 하겠습니다. 제보해 주셔서 감사합니다 🙇♂
PS. 만약 캐시 무효화 없이도 해결 가능한 방법을 원하신다면, 오프셋 기반 대신 커서 기반의 페이지네이션을 구현하는 방식으로도 해결 가능합니다!
회원가입 구현 (구현 후 최종 화면 출력 X)
0
41
2
(6.11) 회원가입시 프로필 정보 자동 생성하기 Q. 호출 순서 문의
0
37
1
명시적 타입 선언(콜론 타입 선언)과 as 타입 단언 차이
0
37
2
useMutation 적용 후 새로운 글 등록시 content가 안보여요
0
49
2
6.8 zustand 세션 질문입니다.
0
92
2
next.js 강의에서도 리액트 라이브러리들을 다뤄주시나요?
0
79
2
shadcn에서 radix ui와 base ui 차이는 뭔가요?
1
324
2
updateTodo 함수 생성시 화살표 함수 사용 안하는 이유
0
75
2
4.11 바로 투두 삭제가 안됨 질문
0
86
3
매개변수 updatedTodo 관련 질문
0
66
3
인증 정보가 만료되었을 때 라우트 가드 처리가 궁금합니다!
0
79
2
supabase를 사용하지 않을 경우 세션 데이터의 변경을 감지하고 스토어에 보관하는 방법이 궁금합니다!
0
69
2
4.6 id를 string으로 변경시 오류
0
64
2
리액트 타입스크립트 관련 질문있습니다.
0
62
1
소셜 로그인 구현하기 관련하여 질문이 있습니다!
0
98
2
ui 파일 질문드립니다.
0
76
1
tanstack query devtools에서 질문있습니다!
0
66
2
댓글 삭제 시 isPending 질문
0
64
2
두번째 예외상황에 대해 질문있습니다!
0
65
1
리액트 쿼리 질문입니다
1
72
2
개발자도구에서 components 가 안보입니다.
0
94
3
state 관리에 대한 정리
0
79
3
[(2.4) Shadcn/ui를 소개합니다] 강의 Shadcn 세팅 관련 질문 있습니다.
0
177
3
like 테이블에서 왜 create_at이 필요한지 궁금합니다.
0
78
1





