- 주식이나 디지털 자산 거래소를 보면, 실시간으로 현재 가격이 계속 실시간으로 갱신되어 최신 가격이 보이는 것을 확인할 수 있다.
- 리액트에서 이와 같은 기능을 어떻게 구현할 수 있을지 생각해 보았다.
- 실시간으로 서버와 통신을 하기 위해서 소켓을 사용할 수 있다.
- 소켓을 사용하는 방법 이외에 서버의 실시간 데이터를 받아 데이터를 갱신할 수 있는 방법으로 React Query를 사용해보기로 하였다.
- npm i react-query로 리액트 쿼리를 설치한다.
import { QueryClient, QueryClientProvider } from "react-query";
const queryClient = new QueryClient();
function App() {
return (
<div className="App">
<QueryClientProvider client={queryClient}>
<p>안녕!</p>
</QueryClientProvider>
</div>
);
}
export default App;
import { useQuery } from "react-query";
const Data = () => {
const 필요한데이터요청 = "id";
const {isLoading, error, data, isFetching} = useQuery(
[필요한데이터요청], () => {
return fetch(`https://API 주소/${필요한데이터요청}`)
.then((res) => res.json())
.then((res) => res.data) // return값이 data에 담기게 된다.
}
, {
enabled: !!필요한데이터요청, // 해당 변수가 있을 때만 요청을 보낸다
refetchInterval: 1000 // 1초마다 갱신
}
);
if(isLoading){
return <h1>로딩중!</h1>;
}
if(error){
return <h1>에러 발생!</h1>;
}
return (
<div>
<p>데아터 보여주기</p>
<p>{data}</p>
</div>);
}
export default Data;
🫐 두 번째 인자에 사용될 수 있는 ajax 라이브러리로 fetch, axios 등이 있다.
🫐 동일한 queryKey의 값은 다시 서버에 요청을 보내지 않는다. 맨 처음의 요청의 결과, 이미 캐싱된 값을 사용한다.
🫐 위와 같이 세 번째 인자로 refetchInterval를 설정하여 실시간으로 데이터를 계속 받아올 수 있다.
🫐 isLoading는 캐시가 없을 때, isFetching는 캐시에 유무에 상관없이.
error가 발생하면, 그 정보가 error에 담긴다.
fetch가 성공하면 그 데이터는 data에 담기게 된다.
enabled옵션이 있으면, 해당 변수가 true인 경우에만 useQuery가 실행된다.
깃허브 주소 : https://github.com/citron03/realtime_coin_transaction_history
참고한 리액트 쿼리 공식 문서 : https://react-query.tanstack.com/overview