FRONT/React JS Master

ReactQuery (useQuery)

dazz6 2024. 11. 28. 18:00

useQuery라는 hook을 배웠는데 이거 정말 신세계다!

 

ReactQuery란 애플리케이션의 데이터를 관리하고 동기화하는 데 사용되는 상태 관리 라이브러리다.

  const { isLoading, data } = useQuery<CoinInterface[]>("allCoins", fetchCoin);

useQuery(고유식별자, fetcher function) 의 형식으로 사용한다.

* 여기서 fetcher function은 반드시 promise를 반환해야 함

* useQuery의 제네릭(<여기>)에는 반환될 data의 타입을 적어 주면 됨

 

ReactQuery 반환객체 주요 속성
isLoading: 데이터 fetch 중이면 true, 아니면 false

-> 자동으로 가져오는 동안 true, 가져오면 false를 반환
data: fetcher 함수가 성공적으로 반환한 데이터

-> 자동으로 data에 치환됨!!!
isError: fetcher 함수가 실패했을 때 true
error: fetcher 함수가 반환한 에러 객체
isFetching: 백그라운드에서 데이터를 다시 가져오는 중인지 나타냄

 

useState 로 loading, setLoading 상태를 만들어 조건부 렌더링하던 지난 프로젝트의 나날들이 떠오르고...

fetcher function을 별도의 파일로 분리하여 관리해 주니까 코드가 훨씬 깔끔하고 가독성이 좋다.

 
 const { isLoading: infoLoading, data: infoData } = useQuery<InfoData>(
    ["info", coinId],
    () => fetchCoinInfo(coinId)
  );
  const { isLoading: tickersLoading, data: tickersData } = useQuery<PriceData>(
    ["tickers", coinId],
    () => fetchCoinTickers(coinId)
  );

 
이런 식으로 useQuery를 두 번 이상 사용할 경우, isLoading 과 data 처럼 정해진 이름이 중복되면 구분할 수 없으므로 콜론(:)을 사용해 이름을 지정해 준다.

첫 번째 인자는 고유 식별자여야 하므로 array를 사용하여 온전한 고유식별자를 구현하는 것을 권장한다.

 

그리고 useQuery의 제일 큰 장점 중 하나는, 가져온 데이터를 파괴하지 않고 캐시에 저장해 둠! 이것도 무려 자동!

data가 캐시에 이미 저장되어 있으면(useQuery에서 첫 번째 인자로 지정해 둔 고유식별값이 캐시에 이미 있으면) fetcher function에 접근하지 않고 캐시에서 데이터를 가져온다. 공부할수록 react는 정말 멋진 라이브러리라는 생각이 든다... 감동 (ㅠㅠ)

 

https://musma.github.io/2023/09/14/react-query.html