โ ๊ณต์๋ฌธ์
SWR
์ ๋จผ์ ์บ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ํ, fetch ์์ฒญ(์ฌ๊ฒ์ฆ)์ ํ๊ณ , ์ต์ข ์ ์ผ๋ก ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ๋ต์ด๋ค.
์ฆ, axios๋ fetch๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๊ฐ ์บ์ฑ๋๊ณ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ๋ถํ์ํ ์์ฒญ์ ํ์ง ์๊ณ ์บ์ฑ๋ ๊ฐ์ ์ฌ์ฉํ๋ค!
๋ผ๊ณ ์ดํดํ๋ค. SWR์ ๋นํธ์ธ ์บ์ฑ๊ณผ ์ค๋ณต์ ๊ฑฐ๋ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ์ค์ฌ์ค๋ค.
const { data, error, isValidating, mutate } = useSWR(key, fetcher, options)
key
: ์์ฒญ์ ์ํ ๊ณ ์ ํ ํค ๋ฌธ์์ด(ํจ์ ,๋ฐฐ์ด, null ๋ ๊ฐ๋ฅ)fetcher
: (์ต์
) ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ํจ์๋ฅผ ๋ฐํํ๋ Promiseoptions
: (์ต์
ฅ) SWR hook์ ์ํ ์ต์
๊ฐ์ฒดdata
: fetcher
๊ฐ ํค๋ฅผ ์ธ์๋ก ๋ฐ์ ์ดํํ data(๋ก๋๋์ง ์์ผ๋ฉด undefined)error
: fetcher
๊ฐ ๋์ง ์๋ฌ(๋๋ undefined)isValidating
: ์์ฒญ์ด๋ ๊ฐฑ์ ์ฌ๋ถmutate
: ์บ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฎคํ
์ดํธํ๊ธฐ ์ํ ํจ์mutate?
mutate(key)๋ฅผ ํธ์ถํ์ฌ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ SWR hook์๊ฒ ๊ฐฑ์ ๋ฉ์์ง๋ฅผ ์ ์ญ์ผ๋ก ๋ธ๋ก๋ ์บ์คํ ํ ์ ์์ต๋๋ค. ๊น์ง๊ฐ ๊ณต์๋ฌธ์์ ๋์ ์๋ ๋ด์ฉ์ด๋ค.
๋ด๊ฐ ์ดํดํ ๋ด์ฉ์ ์๋ฅผ๋ค์ดmutate("/api/user")
๋ผ๋ฉด"/api/user"
๋ฅผ ๊ฐ๊ณ ์๋ ๋์ผํ hook์๊ฒ ๊ฐฑ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค.
์ต์ ๋ฐ์ดํฐ๋ก ๋ก์ปฌ ์ ๋ฐ์ดํธ -> ์ ๋ฐ์ดํธ ๋ด์ฉ์ ๋ฆฌ๋ชจํธ ๋ฐ์ดํฐ ์์ ํ๊ธฐ ์ํด post์์ฒญ -> ๋ฆฌ๋ชจํธ ๋ฐ์ดํฐ์์ ๊ฐ์ ธ์จ ์ ๋ณด๋ก ๊ฐฑ์ ํจ(์ต์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ด)
์ด๋ฐ์์ผ๋ก ๋ก์ปฌ๊ณผ ๋ฆฌ๋ชจํธ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ฉด ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ๋น ๋ฅด๊ฒ ๋๊ปด์ง ๊ฒ์ด๋ค...!
ํ์ง๋ง ๋ง์ POST API๋ค์ ์ ๋ฐ์ดํธ ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๊ฐฑ์ ํ ํ์๊ฐ ์๋ค.
mutate("api", nuwUser, false) // ๋ก์ปฌ๋ฐ์ดํฐ๋ง ์
๋ฐ์ดํธํ๊ณ ๋๋
export const fetcher = (...args) => fetch(...args).then(res => res.json())
import useSWR from "swr"
function Profile(){
const {data, error} = useSWR("API URL", fetcher); ///api url๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋น๋๊ธฐ ํจ์๊ฐ ๋ค์ด์ฌ ์ ์๋ค.ex) fetch, Axios
if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div>
}
์ด ์์ ์์ useSWR
hook์ key
๋ฌธ์์ด๊ณผ fetcher
ํจ์๋ฅผ ๋ฐ๋๋ค.
key
๋ ๋ฐ์ดํฐ์ ๊ณ ์ ํ ์๋ณ์์ด๋ฉฐ(์ผ๋ฐ์ ์ผ๋ก API URL) fetcher
์ ์ธ์๋ก ์ ๋ฌ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ผ๋ก
key
๋ ์ธ์๋ก์จfetcher
์ ์ ๋ฌ๋๋ค. ๋ค์ ์ธ ๊ฐ์ง ํํ์์ ๋์ผํ๋ค.
useSWR('url', () => fetcher('/api/user'))
useSWR('url', url => fetcher(url))
useSWR('url', fetcher)
fetcher
ํจ์์ ์ฌ๋ฌ ์ธ์๋ฅผ ์ ๋ฌํ ์๋ ์๋ค.
:: Bad
/api/user
)๋ ๊ทธ๋๋ก์ด๊ณ token
์ด ๋ณ๊ฒฝ๋๋ฉด SWR์ ์ฌ์ ํ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.useSWR('url', url => fetchWithToken(url, token))
:: Good
๋ฐฐ์ด
์ key
ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ์ฌ fetchWithToken
์ ์ธ์๋ก ๋ณด๋ผ ์ ์๋ค.
const { data: user } = useSWR(['url', token], fetchWithToken)
fetcher
์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด hook์ ์ํด error
๋ก ๋ฐํ๋๋ค.
export const fetcher = (...args) => fetch(...args).then(res => res.json())
const {data, error} = useSWR("URL", fetcher)
ํ์ด์ง์ ๋ค์ ํฌ์ปค์คํ๊ฑฐ๋ ํญ์ ์ ํํ ๋, SWR์ ๋ฐ์ดํฐ๋ฅผ ์๋ ๊ฐฑ์ ํ๋ค.
์ฆ ์ต์ ์ํ๋ก ์ฆ์ ๋๊ธฐํํ ์ ์๋ค.
axios๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๊ฒฝ์ฐ๋ ํต์ ์ด ๋๋๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ์ง ์์๋ค.
SWR์ ์๋ ๋ฐ์ดํฐ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ ์ต์
์ ์ ๊ณตํ๋ค. hook
๊ณผ ๊ด๋ จ๋ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์์ ๋๋ง ๋ค์ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๋ฐ์ํ๋ค.
:: ๊ณ์ํด์ ์ ๋ฐ์ดํธ