๐Ÿ’ป[React Native] SWR

ํ˜ฑยท2023๋…„ 1์›” 23์ผ

๐Ÿ“Œ SWR์ด๋ž€?

๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์บ์‹ฑ๊ณผ ์žฌ๊ฒ€์ฆ์„ ํ•˜๋Š” ๊ฒƒ
๋ฐ์ดํ„ฐ ๋กœ๋“œ์ดํ›„, cash๋ฅผ ๊ฐ€์ ธ ๊ตฌ๋™์ดํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ cash๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ์ˆ 
const fetcher = (...args) => fetch(...args).then(res => res.json()) :๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ์‹๊ณผ ์ƒ๊ด€์—†์ด ๋ชจ๋‘ fetcher๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

const fetcher = function (url, params) {
  fetch(params).then(res => res.data) //window fetch
  axios.get(url, (config = {params})).then(res => res.data); 
  //axios์‚ฌ์šฉ, response์˜ data return
};

โœ๏ธ SWR ์‚ฌ์šฉ

import useSWR from 'swr'

function Profile () {
  const { data, error, isLoading } = useSWR('/api/user/123', fetcher)

  if (error) return <div>failed to load</div> //error๊ฐ€ ๋‚˜๋ฉด error ์ถœ๋ ฅ
  if (isLoading) return <div>loading...</div> //data๊ฐ€ ์—†๋‹ค๋ฉด, 

  // ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง
  return <div>hello {data.name}!</div>
}

๐Ÿ”— BoxOffice.js

const url =
    'https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json';
  const {data, error} = useFetch(
    url,
    (params = {
      key: 'bb4881b8d562d9187648f76284e6f14c',
      targetDt: '20220222',
    }),
  );

  if (error) return <Paragraph>{JSON.stringify(error)}</Paragraph>;
  if (!data) return <ActivityIndicator />;

  const ranks = data?.boxOfficeResult?.dailyBoxOfficeList || []
  return~

๐Ÿ”— MovieDetail.js

 const url =
    'https://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json';
  const {data, error} = useFetch(
    url,
    (params = {
      key: 'bb4881b8d562d9187648f76284e6f14c',
      movieCd: route.params.movieCd,
    }),
  );

  if (error) return <Paragraph>{JSON.stringify(error)}</Paragraph>;
  if (!data) return <ActivityIndicator />;

  const detail = data.movieInfoResult.movieInfo;
return~

โœ๏ธ ํ”„๋ฆฌํŒจ์นญ

์‚ฌ์šฉ์ž๋“ค์ด ๋งŽ์ด ํด๋ฆญํ•  ๊ฒƒ์œผ๋กœ ๋ณด์žฅ๋˜๋Š” ๋ถ€๋ถ„์—๊ฒŒ ํ”„๋ฆฌํŒจ์นญํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ€์—ฌ
mutate fetchํ•ด์„œ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” data๋ฅผ ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— ๋ฐ์ดํ„ฐ ํ”„๋ฆฌํŒจ์นญ์„ ์‹œ์ž‘
์›น: ๋งˆ์šฐ์Šค๊ฐ€ ์˜ค๋ฒ„๋˜๋Š” ์ˆœ๊ฐ„, ์ž๋™๊ฒ€์ƒ‰: ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„

๐Ÿ”— BoxOffice.js

  useEffect(() => {
    if (!data) return;
    const ranks = data?.boxOfficeResult?.dailyBoxOfficeList || [];

    (async function () {
      for (const rank of ranks) {
        await prefetch( //await: ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
'https://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json',
          {
            key: 'bb4881b8d562d9187648f76284e6f14c',
            movieCd: rank.movieCd,
          },
        );
      }
    })();
  }, [data]);

๊ฐ ํŽ˜์ด์ง€์˜ rank๋“ค์„ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ for๋ฌธ์„ ์ด์šฉํ•ด ํ”„๋ฆฌํŒจ์นญ

profile
new blog: https://hae0-02ni.tistory.com/

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