원문 : https://tkdodo.eu/blog/offline-react-query
오타가 너무 많았어서 수정하였습니다.
TL;DR : fetchStatus - 네트워크 연결 상태를 나타내는 횡단관심사
- React Query는 비동기 상태 관리 도구 입니다.
- queryFn의 리턴값이 프로미스인 이상, 라이브러리는 동작합니다.
- 데이터가 어디에서 왔는지는 중요하지 않습니다.
- fetchStatus는 loading, sucess,error와 직교하는 또 다른 상태입니다.
- fetching: 쿼리가 실행중입니다 - 요청이 실행중입니다.
- paused: 쿼리가 실행되고 있지 않습니다
- 네트워크가 다시 연결될 때까지 쿼리가 일시 중지됩니다.
- idle: 쿼리가 현재 실행중이지 않습니다.
- v4의 기본 모드에서는 네트워크 연결이 없으면 쿼리하지 않습니다.
- 상태는 paused 입니다.
- v4에서 네트워크 연결 없을 시 중간 캐시 레이어를 따로 사용하려면(ex) pwa) offline first 모드를 사용합니다
- 혹시 네트워크가 아니라 그냥 비동기 상태 관리자로 사용할 경우(ex 하이브리드 앱, asyncStorage) always를 사용합니다.
사용 방법과 관련 문서
- 쿼리 / 뮤테이션 옵션에서 지정할 수 있음
https://tanstack.com/query/v4/docs/guides/network-mode#network-mode-online
Network Mode | TanStack Query Docs
React Query provides three different network modes to distinguish how Queries and Mutations should behave if you have no network connection. This mode can be set for each Query / Mutation individually, or globally via the query / mutation defaults. Since R
tanstack.com
https://tanstack.com/query/v4/docs/reference/useQuery
useQuery | TanStack Query Docs
const { data,
tanstack.com
V3 버전의 문제
네트워크 연결이 없어도, 쿼리를 중지하기 위해 쿼리를 재시도 해야 합니다.
1) 데이터가 캐시에 없음
- 네트워크 연결이 양호할때 게시물 목록 보기로 이동합니다.
- 연결이 끊어진 상태에서, 게시물을 클릭합니다.
다시 연결될 때까지 쿼리가 로딩 상태로 유지됩니다.
React Query Devtools는 쿼리가 가져오는 중(fetching)임을 표시하지만 이는 사실이 아닙니다.
쿼리는 실제로 (재시도)일시 중지되었지만, 해당 상태를 나타내는 개념이 없습니다. 숨겨진 구현 세부 정보입니다.
2) 재시도가 불가능

3) 네트워크 연결이 필요없는 쿼리
- React Query가 네트워크 연결이 필요하지 않은 경우에도 네트워크 연결이 필요하다고 가정하고(사례 3)
- React Query가 쿼리를 실행하지 않아야 함에도 쿼리를 실행합니다. (사례 1 및 2)
The new NetworkMode
online
fetchStatus
- fetching: 쿼리가 실행중입니다 - 요청이 실행중입니다.
- paused: 쿼리가 실행되고 있지 않습니다 - 네트워크가 다시 연결될 때까지 쿼리가 일시 중지됩니다.
- idle: 쿼리가 현재 실행중이지 않습니다.
- paused: 쿼리가 실행되고 있지 않습니다 - 네트워크가 다시 연결될 때까지 쿼리가 일시 중지됩니다.

always
offlineFirst
cache-control: public, max-age=60, s-maxage=60
위의 사례1, 사례 2. 네트워크가 없을 때도 재시도에 적절합니다.
저에게 이것들이 무슨 의미가 있나요?
전혀 신경쓰지 않아도 됩니다.
여전히 새로운 fetchStatus를 무시하고 isLoading만 확인할 수 있습니다. - React Query는 이전과 같이 작동합니다.
(위의 예시 2)는 네트워크 오류를 표시하지 않을 수 있기 때문에 더 잘 작동합니다).
그러나 네트워크 연결이 없는 상황에서 앱을 강력하게 만드는 것이 우선순위라면
이제 fetchStatus에 따라 행동할 수 있는 옵션이 있습니다.
그 새로운 상태로 무엇을 하느냐는 당신에게 달려 있습니다.
사람들이 이를 이용해 어떤 ux를 구축할지 기대됩니다. 🚀
'FrontEnd' 카테고리의 다른 글
리액트 쿼리 : 폼 (2) | 2022.06.20 |
---|---|
리액트 쿼리 : 뮤테이션 (0) | 2022.06.20 |
리액트 쿼리 : 에러 처리 (0) | 2022.06.20 |
리액트 쿼리 : 상태 관리 라이브러리 (0) | 2022.06.19 |
리액트 쿼리 : 초기값과 플레이스홀더 (0) | 2022.06.19 |