Vueํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ vue-query(useQuery)์ ๋ํด ๊ณต๋ถํ๊ธฐ ์์ํ๋ค.
ํ๋ํ๋ ๋ฏ์ด๋ณด๋๊ฒ๋ณด๋จ ๋ด๊ฐ ํ์์ ๊ถ๊ธํ๋ ๊ฒ๋ค์ ๋ต์ ํ๋๊ฒ ๋ง๋ ๊ฒ ๊ฐ์์.. ๊ทธ๋ ๊ฒ ํด๋ณผ๋ ค ํ๋ค.
Vue-Query๋ React์์ ์ฌ์ฉํ๋ React-Query๋ฅผ Vue์์ ์ ์ฉํ ์ ์๋๋ก ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์๋ฒ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, Vue์์ ๋น๋๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์บ์ฑํ๊ณ , ๋๊ธฐํ ํ๋๊ฑธ ๋ง๋ค์ด์ค๋ค. back๋จ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ํต์ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ ์๊ฐํ๋ฉด ๋๋ค....
useQuery๋? - SELECT์์ ์ฌ์ฉ, ๋ฐ์ดํฐ ์กฐํ(GET)
๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ถ๋ฌ์ค๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ปดํฌ๋ํธ์์ ํ์ํ ๋ ์ฌ์ฉํ๋ Vue Query์ ํ (hook).
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ์์ฒญ์ ์บก์ํ, ๋ก๋ฉ/์ฑ๊ณต/์คํจ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ ๋
- ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ฑฐ๋, ๋ค์ ๊ฐ์ ธ์ฌ ์ ์์ด์ผ ํ ๋ : ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ฒ์ด๋๊ณ ๋์์ฌ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์์ฒญํ๊ณ ์ถ์ง ์๋ค๋ฉด, useQuery๊ฐ ์๋์ผ๋ก ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋ค. ํน์ refetch๋ก ์๋์ผ๋ก ์์ฒญํด๋ ๋๊ณ ..
- ์๋ ์๋ก๊ณ ์นจ์ด ํ์ํ ๊ฒฝ์ฐ : ์ค์๊ฐ ๋ฐ์ดํฐ๋ ์๋์ง๋ง ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐฑ์ ๋์ผ ํ ๋(ex. ์กฐํ ๋ฒํผ, ์๋ฆผ ๋ฑ), refetchInterval์ ์ฌ์ฉํ ์ ์๋ค.
useQuery(['notifications'], fetchNotifications, {
refetchInterval: 10000, // 10์ด๋ง๋ค ์๋ก๊ณ ์นจ
})
- ์์ฒญ ์คํจ ์ ์๋ ์ฌ์๋ํ ๋
...์ ๊ฐ์ ์ํฉ์ผ ๋ ์ฌ์ฉํ๋ค.
๋ฐ๋๋ก useQuery๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ ์ํฉ์ด ์๋ค. ๋ฐ๋ก POST, PUT, DELETE์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋, ๋ฐ์ดํฐ๊ฐ ์ปดํฌ๋ํธ ๋ด๋ถ ์ํ์ผ ๋ฟ ์๋ฒ ํต์ ๊ณผ ๊ด๋ จ ์์ ๋, ๊ฐ ๋ณ๊ฒฝ์ด ๋น๋ฒํ ๋...
๊ทธ๋ผ ๋ฐ์ดํฐ ์์ ํ ๋ ๋ญ ์จ์ผ ํ๋?
useMutation์ด๋? - INSERT, UPDATE, DELETE์์ ์ฌ์ฉ, ๋ฐ์ดํฐ ์์ (POST etc.)
useMutation์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ Vue Query์ ํ (hook)์ผ๋ก, ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฑฐ๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋น๋๊ธฐ ์์ (POST, PUT, DELETE = insert, update, delete๋ฌธ)๋ฅผ ์ํํ ๋ ์ฌ์ฉํ๋ค. useQuery์ ๋ค๋ฅด๊ฒ ์บ์ฑ์ด ๋์ง ์๋๋ค.
์ฑ๊ณต, ์คํจ, ์งํ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ์์ ํ ๊ด๋ จ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํจํ(invalidateQueries)๋ฅผ ํตํด ํน์ ๋ก์ง์ ์ฌ์ฉํ ์ ์๋ค.
์ฃผ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- mutationFn : ์ค์ ๋น๋๊ธฐ ์์ (API์์ฒญ)์ ์ฒ๋ฆฌํ๋ ํจ์
- onSuccess : ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ฌ์ ๋ ์คํํ ์ฝ๋ฐฑ ํจ์(ex. ๋ฐ์ดํฐ ๊ฐฑ์ invalidateQueries, UI์ ๋ฐ์ดํธ) (์ ์ผ ๋ง์ด ์ฐ์!!!)
- onError : ์์ ์ค ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์คํํ ์ฝ๋ฐฑ ํจ์
- onSettled : ์์ ์ฑ๊ณต, ์คํจ ์ฌ๋ถ์ ์๊ด์ ์ฑ ์คํํ ์ฝ๋ฐฑ ํจ์
์ ์ผ ์ค์ํ๊ฑฐ 2๊ฐ ์์์ผ๋ ์ด ๋ฐ์ ํ์์ ๊ถ๊ธํ๋๊ฑฐ ํ๋์ฉ ์ถ๊ฐํ๋ค..
'์บ์ฑ(Cache)'์ด๋
์บ์ฑ : ํ๋ฒ ์ฐ์ฐํ ๊ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ถ๋ ฅํ ๋, ์์ฃผ ์ฐ๋ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํ๊ณ ํ์ํ ์๊ฐ๋ง๋ค ๋น ๋ฅด๊ฒ ๋ฐ์์จ๋ค๋ ์๋ฏธ
๋ผ๊ณ ํ๋ฉด ์์งํ ๋๋ฌด ์ด๋ ต๊ณ ....
์์ฃผ ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ์๋ก ๊ฐ์ ธ์ค์ง ์๊ณ ๋ฏธ๋ฆฌ ์ ์ฅํ๋ค๊ฐ ๋ค์ ์ฐ๋ ๊ฒ
์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋๊ฒ ๋ค.
useQuery๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๊ฐ, ๋ด๋ถ์ ๋ณต์ฌ๋ณธ์ ์ ์ฅ(=์บ์)ํด๋๋๋ค. ๊ทธ๋์ ๋ค์์ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค๋ฉด ์๋ฒ์ ๋ค์ ๋ฌผ์ด๋ณด๋๊ฒ ์๋ ์ ์ฅํ๋ ๋ณต์ฌ๋ณธ์ ๋ณด์ฌ์ฃผ๋๊ฒ!
์๋ฒ์ ๋ถํ์ํ ์์ฒญ์ ์ค์ฌ์ค๋ค~๐ซ๐ซ
const {}์ ์๋ฏธ
Vue3.js์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค
const {data : test, refetch} = useTest()
์ฌ๊ธฐ์ {} ๊ตฌ์กฐ๋ถํด ํ ๋น(destructiong assignment)๋ผ๊ณ ํ๋ค.
์์์ useTest()๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ, {}๋ ์ด ๋ฐํ๋ ๊ฐ์ฒด์ ์์ฑ์ ๊ณจ๋ผ๋ธ๋ค.
์ฌ๊ธฐ์ ๊ฐ์ ธ์จ ๊ฐ์ฒด์ data๋ผ๋ ์์ฑ์ ์ํ๋ ๊ฐ์ด ์์ผ๋ฏ๋ก, ์ด ๊ฐ์ ๋ณ์๋ช ์ test๋ก ์ง๋๋ค.
refetch๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถ๋ฅด๋ ์์ฑ์ผ๋ก, ๊ฐ์ฒด์ ์์ฑ์ ๊ทธ๋๋ก ๋ณ์๋ก ๋ง๋ ๊ฒ์ด๋ค.
queryKey๋
Vue Query์์ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๊ณ ์๋ณํ๊ธฐ ์ํ ๊ณ ์ ํค์ด๋ค. "์๋ณ์"
- Vue Query๋ ๋์ผํ queryKey๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์บ์ฑํ๋ค. ๋ฐ๋ผ์ ๋์ผํ queryKey๋ก ์์ฒญํ๋ฉด ๋คํธ์ํฌ ์์ฒญ์ ํ์ง ์๊ณ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
- ํน์ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฌดํจํ(invaludate)ํ๊ฑฐ๋ ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
const {data, isLoading} = useQuery({
queryKey : ['user'], // ๊ณ ์ ํ ํค(๋ฐฐ์ด ํ์)
queryFn : fetchUser, // ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์
})
ํน์ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๋ ค๋ฉด(=๋ฐ์ดํฐ์ key๊ฐ์ด ํ์ํ๋ค๋ฉด) ํค์ ์ถ๊ฐ๋ ์ ๋ณด๋ฅผ ํฌํจํด์ผ ํ๋ค.
const {data} = useQuery({
queryKey : ['user', userId],
queryFn : () => fetchUser(userId),
})
์ ๋ ๊ฒ ์์ฑํ๋ฉด, userId์ ๊ฐ์ด ๋ฌ๋ผ์ง ๋ ๋ง๋ค user๊ฐ ๊ฐฑ์ ๋์ queryFn์ ์คํํ๋ค. ์๋ฅผ ๋ค์ด,
// userId = 1์ธ ๊ฒฝ์ฐ
queryKey: ['user', 1]
// userId = 2์ธ ๊ฒฝ์ฐ
queryKey: ['user', 2]
ํค๊ฐ ๋ฌ๋ผ์ก์ผ๋ฏ๋ก vue-query๋ ์ด๊ฒ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ์ธ์ํ์ฌ queryFn์ ์๋ก ์คํํ๋ค.
- ์ฒ์์ userId = 1์ผ ๋, ['user', 1] ์บ์๊ฐ ์์ฑ๋๊ณ fetchUser(1) ์คํ
- userId๊ฐ 2๋ก ๋ณ๊ฒฝ → ['user', 2]๋ผ๋ ์๋ก์ด ์บ์ ํค → fetchUser(2) ์คํ
- ๋ง์ฝ ๋ค์ userId = 1๋ก ๋์๊ฐ๋ฉด? → ์ด๋ฏธ ['user', 1] ์บ์์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก API๋ฅผ ์ฌํธ์ถํ์ง ์๊ณ ์บ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ฐ
queryFn์ด๋
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ ํจ์๋ก, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ์ ์ํ๋ค.
๋ฐ๋์ ๋น๋๊ธฐ ํจ์์ฌ์ผ ํ๋ค!
queryClient๋
Vue query์ ์ค์ฌ ๊ฐ์ฒด๋ก, ์ฟผ๋ฆฌ ๋ฐ ์บ์ฑ์ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ค.
๋ชจ๋ ์ฟผ๋ฆฌ์ ์บ์๋ฅผ ์ ์ญ์์ ๊ด๋ฆฌํ๋ฉฐ, ์ฟผ๋ฆฌ ๋ฌดํจํ, ๋ฐ์ดํฐ ๊ฐ์ ๊ฒฝ์ , ์บ์ ์ญ์ ๋ฑ์ ์์ ๋ฐ ๋ฉ์๋๋ฅผ ์ํํ ์ ์๋ค.
๋ญ๋ผ๋์ง ๋ชจ๋ฅด๊ฒ ์ง?
์ธ์ ๋ค์ ๊ฐ์ ธ์ฌ์ง, ๋ฌดํจํํ ์ง ๊ฒฐ์ ํ๋ ์ค์๊ด๋ฆฌ์, ์ฆ ์ฌ๋ นํ ๊ฐ์ ์กด์ฌ์ด๋ค.
์ฐ๋ฆฌ๊ฐ fetchํ๋ ๋ฐ์ดํฐ๋ ๋ค queryClient๋ผ๋ ์ฐฝ๊ณ ์ ๊ฐ๋๊ณ , ๋์ค์ ์ฐ๊ฑฐ๋ ๋ฒ๋ฆฌ๋ ๋ฑ์ ์ด ์น๊ตฌ๊ฐ ๋ด๋นํ๋ค.
์ฃผ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- invalidateQueriesโจโจ: "์ด๊ฑฐ ์ค๋๋ฌ์ด. ๋ค์ ๊ฐ์ ธ์" = ๊ฐ์ฅ ๋ง์ด ์ฐ๊ณ ์ ์ผ ์ค์ํ ๋ฉ์๋. ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ผ๊ณ vueQuery์๊ฒ ์๋ฆฌ๋ ๊ฒ. ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ insert/update/deleteํ ์บ์์ ๋จ์ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆด ๋ ์ฌ์ฉํ๋ค.
queryClient.invalidateQueries({
queryKey: ['ninja', ninja]
})
Vue Query์ ํต์ฌ ๋ฉ์๋ ์ค ํ๋์ด๋ค(์ฒด๊ฐ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค).
์ด๋ ค์ด ๋ง๋ก insert, update, delete๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ invalidateQueries๋ฅผ ํธ์ถํ์ฌ Vue Query์๊ฒ ์บ์์ ๋จ์์๋ ์ค๋๋ ๋ฐ์ดํฐ๊ฐ ๋์ด์ ์ ํจํ์ง ์์ผ๋ ๋ค์ ๋ก๋ฉํ๋ผ๊ณ (= refetchํ๋ผ๊ณ ) ์๋ ค์ค๋ค.
โก๏ธ ['ninja', ninja] ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ Vue Query๊ฐ “์ด๊ฑฐ์ด๊ฑฐ ์์ฃผ ์ค๋๋ฌ๊ตฌ๋ง” ํ๊ณ ์๋์ผ๋ก ๋ค์ ์๋ฒ์์ ๊ฐ์ ธ์จ๋ค.
- refetchQueries : "์ง๊ธ ๋น์ฅ ๋ค์ ๊ฐ์ ธ์๋ผ" = ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ๋ก ๋ค์ ๊ฐ์ ธ์จ๋ค. ์ค์๊ฐ ๋ฐ์์ด ์ค์ํ ๋, invalidateQueries๋ก๋ ํ์ด๋ฐ์ด ๋ฆ์๊น๋ด ์ฆ์ ์คํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
queryClient.refetchQueries({
queryKey: ['ninja', ninja]
})
์บ์๋ ์ ํจํ์ง๋ง ๊ทธ๋๋ ๋ค์ fetchํ๊ณ ์ถ์ ๋. ์บ์๊ณ ๋ญ๊ณ ํ์ ์๋ค. ๋น์ฅ ์๋ฒ์์ ์ฑ์ฑํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ค์ค๋๋๋ผ
๊ฐ์ ๋๋์ด๋ค. ์๋ฒ์ fetchํจ์๊ฐ ๋ค์ ์คํ๋๋ค.
invalidate๊ฐ "๋ค์์ ๋ค์ ๊ฐ์ ธ์~"๋ฉด refetch๋ "์ผ ์ง๊ธ ๋น์ฅ ๊ฐ์ ธ์. ์๊ฐ์ ธ์?"์ ๋๋
- setQueryData : "๋ฐ์ดํฐ ๋ด๊ฐ ์ง์ ๊ณ ์น ๊ฑฐ๋๊น ๋น์ผ" = ์๋ฒ์์ ๊ฐ์ ๋ค์ ๋ฐ๋๊ฒ ์๋ ์ํ๋ ๊ฐ์ผ๋ก ์ง์ ์บ์๋ฅผ ์์ ํ๋ค.์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํ๋ค.
'Frontend๐จ > Vue3.js๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| toValue()์ toRaw() (feat. MaybeRefOrGetter<T>, Proxy) (0) | 2025.10.02 |
|---|---|
| [Vue] watch์ ๋ํด ์์๋ณด์ (0) | 2024.12.29 |