[TIL] React Query๐ŸŽ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ ์•Œ์•„๋ณด๊ธฐ (1) (2022.05.18)

๐Ÿงธ zelly logยท2022๋…„ 5์›” 18์ผ
4

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
13/28
post-thumbnail

React Query

๐Ÿ”„๋ผ์ดํ”„์‚ฌ์ดํด

fetching -> fresh -> stale -> inactive -> delete

  • fetching : ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ƒํƒœ.

  • fresh : ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ.
    (์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋‹ค์‹œ fetching.)

  • stale : ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋ฃŒ๋œ ์ƒํƒœ.
    (์ตœ์‹ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ. ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount, update ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์š”์ฒญ)

  • inactive : ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ.
    (๊ธฐ๋ณธ๊ฐ’ 5๋ถ„์ด ์ง€๋‚˜๋ฉด Garbage Collector๊ฐ€ ์บ์‹œ์—์„œ ์ œ๊ฑฐ.)

  • delete : Garbage Collector์— ์˜ํ•ด ์บ์‹œ์—์„œ ์ œ๊ฑฐ๋œ ์ƒํƒœ.

staleTime vs. cacheTime

staleTime : fresh -> stale ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„. (๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋ฃŒ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„.)

cacheTime : inactive ์ƒํƒœ์ผ ๋•Œ ์บ์‹ฑ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๋Š” ์‹œ๊ฐ„.

React Query์—์„œ staleTime๊ณผ cacheTime์˜ ์ฐจ์ด


( ์ด ๋‚ด๋ถ€๋Š” ๋‡Œํ”ผ์…œ์ž…๋‹ˆ๋‹ค.

staleTime ๊ธฐ๋ณธ๊ฐ’์ด 0์ธ ์ด์œ ์— ๋Œ€ํ•œ ์ถ”์ธก๊ณผ ํ† ๋ก , with.@lumpenop

- ๋งŒ์•ฝ staleTime์ด ์—†๊ณ , ๊ณ„์† ์‚ฌ์šฉํ•œ๋‹ค๋ฉด. ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๊ณ  inactive ์ƒํƒœ๋กœ ๊ฐ€์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ staleTime์„ 0์œผ๋กœ ์„ค์ •ํ•ด์„œ ์ƒˆ๋กœ๊ณ ์นจ ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ?
slateTime=0์ผ๊ฒฝ์šฐ fresh->(0์ดˆ)->stale->inactive

- staleTime์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด stale์ƒํƒœ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค. ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

- cacheTime์€ 5๋ถ„์ผ ๊ฒฝ์šฐ, inactive๊ฐ€ ๋  ๋•Œ ๋ถ€ํ„ฐ 5๋ถ„๋™์•ˆ ๋กœ์ปฌ์บ์‹ฑ์„ ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋‚จ์•„์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค.

์–ด๋ ต๋‹ค...

[Discussions / staleTime vs. cacheTime](https://github.com/tannerlinsley/react-query/discussions/1685)

)

๐Ÿ’ŸReact Query ์žฅ์ 

  • ์บ์‹ฑ
  • updateํ•˜๋ฉด ์ž๋™์œผ๋กœ get ์ˆ˜ํ–‰
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๋ž˜๋˜์—ˆ์œผ๋ฉด ๋‹ค์‹œ get invalidateQueries
  • ๋™์ผ ๋ฐ์ดํ„ฐ ์š”์ฒญ์‹œ ํ•œ๋ฒˆ๋งŒ ์š”์ฒญ.

์„ค์น˜

$ yarn install react-query

โœ…useQuery

  1. ๋ฐ์ดํ„ฐ๋ฅผ get ํ•˜๊ธฐ ์œ„ํ•œ API.
  2. return ๊ฐ’ (๊ฐ์ฒด) -> api ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€, api return ๊ฐ’ ํฌํ•จ.
  3. ๋น„๋™๊ธฐ๋กœ ์ž‘๋™. ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ useQuery๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋จ. ์ด๋Ÿฐ๊ฒฝ์šฐ useQueries ์ถ”์ฒœ
  4. enabled ๋ฅผ ํ†ตํ•ด useQuery๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

๋ฐ˜ํ™˜๊ฐ’

  • data : queryFunction์ด ๋ฐ˜ํ™˜ํ•œ Promise resolve ๋ฐ์ดํ„ฐ
  • isLoading : ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ์ค‘์ผ ๋•Œ true
  • isFetching : ์บ์‹œ ๋ฐ์ดํ„ฐ ์œ ๋ฌด์™€ ์ƒ๊ด€์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ์ค‘์ผ ๋•Œ true

์˜ต์…˜

  • cacheTime : unused / inactive ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์œ ์ง€์‹œํ‚ฌ ์‹œ๊ฐ„.
    ๊ธฐ๋ณธ๊ฐ’์€ 5๋ถ„.
    Infinity๋กœ ์„ค์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • staleTime : ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๊ฐ€ fresh์—์„œ stale๋กœ ์ „ํ™˜๋˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด๋‹ค.
    ๊ธฐ๋ณธ๊ฐ’์€ 0.
    Infinity๋กœ ์„ค์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋Š” ์ง์ ‘ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•  ๋•Œ๊นŒ์ง€ fresh ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค.
    ์บ์‹œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ ํ›„์—๋Š” ๋‹ค์‹œ ๊ฐ€์ ธ์˜จ๋‹ค.

  • onSuccess : queryFunction์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™”์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • onError : queryFunction์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • onSettled : queryFunction์ด ์„ฑ๊ณต, ์‹คํŒจํ•œ ๊ฒฝ์šฐ ๋ชจ๋‘ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • keepPreviousData : queryKey๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋™์•ˆ์—๋„ ๋งˆ์ง€๋ง‰data๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค.
    ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์บ์‹œ๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ํ™”๋ฉด์—์„œ viewing ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    isPreviousData๊ฐ’์œผ๋กœ ํ˜„์žฌ์˜ queryKey์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • initialData : ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ํ‘œ์‹œํ•  ์ดˆ๊ธฐ๊ฐ’์ด๋‹ค.placeholder์™€๋Š” ๋‹ฌ๋ฆฌ ์บ์‹ฑ์ด ๋œ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•ด ๋‘” ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

  • refetchOnWindowFocus : ์œˆ๋„์šฐ๊ฐ€ ๋‹ค์‹œ ํฌ์ปค์Šค๋˜์—ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€true์ด๋‹ค.

์ฐธ๊ณ 

๐Ÿ”useInfiniteQuery

๋ฌดํ•œ์Šคํฌ๋กค.
useInfiniteQuery

  • data : [pages, pageParams] ๊ฐ’์ด ๋‹ด๊น€.
  • fetchNextPage : ๋‹ค์Œ ํŽ˜์ด์ง€ ํ˜ธ์ถœ ํ•จ์ˆ˜.
  • hasNextPage : ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š”์ง€ ํŒ๋‹จ. (getNextPageParam ๋ฆฌํ„ด๊ฐ’์œผ๋กœ)
  • isFetchingNextPage : fetchNextPage ๋ฅผ ํ†ตํ•ด fetching์ด ๋˜๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จ.
  • pageParam : page๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. ๊ธฐ๋ณธ๊ฐ’ 1์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
  • getNextPageParam : page๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๊ณต์‹ ๊ฐ€์ด๋“œ
์ฐธ๊ณ 

profile
๐ŸŒฑ Frontend Developer / โœStudying / ๐Ÿ‹ React Typescript / ์„ฑ์žฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž!

0๊ฐœ์˜ ๋Œ“๊ธ€