SWR은 Next.js로 유명한 Vercel에서 만든 원격 데이터 가져오기를 위한 Hook입니다.
오직 useSWR이라는 훅을 사용하여 데이터를 조작합니다.
const { data, error, isValidating, mutate } = useSWR(key, fetcher, options)
const [value, setValue] = useState("");
const [currentPage, setCurrentPage] = useState(1);
const get = async (keyword: string, currentPage: number) => {
if (keyword.trim() === "") {
return {
total: -1,
juso: [],
};
}
const res = await jusoApi.get("", {
params: {
keyword,
currentPage,
},
});
const { data, isValidating } = useSWR(
[value, currentPage],
() => get(value, currentPage),
{
revalidateIfStale: false,
revalidateOnFocus: false,
revalidateOnReconnect: false,
dedupingInterval: 10 * 1000, // 10 sec
}
);
제가 useSWR을 사용하여 데이터를 가져온 코드입니다.
첫번째 인자로 value와 currentPage가 담긴 배열을 담습니다. 이렇게 되면 만약 10초 안에 같은 value와 currentPage로 호출했다면 API 호출을 하지 않고 캐시에 있는 데이터를 사용합니다.
dedupingInterval에서 stale time을 10초로 설정하였기 때문입니다.
두번째 인자로 fetcher를 설정해줍니다.
get이라는 함수는 value와 currentPage를 받아서 axios로 API에 호출을 합니다.
세번째 인자로 옵션을 설정해줍니다.
위에서 설명한대로 필요한 옵션을 가져다가 설정해주면 됩니다.
useSWR에는 mutate라는 결과값이 있습니다. 이걸 활용하여 데이터를 조작할 수 있습니다.
const { data, mutate } = useSWR("submit", () => post(state));
const post = async (state: IState) => {
if (!state.phoneNumber) {
return {};
}
const res = await caredocApi.post("/application", state);
return res.data;
};
useEffect(() => {
(async () => {
const res = await mutate(state);
// 받은 res의 데이터 중 _id로 POST 조회 가능
})();
}, [state.phoneNumber]);
저의 경우에는 전역 상태로 관리하는 state의 phoneNumber라는 요소가 변경되면 mutate를 통해서 POST 요청을 보내도록 하였습니다.
사용법은 GET 요청일 때와 거의 비슷합니다.
첫 번째 인자로 키를, 두 번째 인자로 fetcher를 넣어줍니다.
옵션은 여기서 필요하지 않으므로 생략하였습니다.
이렇게 결과값으로 받은 mutate를 사용하면 이미 키, fetcher 등이 모두 바인딩되어 있는 상태이기 때문에 따로 어떤 추가 설정이 필요없습니다.
그저 올바른 인자를 넣어주고 호출만 하면 됩니다.
리액트 쿼리와 SWR 둘 다 사용해보았는데 가볍게 요청을 보낼 목적이라면 SWR을, 세부적으로 설정을 해야 할 필요가 있다면 리액트 쿼리가 낫겠다는 생각을 하였습니다.