์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ๋ด์ผ๋ฐฐ์์บ ํ
- ๋ณ์
- ์๋ฌ
- type
- ์๊ณ ๋ฆฌ์ฆ
- PROJECT
- react
- ๋ฆฌ์กํธ
- trainning
- Firebase
- ํ๋ก ํธ์๋
- JavaScript
- ์ฝ๋ฉ
- rn
- ๋ด์ผ๋ฐฐ์
- ํจ์
- API
- JS
- ๋ถํธ์บ ํ
- wil
- native
- ํ์
- ๊ฐ๋ฐ์
- NEXT
- K-Digital
- ์จ๋ผ์ธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํ์ค
- Redux
- ํ๋ก์ ํธ
- Today
- Total
Frontend ๊ฐ๋ฐ์ - hyo.loui
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ - Movies app : React-Query (useQuery) ์ ์ฉ ๋ณธ๋ฌธ
๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ - Movies app : React-Query (useQuery) ์ ์ฉ
hyo.loui 2023. 1. 9. 03:11๐ฏ๋ชฉ์ :
React-Query (useQuery) ๋ฆฌํํ ๋ง ๊ณผ์ - ์๋ฒ ์คํ ์ดํธ ๊ด๋ฆฌ
๐คข ์ค๋ฅ ํด๊ฒฐ :
1. ๋ฆฌ์กํธ ์ฟผ๋ฆฌ (React Query) ๋?
Server State, ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฉฐ,
userQuery hook ์์์ API ์์ฒญ์ ๋ด๋นํ๊ณ , API ์์ฒญ ๊ฒฐ๊ณผ ๋ฐ ๋ค์ํ ์ํ๋ค์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค
(redux thunk ์ฌ์ฉ ํ์ X)
ํ๋ฒ API ์์ฒญ ์ queryKey ๊ฐ API ์์ฒญ๊ฒฐ๊ณผ๋ฅผ cache ์ ์ ์ฅํ๊ณ ,
caching๋ API ์์ฒญ์ ๋ค์ ์๋ฒ์ ํ์ง ์๊ณ cache memory์์ ๋ ๋น ๋ฅด๊ฒ ๋ถ๋ฌ ์จ๋ค.
๊ทธ๋์ ๋ถํ์ํ ์๋ฒ ์์ฒญ์ ์์์ ๋ง์์ฃผ๊ฒ ๋๋ค!
2-1. ํ๋ก์ ํธ ์ธํ
์ฐ์ ๋ช ๋ น์ด๋ก install์ ์งํํฉ๋๋ค.
npm i react-query
// or
yarn add react-query
https://react-query-v3.tanstack.com/installation
2-2. Setup App.js
- queryClient ๋ณ์ ์ ์ธ์ผ๋ก QueryClient() ํจ์๋ฅผ ๊ฐ์ ธ์จ๋ค. (import ํ์)
- ์ปดํฌ๋ํธ ์์์ ์ต์์์ ์์์ <QueryClientProvider/> ๋ผ๋ ํ๊ทธ๋ก ๊ฐ์ธ์ค๋ค! (import ํ์)
- QueryClientProvider ์ client ์์ฑ์๋ 1 ์์ ๋ง๋ ๋ณ์ queryClient ๋ฅผ ๋ฃ์ด์ค๋ค.
3. useQuery์ฌ์ฉํ๊ธฐ
get, fetch ์์ฒญ์ ํ ๋, useQuery๋ผ๋ ํ ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
useQuery ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ํ์ผ์ import๊ฐ ๋์ด์ผ ํ๊ณ ,
const fetcher = () =>
fetch('https://api.github.com/repos/tannerlinsley/react-query').then(res =>
res.json());
const { isLoading, error, data } = useQuery('repoData', fetcher)
์ ์์์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค,
๋ฆฌ์ํธ ์ฟผ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก '์ฟผ๋ฆฌ ํค' ์ fetch๋ฅผ ์งํํ๋ 'ํจ์'
์ด๋ ๊ฒ ๋๊ฐ์ง ์ธ์๋ง ์์ผ๋ฉด ๋๊ณ , ๋๋จธ์ง ์ต์ ๋ค๋ ์กด์ฌํ๋ค
data : fetch ํจ์๊ฐ ๋ฐ์์จ response ๊ฐ!
isLoading : ์๋ฒ ์คํ ์ดํธ์ ์ํ!
error : ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ฐ์ฒด!
4. Refactoring
๊ธฐ์กด์๋ setState๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ค์
ํด๋ผ์ด์ธํธ state๋ก ๋ฐ์์ค๊ณ , isLoading๋ ์ํ๋ณ๊ฒฝ์ ์ง์ ๊ด๋ฆฌํ๋ค..
useQuery๋ฅผ ์ฌ์ฉํ๋ฉด,
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ฐ์ดํฐ์ ๋ก๋ฉ์ํ๋ฅผ ๋ชจ๋
useState๊ฐ ์๋useQuery๊ฐ ๊ด๋ฆฌํ๊ฒ ๋ง๋ค์ด ์ฃผ์๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ useQuery์ ๋ฐ์ดํฐ์ isLoading ์ํ๊ฐ ๊ฐ์ ์ ์์ผ๋
๋ณ์นญ์ ๋ฃ์ด์ค์ผ ํ๋ค
๋ํ ํ๋์ ํค๋ก 3๊ฐ์ useQuery๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด Movies๋ผ๋ ๋์ผํ key๊ฐ๋ ๋ง๋ค์ด์คฌ๋ค
key๋ ๋ฐฐ์ด์ ํํ๋ก
html / css ์์ ์ฌ์ฉํ๋ class๋ผ๊ณ ์ดํดํ๋ฉด ํธํ๋ค!
๊ทธ๋ ๊ฒ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๋ key์ธ Movies ๋ฅผ ์ด์ฉํด
์ ์ญ์์ ์ฌ์ฉํ๋ queryClient์ ์ ๊ทผํ์ฌ refetchQueries๋ฅผ ์งํํ๋ฉด Movies ํค๋ฅผ ๊ฐ์ง๊ณ ์๋
useQuery๋ค์ refetch๊ฐ ์งํ๋๋ค
5. ๊ธฐ์กด์ state ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ ๊ฐ์?
์ฌ๊ธฐ์๋ ๊ทธ๋ ๊ฒ ๋ณต์กํ์ง ์๋ค!
๊ธฐ์กด : {state.map()}
๋ฆฌํํ ๋ง : {data.results.map()}
nowPlayingData๋ผ๊ณ ํ ๋นํ useQuery์ ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ ์์
.results ๋ผ๋ ๊ณณ์์ ๋ค ๊ฐ์ง๊ณ ์๋ค!
6. isLoading ์ผ๊ด ์ฒ๋ฆฌ
์์์ ๋ง๋ค์ด์ค isLoading์ ๋ณ์นญ์ ์ด์ฉํด
์ ์ ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ์ด ๋ค ์๋ฃ๋๋ฉด ๋ณด์ฌ์ค ์ ์๋๋ก
isLoading ๋ณ์์ or ์ฐ์ฐ์๋ฅผ ๋ฃ์ด ์ผ๊ด์ฒ๋ฆฌ๋ฅผ ํ๋ค
์ต์ข ์ ๋ฆฌ
- Server State, ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ์์ฒญ๋ ํผํฌ๋จผ์ค ํฅ์์ ์ํด useQuery๋ฅผ ์ฌ์ฉ!
- redux, RTK๋ฅผ ์ฌ์ฉํ ๋์ ๊ฐ์ด ์ ์ญ์ํ๊ด๋ฆฌ๋ฅผ ์ํด ์ต์๋จ ์ปดํฌ๋ํธ์ธ Root ์ปดํฌ๋ํธ ์์
<QueryClientProvider/> ํ๊ทธ๋ฅผ ๊ฐ์ธ๊ณ client์ QueryClient() ๋ฅผ ๋ฃ๋๋ค. - ๋ฆฌ์ํธ ์ฟผ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก '์ฟผ๋ฆฌ ํค' ์ fetch๋ฅผ ์งํํ๋ 'ํจ์' ์ด๋ ๊ฒ ๋๊ฐ์ง ์ธ์๋ฅผ ๋ฐ๊ณ ,
๋๋จธ์ง ์ต์ ๋ค๋ ์กด์ฌํ๋ค. - useQuery์ ๋ฃ๋ ํ
์คํธ ํํ์ key๋ html์์ ์ฌ์ฉํ๋ class ๋ผ๊ณ ์ดํดํ์ ๋ฐฐ์ดํํ๋ก ๋ฃ์์ ์๊ณ ,
[๊ณ ์ key, ํตํฉ key] ๋ฅผ ํ ๋นํด์ ๋ณด๋ค freeํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. - useQuery๋ฅผ ์ฌ์ฉํ data์ response ๊ฐ์ data.results ์ ๋ค์ด์๋ค.
- isLoading์ ์ผ๊ด์ฒ๋ฆฌํ์ฌ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.