๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - SWR

2025. 7. 5. 14:55ยท๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

SWR

 

โœ… SWR์ด๋ž€?


Stale-While-Revalidate

Stale: ์˜ค๋ž˜๋œ, ๋‚ก์€

While: ~ํ•˜๋Š” ๋™์•ˆ์—

Revalidate: ๋‹ค์‹œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋‹ค, ๋‹ค์‹œ ํ™•์ธํ•˜๋‹ค.

 

"์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋™์•ˆ์— ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ฐฑ์‹ ํ•œ๋‹ค."

 

SWR์€ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ›…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

(SWR์€ NextJS๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ NextJS์™€ ์•„์ฃผ ์ž˜ ๋งž๋Š”๋‹ค.)

 

API ์š”์ฒญ์„ ๋‹ค์‹œ ํ•˜์ง€ ์•Š๊ณ , ์ „์— ๋ฐ›์€ ์บ์‹œ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ SWR์€ ์ •๋ง ๋˜‘๋˜‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋„ ๋ชจ๋ฅด๊ฒŒ API ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ์ดํ„ฐ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.

(๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.)

 

โœ… ์‚ฌ์šฉ๋ฒ•


์„ค์น˜

npm i swr

 

(React๋ฅผ rc ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋’ค์— --legacy-peer-deps๋ฅผ ์ถ”๊ฐ€ํ•ด ์„ค์น˜ํ•œ๋‹ค.)

 

useSWR()์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” 2๊ฐœ์˜ ์ธ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

1. ์š”์ฒญ์„ ๋ณด๋‚ผ URL

2. fetcher fn

 

์˜ˆ์‹œ

import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import useSWR from "swr";

const fetcher = (url: string) => fetch(url).then((response) => response.json());

export default function useUser() {
  const { data, error, mutate } = useSWR("/api/users/me", fetcher);
  const router = useRouter();

  // return router.replace("/enter");

  return data;
}

 

mutate: ์บ์‹œ ์•ˆ์— ์ €์žฅ๋œ data๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜

 

useSWR()์€ ์œ ์ €๊ฐ€ ๋‹ค๋ฅธ ํƒญ์œผ๋กœ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๋Š” ๊ฒƒ๋„ ํ•ด์ค€๋‹ค.

 

โœ… bound mutate, unbound mutate


bound mutate: ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ์–ป์€ ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ

unbound mutate: ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ

 

โœ… SWRConfig


๋ชจ๋“  ํŽ˜์ด์ง€์— ์ ์šฉ๋˜์–ด fetcher ๊ฐ™์€ ๊ฒƒ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” provider

(SWR์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์— ์ ์šฉ๋œ๋‹ค.)

 

์˜ˆ์‹œ(_app.tsx)

import "../styles/globals.css";
import type { AppProps } from "next/app";
import { SWRConfig } from "swr";

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <SWRConfig
      value={{
        fetcher: (url: string) =>
          fetch(url).then((response) => response.json()),
      }}
    >
      <div className="mx-auto w-full max-w-xl">
        <Component {...pageProps} />
      </div>
    </SWRConfig>
  );
}

export default MyApp;

 

์ด๋Ÿฐ ์‹์œผ๋กœ fetcher์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ๊ธ€๋กœ๋ฒŒ ์˜ต์…˜๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) refreshInterval: 2000 -> 2์ดˆ๋งˆ๋‹ค ์ƒˆ๋กœ๊ณ ์นจ

 

'๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - TanStack Query(React Query)  (0) 2026.02.03
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Zod  (0) 2025.12.03
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - NextAuth  (0) 2025.07.04
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Iron Session  (0) 2025.07.04
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - React Hook Form  (2) 2025.05.27
'๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - TanStack Query(React Query)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Zod
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - NextAuth
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Iron Session
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    API
    mongoDB
    Firebase
    Next.js
    SQL
    Python
    PostgreSQL
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    ๋ชจ๋”ฅ๋‹ค
    react router
    dev setup
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    next.js 14
    0๋ ˆ๋ฒจ
    Prisma
    MySQL
    tailwindcss
    next.js 12
    React Native
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - SWR
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”