2024. 12. 31. 22:49

React Query에서 제공하는 refetchInterval, refetchOnReconnect, refetchIntervalInBackground는 쿼리 재요청(Refetch) 동작을 제어하는 옵션입니다. 각각의 옵션은 쿼리를 언제, 어떻게 다시 가져올지를 정의합니다. 아래에서 상세히 설명하겠습니다.


1. refetchInterval

  • 역할: 주기적으로 데이터를 다시 가져오기(Refetch)를 실행합니다.
  • 타입: number | false (기본값: false)
    • number: 밀리초 단위로 주기를 설정합니다.
    • false: 주기적인 재요청을 비활성화합니다.
  • 사용 예: 실시간으로 데이터를 업데이트해야 하는 경우.

작동 방식

  • 주어진 밀리초 간격으로 데이터를 자동으로 다시 가져옵니다.
  • 이 설정은 데이터가 stale(오래된) 상태가 아니더라도 요청을 실행합니다.

예제

useQuery('example', fetchData, {
  refetchInterval: 5000, // 5초마다 데이터를 다시 가져오기
});
  • 위 코드는 5초마다 API를 호출하여 데이터를 갱신합니다.

2. refetchOnReconnect

  • 역할: 네트워크 연결이 다시 활성화될 때 데이터를 다시 가져옵니다.
  • 타입: boolean (기본값: true)
    • true: 네트워크가 다시 연결되면 쿼리를 재요청합니다.
    • false: 네트워크 연결 여부에 관계없이 자동으로 재요청하지 않습니다.

작동 방식

  • 네트워크가 끊겼다가 다시 연결되었을 때, 해당 옵션이 활성화되어 있으면 데이터를 다시 가져옵니다.
  • React Query는 네트워크 상태를 감지하기 위해 브라우저의 Navigator API를 사용합니다(navigator.onLine).

예제

useQuery('example', fetchData, {
  refetchOnReconnect: true, // 네트워크 연결 복구 시 데이터를 다시 가져오기
});
  • 사용자가 네트워크를 다시 연결하면 React Query가 자동으로 데이터를 재요청합니다.

적용 시점

  • 사용자 환경에서 네트워크 연결이 불안정한 경우 유용합니다.
  • 예: 모바일 애플리케이션에서 사용자가 Wi-Fi를 다시 연결했을 때 데이터를 자동으로 동기화.

3. refetchIntervalInBackground

  • 역할: 브라우저가 백그라운드 상태에 있을 때도 refetchInterval을 유지할지 결정합니다.
  • 타입: boolean (기본값: false)
    • true: 브라우저가 백그라운드 상태여도 데이터를 주기적으로 가져옵니다.
    • false: 브라우저가 백그라운드 상태일 경우, refetchInterval이 일시 중지됩니다.

작동 방식

  • 브라우저가 백그라운드 상태로 전환되었는지 확인하기 위해 Document Visibility API를 사용합니다 (document.hidden).
  • 기본적으로 브라우저가 백그라운드에 있을 때는 네트워크 요청을 줄이기 위해 refetchInterval을 멈춥니다. 하지만 이 옵션을 활성화하면 브라우저가 백그라운드 상태에서도 주기적으로 데이터를 가져옵니다.

예제

useQuery('example', fetchData, {
  refetchInterval: 5000, // 5초마다 데이터 갱신
  refetchIntervalInBackground: true, // 백그라운드 상태에서도 갱신
});
  • 위 설정에서는 브라우저가 백그라운드 상태일 때도 5초마다 데이터를 가져옵니다.

적용 시점

  • 실시간 데이터가 매우 중요할 때(예: 주식 가격, 실시간 알림 등).
  • 네트워크 요청이 빈번하게 발생하므로 사용 시 주의가 필요합니다.

옵션 간의 상호작용

refetchInterval과 refetchIntervalInBackground

  • refetchInterval이 활성화되어 있어야 refetchIntervalInBackground가 의미를 가집니다.
  • refetchIntervalInBackground: false이면, 브라우저가 백그라운드 상태일 때 refetchInterval이 일시 중지됩니다.
  • 두 옵션을 함께 사용하여 데이터를 주기적으로 업데이트하면서 네트워크 부하를 제어할 수 있습니다.

refetchOnReconnect와 refetchInterval

  • 두 옵션은 독립적으로 작동합니다.
  • refetchOnReconnect는 네트워크 상태 변화를 기준으로 동작하며, refetchInterval은 주기적인 데이터 요청을 기준으로 동작합니다.
  • 예를 들어, refetchInterval이 5초로 설정되어 있다면, 네트워크가 끊겼다가 복구된 시점에 즉시 데이터를 요청합니다.

실제 사용 예제

실시간 데이터 갱신 예제

주식 가격 데이터를 실시간으로 가져오고, 백그라운드 상태에서도 데이터를 주기적으로 갱신합니다.

useQuery('stockPrices', fetchStockPrices, {
  refetchInterval: 1000, // 1초마다 데이터 갱신
  refetchIntervalInBackground: true, // 백그라운드 상태에서도 갱신
});

모바일 애플리케이션 예제

네트워크 연결이 끊겼다가 다시 연결될 때 데이터를 자동으로 가져옵니다.

useQuery('userProfile', fetchUserProfile, {
  refetchOnReconnect: true, // 네트워크 복구 시 자동으로 데이터 요청
});

네트워크 최적화 예제

  • 10초마다 데이터를 갱신하되, 백그라운드 상태에서는 데이터 요청을 멈춥니다.
  • 네트워크 연결 복구 시에도 데이터를 자동으로 동기화합니다.
useQuery('dashboardData', fetchDashboardData, {
  refetchInterval: 10000, // 10초마다 데이터 갱신
  refetchIntervalInBackground: false, // 백그라운드 상태에서는 갱신 중지
  refetchOnReconnect: true, // 네트워크 복구 시 데이터 동기화
});

옵션 비교

옵션 기본값 역할 사용 사례

refetchInterval false 데이터를 주기적으로 다시 가져오기 실시간 업데이트(예: 주식, 실시간 알림)
refetchOnReconnect true 네트워크 연결이 복구되면 데이터를 다시 가져오기 모바일 환경에서 네트워크 연결 복구 시 데이터 동기화
refetchIntervalInBackground false 백그라운드 상태에서도 데이터를 주기적으로 가져오기 브라우저 백그라운드에서도 실시간 업데이트가 필요한 경우

결론

  • refetchInterval: 주기적으로 데이터를 갱신해야 할 때 사용.
  • refetchOnReconnect: 네트워크 복구 시 자동으로 데이터를 다시 가져오기.
  • refetchIntervalInBackground: 브라우저가 백그라운드 상태여도 주기적인 갱신을 유지.

이 세 가지 옵션을 상황에 맞게 조합하여 실시간 데이터 처리 및 네트워크 최적화를 구현할 수 있습니다.