๐ react-query v5 ์ฃผ์ ๋ณ๊ฒฝ์ ์์๋ณด๊ธฐ
์๋ก์ด ํ๋ก์ ํธ์ ์๊ฐ์์ด react-query๋ฅผ ์ค์นํ๊ณ ์์ ๋ฐฉ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ค๋๋ฐ ์ฌ๊ธฐ์ ๊ธฐ ์ค๋ฅ๊ฐ ๋นต๋นต ํฐ์ ธ๋๊ฐ์ต๋๋ค.
์์ด๋ฌ์ง ์ถ์ด package.json์ ์ฐพ์๋ณด๋ ๋ฉ์ด์ ๋ฒ์ ์ด ์
๋ฐ์ดํธ ๋์๊ณ ,
๊ณต์๋ฌธ์๋ฅผ ์ฒ์ฒํ ํ์ด๋ณด๋ ์๊ฐ๋ณด๋ค ์ฌ์ฉ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด ๋ง์ ์ฃผ์ ๋ณ๊ฒฝ์ ๋ค์ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๐ hook ์ต์ ๊ฐ์ฒด ํํ๋ก ๋ณ๊ฒฝ
๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉฐ ํ ์ ์ต์ ์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด ๊ฐ์ฒด ํํ๋ก ๋ฐ๋์ด ๋์ฑ ์ง๊ด์ ์ธ ๋ชจ์ต์ ๋ณด์ ๋๋ค.
- ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์
const { data } = useQuery(['queryKey'], getData);
const mutation = useMutation(setData);
- ๋ณ๊ฒฝ ํ ์ฌ์ฉ ๋ฐฉ์
const { data } = useQuery({ queryKey: ['queryKey'], queryFn: getData });
const mutation = useMutation({ mutationKey: ['mutationKey'], mutationFn: setData })
๐ Suspense ํธ๋ฆฌ๊ฑฐ ์ต์ ๋ณ๊ฒฝ
- ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์
const { data } = useQuery(['queryKey'], getData, { suspense: true });
// or
const queryClient = new QueryClient({
defaultOptions: {
queries: {
suspense: true
},
},
});
๊ธฐ์กด์๋ queryClient์ suspense: true
๊ธฐ๋ณธ ์ต์
์ ๋ถ์ฌํ๋๊ฐ, useQuery ํ
์ ๋ณ๋์ ์ต์
์ ์ฃผ์ด suspense๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์์ง๋ง ์ด์ ๋ Suspense๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ hook์ด ๋ณ๋๋ก ์ถ์๋์์ต๋๋ค.
- ๋ณ๊ฒฝ ํ ์ฌ์ฉ ๋ฐฉ์
const { data } = useSuspenseQuery({ queryKey: ['queryKey'], queryFn: getData });
์ด์ ๋ Suspense๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด query hook์ ์ต์
๋์ useSuspenseQuery
๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ ํฉ๋๋ค.
๐ Suspense์ ํจ๊ป ์ฌ์ฉํ์ง ๋ชปํ๋ enabled ์ต์
- ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์
const { data } = useQuery(['queryKey'], getData, { suspense: true, enabled: false });
๊ธฐ์กด์๋ useQuery์ suspense์ enabled ์ต์ ์ ๋์์ ๋ถ์ฌํด ํน์ ๊ฐ์ ์์กด์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ํธ์ถํ ์ ์์์ต๋๋ค.
- ๋ณ๊ฒฝ ํ ์ฌ์ฉ ๋ฐฉ์
// useQuery๋ enabled ์ฌ์ฉ ๊ฐ๋ฅ
const { data } = useQuery({
queryKey: ['queryKey'],
queryFn: getData,
enabled: false,
});
// useSuspenseQuery๋ enabled ์ฌ์ฉ ๋ถ๊ฐ
const { data } = useSuspenseQuery({ queryKey: ['queryKey'], queryFn: getData });
์ด์ ๋ suspense์ enabled ์ต์ ๋ ๊ฐ์ง๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์ Omit
์ ํธ๋ฆฌํฐ ํ์
์ ๋ค union of string์ผ๋ก ๋ฐ์ keys๋ฅผ ์ ์ธํ ํ์
์ ์์ฑํฉ๋๋ค.
์ฆ, useSuspenseQuery
ํจ์์ enabled
ํ์
์ ์ ์ธํ๋ค๋ ์๋ฏธ์
๋๋ค.
๊ฐ๋ฐ์ง๋ค์ ์๊ฐ์ ์ ํํ๊ฒ ์ ์ ์์ง๋ง ์ ์ถํ๊ธฐ๋ก๋ ์ฑ๊ณตํ ์ํ ๋ถ๋ฆฌ๋ฅผ ์ํด ํ์ํ Suspense์ ์ญํ ์ ๋ ๊ฒฌ๊ณ ํ ํ๋ ค๋ ์๋ฏธ๊ฐ ์์ง ์์๊น ํฉ๋๋ค.
๐ ErrorBoundary ํธ๋ฆฌ๊ฑฐ ์ต์ ๋ณ๊ฒฝ
- ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์
const queryClient = new QueryClient({
defaultOptions: {
queries: {
suspense: true,
useErrorBoundary: true,
},
},
});
๊ธฐ์กด์๋ suspense ์ต์ ์ ๋ถ์ฌํ๊ฑฐ๋, ๋ณ๋๋ก useErrorBoundary ์ต์ ์ ๋ถ์ฌํ๋ฉด ErrorBoundary๋ก ์๋ฌ๊ฐ ์ ํ๋์์ต๋๋ค.
- ๋ณ๊ฒฝ ํ ์ฌ์ฉ ๋ฐฉ์
const queryClient = new QueryClient({
defaultOptions: {
queries: {
throwOnError: true,
}
mutations: {
throwOnError: true,
},
},
});
๋ณ๊ฒฝ ํ์๋ queries์ mutations ๊ฐ๊ฐ ์์ฑ์ ๋ณ๋๋ก throwOnError ์ต์ ์ ๋ถ์ฌํด์ผ ์๋ฌ ์ ํ๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.
๊ทธ๋ผ ๋ฉ์ด์ ๋ฒ์ ์ ๋ฐ์ดํธ ๋์์ ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค.
๋๊ธ