ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด API ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๋๋ฌด๋ ๊ธฐ๋ณธ์ ์ธ ์์
์ธ๋ฐ,
์ง์ fetch
๋ง ์จ์ ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ฉด ์๊ฐ๋ณด๋ค ๊ด๋ฆฌํ ๊ฒ ๋ง๋ค. (๋ก๋ฉ ์ํ, ์๋ฌ ์ฒ๋ฆฌ, ์บ์ฑ ๋ฑ)
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ ๋ฐ๋ก SWR๊ณผ React Query ๊ฐ์ ๋ฐ์ดํฐ ํจ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ!
์ด๋ฒ ๊ธ์์๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์ ์จ๋ณด๊ณ ๋๋ ์ฐจ์ด์ ์ ํ ๊ธฐ์ค์ ์ ๋ฆฌํด๋ดค๋ค.
SWR = Stale-While-Revalidate
(์กฐ๊ธ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๋ณด์ฌ์ฃผ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๋ต)
import useSWR from 'swr'
const fetcher = (url: string) => fetch(url).then(res => res.json())
function Profile() {
const { data, error, isLoading } = useSWR('/api/user', fetcher)
if (error) return <div>์๋ฌ ๋ฐ์</div>
if (isLoading) return <div>๋ก๋ฉ ์ค...</div>
return <div>์๋
ํ์ธ์, {data.name}๋</div>
}
mutate
๋ก ์บ์ ์ง์ ์์ ๊ฐ๋ฅReact Query = "์๋ฒ ์ํ ๊ด๋ฆฌ"๋ฅผ ์ํ ๋๊ตฌ
ํด๋ผ์ด์ธํธ ์ํ(useState
)์ฒ๋ผ ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํด์ค๋ค.
TanStack Query
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐ์ import { useQuery } from '@tanstack/react-query'
const fetchUser = async () => {
const res = await fetch('/api/user')
return res.json()
}
function Profile() {
const { data, error, isLoading } = useQuery({
queryKey: ['user'],
queryFn: fetchUser
})
if (isLoading) return <div>๋ก๋ฉ ์ค...</div>
if (error) return <div>์๋ฌ ๋ฐ์</div>
return <div>์๋
ํ์ธ์, {data.name}๋</div>
}
ํญ๋ชฉ | SWR | React Query |
---|---|---|
๋ง๋ ๊ณณ | Vercel | Tanner Linsley (TanStack) |
์ฃผ์ ๋ชฉ์ | ๊ฐ๋จํ ๋ฐ์ดํฐ fetch + ์บ์ฑ | ์๋ฒ ์ํ ๊ด๋ฆฌ ์ ์ฒด |
์ฝ๋ ๋ณต์ก๋ | ์ฌํ, ์ต์ ์ค์ | ๋ค์ํ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ณต์ก๋ ์์น |
๊ธฐ๋ฅ ํ์ฅ์ฑ | ๊ธฐ๋ณธ fetch + ์บ์ ๊ด๋ฆฌ | Mutation, Pagination, etc. |
์๋ ๋ฆฌํจ์น | ์ง์ | ๋ ์ธ๋ฐํ ์ค์ ๊ฐ๋ฅ |
SSR ์ง์ | ์ง์ fetch ์กฐ์ ํ์ | ๊ณต์์ ์ผ๋ก SSR ์ง์ ๊ฐํ |
๋ฌดํ์คํฌ๋กค ์ง์ | ์ง์ ๊ตฌํ ํ์ | ๊ธฐ๋ณธ ์ง์ |
ํ๋ก์ ํธ ์ฑ๊ฒฉ | ์ถ์ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
---|---|
๊ฐ๋จํ ๋ฐ์ดํฐ fetch ์์ฃผ | SWR |
CRUD๊ฐ ๋ง๊ณ , ์๋ฒ ์ํ๋ฅผ ํตํฉ ๊ด๋ฆฌํด์ผ ํจ | React Query |
SEO, SSR ๊ณ ๋ ค ํ์ | React Query |
SWR
์ด ๋ ๊ฐํธํ ๋๊ฐ ๋ง๋ค. (ํนํ Client Components์์)React Query
๋ฅผ ์ด๋ค. (Mutation ๊ด๋ฆฌ๊ฐ ์ค์ํ๊ธฐ ๋๋ฌธ)React Query
๊ฐ ์ข๋ค.์ฒ์์๋ "๋ ๋ค ๋๊ฐ์ด fetch๋ง ํด์ฃผ๋ ๊ฑฐ ์๋?"๋ผ๊ณ ์๊ฐํ๋๋ฐ,
์จ๋ณด๋๊น SWR์ ๋จ์ํ fetch + ์บ์ฑ,
React Query๋ ์์ ์๋ฒ ์ํ(state)๋ฅผ ๊ด๋ฆฌํ๋ ์์ค์ด์๋ค.
ํนํ ์๋ฌ ๋ฆฌํธ๋ผ์ด, ์ตํฐ๋ฏธ์คํฑ ์
๋ฐ์ดํธ, ์ฟผ๋ฆฌ ๋ฌดํจํ(invalidate) ๊ฐ์ ๊ธฐ๋ฅ์ด
์ง์ง ๋ณต์กํ ์ํฉ์์ ์์ฒญ ํฐ ๋์์ด ๋๋ค๋ ๊ฑธ ๋ชธ์ผ๋ก ๋๊ผ๋ค.
๐ฏ "SWR์ ๊ฐ๋ฒผ์ด ์คํ ๋ฐ์ด, React Query๋ ํ ์ต์ SUV๋ค. ํ๋ก์ ํธ ํฌ๊ธฐ์ ๋ง์ถฐ ๊ณ ๋ฅด์!"