useQuery를 사용해 내가 참여한 공동구매(채팅) 목록 데이터인 mySharings 쿼리 인스턴스 생성staleTime : 0 // 캐싱된 데이터는 언제나 stale 상태 cachTime : 60 * 5 * 1000 (5분) // inactive 상태가 된 후 5분 뒤 GC에 의해 처리 refetchOnMount, refetchOnWindowFocus, refetchOnReconnect : true // 각 시점에서 데이터가 stale 상태라면 항상 refetch retry : 3 // 쿼리 실패 시 3번까지 retry 발생 retryDelay : exponentiall backoff function
모집 상태(recruitment) : 모집중 또는 모집 완료를 나타내는 데이터 마지막 메시지(lastMessage) : 가장 마지막에 전송된 메시지안 읽은 메시지 개수(unreadCount) : 해당 유저가 확인하지 않은 메시지의 개수
- 그 외 제목이나 제품 이미지, 위치 등도 개설자가 수정해 서버 데이터를 바꾸면 변경되는 Server State이다.
useQuery를 이용해 구조분해할당으로 data 외에도 isLoading, isError, error 등을 받아와 편리하게 사용할 수 있다._app.tsx 파일에서 ReactQueryDevtools를 불러와서 넣어준다._app.tsx
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; // 불러오기 ... return ( <> <Head> <title>Ngether</title> </Head> <QueryClientProvider client={queryClient}> ... {renderWithLayout(<Component {...pageProps} /> )} ... <ReactQueryDevtools initialIsOpen={false} /> // 넣어주기 </QueryClientProvider> </> );
마지막 메시지와 안 읽은 메시지 개수 데이터의 업데이트가 수시로 일어나므로 default 값인 staleTime : 0을 유지해 데이터를 받아오는 즉시 stale 상태가 되도록 했다. refetchInterval option을 사용해 계속해서 업데이트된 데이터가 보여지는 방식도 고려해 보았으나...
실제 채팅 서비스처럼 그럴 듯해 보인다는 점이 매력적이었지만...서버가 아파 보여서 관뒀다
refetchInterval을 설정하지 않은 경우 새 채팅 메시지가 올라왔을 때 채팅 리스트 페이지에 다시 windowFocus 해주면(refetchOnWindowFocus : true) 마지막 메시지가 업데이트된다. 레퍼런스