
โ SWR์ด๋?
Stale-While-Revalidate
Stale: ์ค๋๋, ๋ก์
While: ~ํ๋ ๋์์
Revalidate: ๋ค์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ค, ๋ค์ ํ์ธํ๋ค.
"์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ฐฑ์ ํ๋ค."
SWR์ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๋ ์์ ์ ์ํ ์ฌ๋ฌ๊ฐ์ง ํ ์ ๊ฐ์ง๊ณ ์๋ค.
(SWR์ NextJS๋ฅผ ๋ง๋ ์ฌ๋๋ค์ด ๋ง๋ค์๋ค. ๊ทธ๋์ NextJS์ ์์ฃผ ์ ๋ง๋๋ค.)
API ์์ฒญ์ ๋ค์ ํ์ง ์๊ณ , ์ ์ ๋ฐ์ ์บ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ทธ๋ฐ๋ฐ SWR์ ์ ๋ง ๋๋ํ๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋ชจ๋ฅด๊ฒ API ์์ฒญ์ ๋ณด๋ด ๋ฐ์ดํฐ ๋ด์ฉ์ด ๋ฐ๋์๋์ง ์ฒดํฌํ๋ค.
(๋ง์ฝ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํด์ค๋ค.)
โ ์ฌ์ฉ๋ฒ
์ค์น
npm i swr
(React๋ฅผ rc ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฉด ๋ค์ --legacy-peer-deps๋ฅผ ์ถ๊ฐํด ์ค์นํ๋ค.)
useSWR()์ ์ฌ์ฉํ ๋๋ 2๊ฐ์ ์ธ์๊ฐ ํ์ํ๋ค.
1. ์์ฒญ์ ๋ณด๋ผ URL
2. fetcher fn
์์
import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import useSWR from "swr";
const fetcher = (url: string) => fetch(url).then((response) => response.json());
export default function useUser() {
const { data, error, mutate } = useSWR("/api/users/me", fetcher);
const router = useRouter();
// return router.replace("/enter");
return data;
}
mutate: ์บ์ ์์ ์ ์ฅ๋ data๋ฅผ ์์ ํ๋ ํจ์
useSWR()์ ์ ์ ๊ฐ ๋ค๋ฅธ ํญ์ผ๋ก ๊ฐ๋ค๊ฐ ๋ค์ ๋์์์ ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก๊ณ ์นจ ํ๋ ๊ฒ๋ ํด์ค๋ค.
โ bound mutate, unbound mutate
bound mutate: ํด๋น ํ์ด์ง์์ ์ป์ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋
unbound mutate: ๋ค๋ฅธ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋
โ SWRConfig
๋ชจ๋ ํ์ด์ง์ ์ ์ฉ๋์ด fetcher ๊ฐ์ ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์๋ provider
(SWR์ ์๋ ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ ์ฉ๋๋ค.)
์์(_app.tsx)
import "../styles/globals.css";
import type { AppProps } from "next/app";
import { SWRConfig } from "swr";
function MyApp({ Component, pageProps }: AppProps) {
return (
<SWRConfig
value={{
fetcher: (url: string) =>
fetch(url).then((response) => response.json()),
}}
>
<div className="mx-auto w-full max-w-xl">
<Component {...pageProps} />
</div>
</SWRConfig>
);
}
export default MyApp;
์ด๋ฐ ์์ผ๋ก fetcher์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์๊ณ , ๋ค๋ฅธ ๊ธ๋ก๋ฒ ์ต์ ๋ ์ง์ ํ ์ ์๋ค.
ex) refreshInterval: 2000 -> 2์ด๋ง๋ค ์๋ก๊ณ ์นจ
'๐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ - TanStack Query(React Query) (0) | 2026.02.03 |
|---|---|
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ - Zod (0) | 2025.12.03 |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ - NextAuth (0) | 2025.07.04 |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ - Iron Session (0) | 2025.07.04 |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ - React Hook Form (2) | 2025.05.27 |