Frontend ๊ฐœ๋ฐœ์ž - hyo.loui

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ - Movies app : React-Query (useQuery) ์ ์šฉ ๋ณธ๋ฌธ

React-Navtive

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ - 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

 

Installation | TanStack Query Docs

You can install React Query via NPM, or a good ol' `` via unpkg.com.

tanstack.com

 

2-2. Setup App.js 

  1.  queryClient ๋ณ€์ˆ˜ ์„ ์–ธ์œผ๋กœ QueryClient() ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. (import ํ•„์š”)
  2. ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ตœ์ƒ์œ„์˜ ์š”์†Œ์— <QueryClientProvider/> ๋ผ๋Š” ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ค€๋‹ค! (import ํ•„์š”)
  3. 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 ์—ฐ์‚ฐ์ž๋ฅผ ๋„ฃ์–ด ์ผ๊ด„์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋‹ค

 

 


 

 ์ตœ์ข… ์ •๋ฆฌ 

  1. Server State, ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ์—„์ฒญ๋‚œ ํผํฌ๋จผ์Šค ํ–ฅ์ƒ์„ ์œ„ํ•ด useQuery๋ฅผ ์‚ฌ์šฉ!
  2. redux, RTK๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์ด ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์ธ Root ์ปดํฌ๋„ŒํŠธ ์œ„์—
    <QueryClientProvider/> ํƒœ๊ทธ๋ฅผ ๊ฐ์‹ธ๊ณ  client์— QueryClient() ๋ฅผ ๋„ฃ๋Š”๋‹ค.
  3. ๋ฆฌ์—‘ํŠธ ์ฟผ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ '์ฟผ๋ฆฌ ํ‚ค' ์™€ fetch๋ฅผ ์ง„ํ–‰ํ•˜๋Š” 'ํ•จ์ˆ˜' ์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›๊ณ ,
    ๋‚˜๋จธ์ง€ ์˜ต์…˜๋“ค๋„ ์กด์žฌํ•œ๋‹ค.
  4. useQuery์— ๋„ฃ๋Š” ํ…์ŠคํŠธ ํ˜•ํƒœ์˜ key๋Š” html์—์„œ ์‚ฌ์šฉํ•˜๋Š” class ๋ผ๊ณ  ์ดํ•ดํ•˜์ž ๋ฐฐ์—ดํ˜•ํƒœ๋กœ ๋„ฃ์„์ˆ˜ ์žˆ๊ณ ,
    [๊ณ ์œ  key, ํ†ตํ•ฉ key] ๋ฅผ ํ• ๋‹นํ•ด์„œ ๋ณด๋‹ค freeํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. useQuery๋ฅผ ์‚ฌ์šฉํ•œ data์˜ response ๊ฐ’์€ data.results ์— ๋“ค์–ด์žˆ๋‹ค.
  6. isLoading์€ ์ผ๊ด„์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.