๐ SWR์ด๋?
"SWR"์ด๋ผ๋ ์ด๋ฆ์ HTTP RFC 5861(opens in a new tab)์ ์ํด ์๋ ค์ง HTTP ์บ์ ๋ฌดํจ ์ ๋ต์ธ stale-while-revalidate์์ ์ ๋๋์๊ณ SWR์ ๋จผ์ ์บ์(stale)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ํ, fetch ์์ฒญ(revalidate)์ ํ๊ณ , ์ต์ข ์ ์ผ๋ก ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๋ต์ด๋ค.
โ๏ธ Redux์ SWR์ ์ฐจ์ด?
๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค๋ ๋ชฉ์ ์์ Redux๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ํ ๋ฐ SWR์ ์ ์ฌ์ฉํ ๊น ๊ถ๊ธํ๋ค.
- Redux ๋ ์ ์ญ ์ํ ์์ ์ ๋์์ฃผ๋ state management ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ณ ,
- SWR ์ ์๋ฒ ์ํ ์์ ์ ๋์์ฃผ๋ data fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.(์ ์ญ์ํ๊ด๋ฆฌ๋ก๋ ์ฌ์ฉ์ ๊ฐ๋ฅํจ)
์ฆ Redux๋ isOpenModal ์ฒ๋ผ local ์์์ ์ ์ญ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๊ณ
SWR์ server์ api๋ฅผ ์์ฒญํ๊ณ ์๋ต๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ค.
SWR ๋์ Redux-saga,Redux-thunk์ ์ฌ์ฉํ์ง๋ง ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ ๊ด๊ณ๋ก SWR์ ์ฌ์ฉํ๋ค.
๊ทธ๋์ ์ฌ์ฉ๋ชฉ์ ์ ๋ฐ๋ผ Redux์ SWR(or react-query)์ ํจ๊ป ์ฌ์ฉํ๊ธฐ๋ ํจ.
โญ๏ธ ์ฌ์ฉ๋ฐฉ๋ฒ?
npm i swr
import useSWR from 'swr'
import axios from 'axios'
function Profile () {
const fetcher = (...args) => axios(...args).then(res => res.json())
const { data, error, isLoading } = useSWR(apiURL, fetcher)
if (error) return <div>failed to load</div>
if (isLoading) return <div>loading...</div>
// ๋ฐ์ดํฐ ๋ ๋๋ง
return <div>hello {data.name}!</div>
}
1) JSON ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ RESTful API๋ผ๋ฉด ๋จผ์ ๋ค์ดํฐ๋ธ fetch์ ๋จ์ํ ๋ํผ์ธ fetcher ํจ์๋ฅผ ์์ฑํ๋ค.
2) ๊ทธ ๋ค์, useSWR์ importํ๊ณ ํจ์ ์ปดํฌ๋ํธ ๋ด์์ ์ฌ์ฉํจ.
3)useSWR์์ apiURL์ด fetcher์ ๋งค๊ฐ๋ณ์๋ก ํ ๋น ๋จ. fetcher ํจ์๋ ๋น๋๊ธฐํต์ ์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด.
4)fetcherํจ์๋ฅผ ํตํด ๋ฐ์์จ ๊ฐ์ data์ ์ ์ฅ๋๋ค. ์งํ์ค์ด๋ฉด isLoading, ๋ฌธ์ ๊ฐ ์์ผ๋ฉด error
โจ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ?
์น ์ฑ์ ๊ตฌ์ถํ ๋, ๋ค๋ฅธ component์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉ ํด์ผํ ๋๊ฐ ์๋ค.
SWR๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ hook์ ๋ง๋ค์ด์ ์ฌ์ฉํ ์ ์์.
useUser.jsx ํ์ผ์ useUser ํจ์(fetcher ์ญํ )๋ฅผ ๋ง๋ค์ด์ exportํด์ฃผ๊ณ
๋ด๊ฐ ์ํ๋ ์ปดํฌ๋ํธ์์ importํด์ ์ฌ์ฌ์ฉํจ.
//swr์์ ์ฌ์ฉํ fetcherํจ์๋ฅผ ๋ง๋ค์ด์ exportํด์ฃผ๊ธฐ.
import useSWR from 'swr'
export function useUser (id) {
const { data, error, isLoading } = useSWR(`/api/user/${id}`, fetcher)
return {
user: data,
isLoading,
isError: error
}
}
export default useUser;
//useUser์ importํด์ Avatar ์ปดํฌ๋ํธ์์ ์ฌ์ฉ
import useUser from './useUser.jsx'
function Avatar ({ id }) {
const { user, isLoading, isError } = useUser('/api/user')
if (isLoading) return <Spinner />
if (isError) return <Error />
return <img src={user.avatar} />
}
//useUser์ importํด์ Content ์ปดํฌ๋ํธ์์ ์ฌ์ฉ
import useUser from './useUser.jsx'
function Content () {
const { user, isLoading } = useUser('/api/user')
if (isLoading) return <Spinner />
return <h1>Welcome back, {user.name}</h1>
}
์ฐธ๊ณ
'frontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋์ ๋ผ์ฐํ ์ผ๋ก ๋ผ์ฐํธ ์ค๊ณ : Route Parameter (0) | 2024.01.04 |
---|---|
ํ์ด์ง ์์ ํ์ด์ง ์์ ํ์ด์ง ... : ์ค์ฒฉ๋ผ์ฐํ (0) | 2023.12.31 |
์ฌ๋๋๋ง ์ ํจ์ ์ฌ์์ฑ ๋ฐฉ์ง: useCallback ํ์ฉํ๊ธฐ (1) | 2023.12.26 |
Header์ Footer์ ํน์ ํ์ด์ง์์ ์ ๋ณด์ด๊ฒ ํ๊ธฐ! (0) | 2023.11.24 |
ํจ์๋ช vs ํจ์๋ช () ์ ์ฐจ์ด๋ ๋ญ๊น? (0) | 2023.11.07 |