1. React-Query란?
현업에 들어간지 이제 1개월차가 되고, 열심히 적응해 나갔고 ,이제는 하나씩 적립해나가야할 기술 중 하나인 React-query에 대해 정리해보려고 합니다.
: React-query는 데이터 Fetching , 캐싱 동기화, 서버 쪽 데이터 업데이트 등을 쉽게 만들어 주는 React 라이브러리입니다.
장점
2. useQuery ,useMutation
1. useQuery는 Raect Query를 이용해 서버로부터 데이터를 조회해올 떄 사용한다.
2. useMutaion 는 데이터 변경 작업을 할 떄 사용된다.( insert, update , delete)
: useQeury 사용시 해당 api의 데이터를 캐싱하는데, key값을 가지고 캐싱하게 된다. 그래서 다시 해당페이지로 돌아올 시 , key값을 통해 확인하여 데이터가 존재하면 해당 값을 들고오게 되어 불필요한 api호출을 하지 않아도 된다.
: query Function으로 promise 처리가 이루어지는 함수라고 할 수 있다.
( api 호출 함수를 입력하는 곳? 이라고 생각하면 될 것 같다 )
: useQuery 사용 시 , 세번쨰 인자 객체는 그 내부에서 비동기 데이터 처리의 겨로가에 대해서 특정 처리를 할 수 있는 콜백함수를 담을 프로퍼티를 담는 옵션을 제공한다.
onSuccess ? : (data:TData) => void
onError ? : (err:TError) => void
onSettled? : (data: TData |undefined, error: TError|null)=> void
: useQuery 호출 시, 주어지는 것 중 하나인데, 캐싱결과를 조회하지 않고 완전히 무시한채로 그냥 ajax 요청을 날리는 메서드이다.
: enabled:false는 useQeury의 기능을 사용하지 않겠다고 말해주는 것과 같다.
useQuery(['todos', todoId], async () => {
const data = await fetchTodoById(todoId);
return data
});
3. 캐싱과 staleTime
: stale은 최신화가 필요한 데이터를 의미합니다.
즉, 신선하지 않은 데이터로 캐싱되어 있더라도 stale한 값이면 refetch하게 됩니다.
option 중에 defualt가 0이면 stale한 데이터로 판단하게 되어 있습니다.
: 캐싱된 값들이 언제까지 유지될지를 말해주는 옵션입니다.
캐시 구조에 저장된 데이터가 존재하게 되는데, 이 떄 , 캐싱된 쿼리의 결과값은 계속 유지되는 것이 아니라 시간이 지나면 메모리에서 사라지게 됩니다.
기본 설정된 캐싱타입은 5분으로 설정되어 있습니다.
: 위의 캐싱과 관련된 내용은 Raect-query에서 제공해주는 메서드 useQueryClient를 통해 조회를 할 수 있습니다.
queriesMap 안에 존재하는 것을 확인할 수 있습니다.

4. 내 프로젝트 코드로 테스트해보기
: 내가 만든 프로젝트의 api로 test를 해보았다. isLoading을 이용하여,
data fetch 여부를 확인할 수 있었고, 캐싱된 데이터를 불러오기에 로드하는 속도가 눈에뛰에 빨라진 것을 확인해 볼 수 있었습니다.
tip) isLoading
: 최초 useQeury 실행시에 , true인 상태였다가 data fetch 이후 false로 전환된다 .
그리고 다른 페이지 이동후 다시 돌아왔을 떄, key값으로 캐싱 데이터를 확인하고 캐싱되었다면 false로 바로 반환된다.
const { data, isLoading, status, isFetching } = useQuery<slideInfo[]>({
queryKey: ["test"],
queryFn: () =>
axiosInstance.get("/home/club/top/list").then((res) => {
return res.data;
}),
});
console.log(isLoading); // 최초 실행시 true, 캐싱 이후 false
- 느낀점
현 회사에서, React-query를 사용중이기에, 나도 react-query를 이용해 코딩을 했습니다.
그러나 , 어떻게 캐싱이 되고 어느시점에 refetch를 써야되고 이런 개념을 제대로 숙지하지 못하고 썼기에 다른 코드를 보고 느낌에 의존하여 기능을 만들었습니다.
지금 이해를 하고 보니 내가 짠 코드들이 살짝 수정해야될 부분들이 떠올라서 오늘 배운 개념으로 리팩토링을 조금 해야될 것 같다는 것을 알게 되었습니다.
일을 시작한지 이제 한달차가 되어 ,채워나가야될 부분들을 차근차근 공부해나가야 될 것 같습니다.
react-query는 제 프로젝트에서 무한 스크롤 구현 떄 사용을 했었습니다. 그러나 그 당시에는 , 무한스크롤에만 포커싱하여 사용해서 제대로 이해를 하고 사용하지는 않고 구현에만 신경을 썼습니다 .이제는 어떤 라이브러리를 사용하면, 어느정도 이해를 하고 사용 이유를 충분히 이해하고 사용해야겠습니다.
그리고 , 내 프로젝트의 문제중 하나였던 용량 큰 이미지 로드로 인한 렌더링 속도 문제가 있었는데, React-Query를 이용하면 상당히 개선시킬 수 있을 것 같아서 적용해 봐야겠다는 생각이 들었습니다.
https://jforj.tistory.com/243
https://www.notion.so/staleTime-2d2ae9b5738a4186be4c4ca73d41d77d?pvs=4#46513f46885e454e8812b782a5a82450
https://www.notion.so/staleTime-2d2ae9b5738a4186be4c4ca73d41d77d?pvs=4#46513f46885e454e8812b782a5a82450