๐Ÿ“ useSWRInfinite | SWR

Boriยท2022๋…„ 10์›” 12์ผ
2

์–ด์จŒ๋“  ๊ณต๋ถ€

๋ชฉ๋ก ๋ณด๊ธฐ
8/40

SWR์€ pagination๊ณผ infinite loading๊ณผ ๊ฐ™์€ common UI pattern์„ ์ง€์›ํ•˜๋Š” API์ธ useSWRInfinite๋ฅผ ์ œ๊ณต

๐Ÿ—’ useSWRInfinite

  • ํ•˜๋‚˜์˜ hook์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ๊ธฐ๋ณธ ํ˜•ํƒœ
import useSWRInfinite from 'swr/infinite'

// ...
const { data, error, isValidating, mutate, size, setsize } = useSWRInfinite(getKey, fetcher?, options?);
  • useSWR๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ
  • getKey, fetcher, options๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›์Œ
  • useSWR์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’(data, error, isValidating, mutate) + size, setSize(React state์™€ ๊ฐ™์€)๋ฅผ ๋ฐ˜ํ™˜

API

Parameters

  • getKey : ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ธ๋ฑ์Šค(pageIndex)์™€ ์ด ์ „ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ(previousPageData)๋ฅผ ๋ฐ›๊ณ  ํŽ˜์ด์ง€์˜ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    • ๊ฐ ํŽ˜์ด์ง€์˜ SWR ํ‚ค๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
    • fetcher์— ์˜ํ•ด ํ—ˆ์šฉ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜
    • null์ด ๋ฐ˜ํ™˜๋œ๋‹ค๋ฉด, ํŽ˜์ด์ง€์˜ ์š”์ฒญ์ด ์‹œ์ž‘๋˜์ง€ ์•Š์Œ
const getKey = (pageIndex, previousPageData) => {
    // ๋์— ๋„๋‹ฌํ•˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Œ
    if(previousPageData && !previousPageData.length) return null;
    
    // SWRํ‚ค ๋ฐ˜ํ™˜
    return `${API_ENDPOINT}?page=${pageIndex}&limit=10`;
}
  • fetcher : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋กœ SWR์˜ key๋ฅผ ๋ฐ›๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜(useSWR์˜ fetcher์™€ ๋™์ผ)

  • options : SWR hook์„ ์œ„ํ•œ ์˜ต์…˜ ๊ฐ์ฒด, useSWR์ด ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์˜ต์…˜ + ์•„๋ž˜์˜ ๋„ค ๊ฐœ์˜ ์˜ต์…˜

    • initialSize = 1 : ์ดˆ๊ธฐ์— ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€ ์ˆ˜
    • revalidateAll = false : ํ•ญ์ƒ ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ๊ฐฑ์‹  ์‹œ๋„
    • revalidateFirstPage = true : ํ•ญ์ƒ ์ฒซ ํŽ˜์ด์ง€์˜ ๊ฐฑ์‹  ์‹œ๋„
    • persistSize = false : ์ฒซ ํŽ˜์ด์ง€์˜ ํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ, ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ(initialSize๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ initialSize)
      โš ๏ธŽ initialSize ์˜ต์…˜์€ lifecycle์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

Return Values

  • data : ์ฃผ์–ด์ง„ ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ ํŽ˜์ด์ง€์˜ response์˜ ๋ฐฐ์—ด
// data ์˜ˆ์‹œ
[
  [
    { name: 'Alice', ... },
    { name: 'Bob', ... },
    { name: 'Cathy', ... },
    ...
  ],
  [
    { name: 'John', ... },
    { name: 'Paul', ... },
    { name: 'George', ... },
    ...
  ],
  ...
]
  • error : fetcher๊ฐ€ ๋˜์ง„ ์—๋Ÿฌ ๋˜๋Š” undefined(useSWR์˜ error์™€ ๋™์ผ)
  • isValidating : ์š”์ฒญ์ด๋‚˜ ๊ฐฑ์‹ ์˜ ๋กœ๋”ฉ ์—ฌ๋ถ€(useSWR์˜ isValidating์™€ ๋™์ผ)
  • mutate
  • size : ๊ฐ€์ ธ์˜ฌ ํŽ˜์ด์ง€ ๋ฐ ๋ฐ˜ํ™˜ํ•  ํŽ˜์ด์ง€์˜ ์ˆ˜
  • setSize : ๊ฐ€์ ธ์˜ฌ ํŽ˜์ด์ง€์˜ ์ˆ˜๋ฅผ ์„ค์ •

๐Ÿ—’ ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

data์˜ ๊ตฌ์กฐ ํ™•์ธ

  • data์˜ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด console๋กœ ํ™•์ธ
useEffect(() => {
      console.log(data);
}, [data]);
  • ๋ฐฐ์—ด ์•ˆ์— ๋ฐฐ์—ด ํ˜•ํƒœ(2์ฐจ์› ๋ฐฐ์—ด)๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

  • ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„์˜ค๋Š”์ง€ ํ™•์ธ
    โ‡’ Return Values์˜ data ์˜ˆ์‹œ์™€ ๋™์ผํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚จ

pageIndex์™€ setSize์˜ ๊ด€๊ณ„

  • setSize๋ฅผ ํ•  ๋•Œ ๋งˆ๋‹ค getKey์˜ pageIndex์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ console๋กœ ํ™•์ธ

โ‡’ console๋กœ ํ™•์ธํ•ด๋ณด๋‹ˆ ์œ„์˜ ์„ค๋ช…๋“ค์ด ์ดํ•ด๊ฐ€ ๊ฐ€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

  • pageIndex์˜ ์ดˆ๊ธฐ๊ฐ’ = 0
  • limit=10์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ 10๊ฐœ์”ฉ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋ฌถ์ธ๋‹ค.
  • setSize์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋ฌถ์ธ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ size๋งŒํผ ๋‚˜ํƒ€๋‚œ๋‹ค.
    • setSize(1)์ด๋ผ๋ฉด,
      • pageIndex=0์ธ getKey ํ˜ธ์ถœ
        โ‡’ 1 ๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    • setSize(3)์ด๋ผ๋ฉด,
      • pageIndex=0์ธ getKey ํ˜ธ์ถœ
      • pageIndex=1์ธ getKey ํ˜ธ์ถœ
      • pageIndex=2์ธ getKey ํ˜ธ์ถœ
        โ‡’ 3 ๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    โ‡’ setSize์˜ ๊ฐ’ ๋งŒํผ pageIndex๊ฐ€ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ getKey๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹

data๋ฅผ ๋ณด์—ฌ์ค˜์•ผ์ง€.. ์–ด๋–ป๊ฒŒ?

  • Array.flat()์„ ์ด์šฉํ•˜์—ฌ 2์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
    • Array.flat()์€ V8 ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์—์„œ ์ตœ์ ํ™” ๋˜์–ด ์žˆ์ง€ ์•Š์•„ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ํ•˜๋‹ˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  • 1์ฐจ์› ๋ฐฐ์—ด์ด ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Array.prototype.map()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ๋ฌด๋ฆฌ๐Ÿค“

์ฐธ๊ณ 

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

comment-user-thumbnail
2022๋…„ 10์›” 12์ผ

์šฐ์™€ ๋„ˆ๋ฌด ๋‚ด์šฉ์ด ์•Œ์ฐจ๊ณ  ์ข‹๋„ค์š”~!

1๊ฐœ์˜ ๋‹ต๊ธ€