React Query
#์์ํ๋ฉฐ
์น๊ตฌ๋ค๊ณผ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ React Query ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค. ๊ฐ๋จํ ์ฐพ์๋ณด๋ api๋ฑ์ ๋น๋๊ธฐ ํต์ ์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ผ๋ ๊ฒ์ผ๋ก ํ์
ํ์ต๋๋ค. ๊ธฐ์กด์๋ react๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ์ฌ๋ฌ ๋น๋๊ธฐ ํต์ ์ ํด๋ณด์์ง๋ง ๋จ์ axios๋ฅผ ํตํด ํต์ ํ๋ ๊ฒ๋ง ๊ฒฝํํด๋ณด์์ต๋๋ค. React Query๋ฅผ ์ดํด๋ณด๋ฉฐ ์ ์จ์ผํ๋์ง? axios๋ง ์ฌ์ฉํ์ ๋์ ๋ค๋ฅธ ์ ์ ๋ฌด์์ธ์ง ์์๋ด
์๋ค.
22.02.24 ์ถ๊ฐ
์ฐ์ํ ํ ํฌ ์ธ๋ฏธ๋์์ React Query๋ฅผ ์๊ฐํ ๋ด์ฉ์ด ์์ด ์ถ๊ฐ ์ ๋ฆฌํฉ๋๋ค.
React Query
React Query๋ ์น ์๋น์ค ์์ฒญ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ๋์์ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค. ์ค์ ์์ฒญ์ ์ฌ์ ํ fetch ๋๋ axios๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ณ , React Query๋ ๋ผ์ดํ ์ฌ์ดํด์ ์ ์ ํ ์๊ฐ์ ์์ฒญํ๋ ์ฝ๋๋ฅผ ํธ์ถํฉ๋๋ค. ๋ํ ์์ฒญ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋๊ณ , ํ์ํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ์ธ์๋ React Query๋ ์บ์ฑ ๋ฐ ์ฌ์์ฒญ ๊ฐ์ ์๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ฝ๋๋ฅผ ์ ๋ฆฌํํ๋ค๋ ๊ฒ์
๋๋ค.
์ฌ์ฉ๋ฒ
npm i react-query
# or
yarn add react-query๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํ๋ ์ปดํฌ๋ํธ ์์์ QueryClientProvider ์ปดํฌ๋ํธ๊ฐ ํ์ํฉ๋๋ค.
import { QueryClient, QueryClientProvider } from 'react-query';
const queryClient = new QueryClient();
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>React Query ์ฌ์ฉํ๊ธฐ
useQuery ํ
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
type BlaBla = {
text: string;
}
const { status, error, data } = useQuery<BlaBla, Error>(
['blabla', { id: 1 }],
getBlaBla
);useQuery๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๊ณ ์ ํ ํค ๊ฐ์ ๊ฐ๊ณ , ๋๋ฒ์งธ ์ธ์๋ก ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ํจ์๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ค๋ฆญ ํ์
ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ดํฐ์ ์๋ฌ์ ํ์
์ ๋ฐ์ต๋๋ค.
status: ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ("idle","error","loading","success")error: ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์๋ฌ ๊ฐ์ฒด๋ฅผ ํฌํจํฉ๋๋ค.data: ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค.
useQuery Option
- enabled: ์๋์ผ๋ก query๋ฅผ ์คํ์ํฌ์ง ๋ง์ง ์ฌ๋ถ (์ปดํฌ๋ํธ ๋ง์ดํธ ์ ์๋ ์คํ ๋ฐฉ์ง)
- select: ์ฑ๊ณต ์ ๊ฐ์ ธ์จ data๋ฅผ ๊ฐ๊ณต
์์ฐจ์ ์ผ๋ก ์คํํ๊ณ ์ถ์ API๋ฅผ ํธ์ถํด์ผ ํ ๋
- enabled ์ต์
์
false๋ก ๋๊ณ refetch ํจ์๋ฅผ ์ ์ํ๋ค. - enabled ์ต์ ์ ์ด ์ ์ ์คํํ๋ API์ ์๋ต ๊ฐ ๋๋ ํ๋๋ฅผ ๋ฃ๋๋ค.
useQuery ์๋ต ๊ฐ์ ์ฌ์ฉํด action์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ
useQueryonSuccess์ ์ ์ํ๋ค.
Mutation
Optimistic update ?
useMutation์onMutate์ ๊ฒฝ์ฐ Optimistic update ์ ์ฉ ํ ๋ ์ ์ฉํ๋ค.
Optimistic update๋ API ํธ์ถ์ ํด์ผํ๋ ๊ฒฝ์ฐ์, ํธ์ถ ์ API๊ฐ ๋์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ๊ณ ๋ฏธ๋ฆฌ UI๋ฅผ ์ ๋ฐ์ดํธ ํด๋๋ ๊ฒ์ด๋ค. (API ํธ์ถ ์คํจ ์ ๋ค์ ๋กค๋ฐฑ)
#React Query์ ์ฅ์
- async/await ๊ตฌ๋ฌธ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด
useEffect๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค. ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ํ์ ์ ์ฅํ๊ณ ์์ฒญํ๋ ๋์ค์ ์ปดํฌ๋ํธ์ ๋ง์ดํธ๊ฐ ํด์ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฐ ๊ฒ๋ค์ ํตํดReact Query๋ ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ๋จ์ํํ ์ ์๊ฒ ํด์ค๋๋ค. React Query๋ ๋ค์ ํฌ์ปค์ค๊ฐ ํ์ฑํ ๋์์ ๋ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ต๋๋ค. (ํ์์ ๋ฐ๋ผ ๋นํ์ฑํ๋ ๊ฐ๋ฅํฉ๋๋ค.)- ์์ฒญ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ต๋ 3๋ฒ๊น์ง ์๋์ผ๋ก ์ฌ์์ฒญํฉ๋๋ค.
Refer
https://www.carlrippon.com/getting-started-with-react-query-and-typescript/