0Pricing
Frontend Academy · 강의

데이터 캐싱을 위한 SWR 및 React Query

SWR 또는 TanStack Query를 사용해 서버 데이터를 가져오고, 캐시하고, 중복 요청을 제거하고, 재검증하여 수동으로 작성한 useEffect 가져오기 패턴을 대체합니다.

데이터 캐싱을 위한 SWR 및 React Query은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

서버 상태는 다릅니다

네트워크 데이터는 일반적인 상태와 다릅니다. 캐싱, 중복 제거, 백그라운드 새로 고침, 로딩 및 오류 추적, 재시도가 필요합니다. 수동으로 작성한 useEffect + useState 가져오기 패턴은 이러한 기능을 제대로 다시 구현하지 못합니다.

SWR과 TanStack Query 비교

SWR(Vercel): 작고 단순하며 훅만 제공합니다. TanStack Query(이전 이름은 React Query): 더 크고 기능이 많습니다(변경 작업, 무한 쿼리, 미리 가져오기, 개발자 도구). 둘 다 훌륭합니다.

SWR — 기본 사용법

useSWR(key, fetcher)는 데이터, 오류, 로딩 상태를 반환합니다. 키를 기준으로 캐시되며 컴포넌트 간 중복 요청이 제거됩니다.

import useSWR from 'swr';

const fetcher = (url) => fetch(url).then(r => r.json());

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

  if (error) return <ErrorMessage error={error} />;
  if (isLoading) return <Spinner />;
  return <h1>{data.name}</h1>;
}

SWR — 재검증 동작

기본적으로 SWR은 포커스를 다시 얻을 때(탭이 다시 활성화될 때)와 재연결할 때 재검증합니다. 캐시된 값을 즉시 반환하고(‘오래된 상태’), 백그라운드에서 업데이트합니다(‘재검증 중’).

SWR — 변경 작업

mutate(key)는 캐시된 쿼리를 재검증합니다. 두 번째 인수로 새 데이터를 전달하면 낙관적으로 업데이트할 수 있습니다.

import useSWR, { mutate } from 'swr';

async function updateProfile(updates) {
  // Optimistic update — UI reflects change immediately
  mutate('/api/me', { ...currentData, ...updates }, false);
  await fetch('/api/me', { method: 'PUT', body: JSON.stringify(updates) });
  // Revalidate to get the server's canonical state
  mutate('/api/me');
}

TanStack Query — 설정

설정된 QueryClient를 포함하는 QueryClientProvider로 앱을 감싸세요.

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

const client = new QueryClient({
  defaultOptions: {
    queries: { staleTime: 30000, retry: 2 }
  }
});

function App() {
  return (
    <QueryClientProvider client={client}>
      <Routes />
    </QueryClientProvider>
  );
}

useQuery

useQuery({ queryKey, queryFn })는 데이터를 가져와 캐시합니다.

import { useQuery } from '@tanstack/react-query';

function UserList() {
  const { data, isLoading, error } = useQuery({
    queryKey: ['users'],
    queryFn: () => fetch('/api/users').then(r => r.json()),
    staleTime: 60_000 // fresh for 1 minute
  });

  if (isLoading) return <Spinner />;
  if (error) return <ErrorMessage error={error} />;
  return <ul>{data.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}

쓰기 작업에 useMutation 사용하기

useMutation은 POST/PUT/DELETE를 처리하며, 대기 중 및 오류 상태를 기본으로 제공하고 캐시를 무효화하는 onSuccess 훅을 제공합니다.

import { useMutation, useQueryClient } from '@tanstack/react-query';

function CreateUserForm() {
  const qc = useQueryClient();
  const m = useMutation({
    mutationFn: (user) => fetch('/api/users', { method: 'POST', body: JSON.stringify(user) }),
    onSuccess: () => qc.invalidateQueries({ queryKey: ['users'] })
  });

  return <button onClick={() => m.mutate({ name: 'Alice' })} disabled={m.isPending}>Create</button>;
}

쿼리 무효화

변경 작업이 끝난 후 관련 쿼리를 무효화하여 다시 가져오기를 실행하세요. queryClient.invalidateQueries({ queryKey: ['users'] })는 해당 쿼리를 오래된 상태로 표시하고 마운트되어 있으면 다시 가져옵니다.

낙관적 업데이트

TanStack Query는 onMutate, onError, onSettled를 통해 낙관적 업데이트를 기본적으로 지원합니다.

useMutation({
  mutationFn: updateUser,
  onMutate: async (newUser) => {
    await qc.cancelQueries({ queryKey: ['user', newUser.id] });
    const previous = qc.getQueryData(['user', newUser.id]);
    qc.setQueryData(['user', newUser.id], newUser);
    return { previous };
  },
  onError: (_, newUser, ctx) => {
    qc.setQueryData(['user', newUser.id], ctx.previous); // rollback
  },
  onSettled: (_, __, newUser) => {
    qc.invalidateQueries({ queryKey: ['user', newUser.id] });
  }
});

무한 쿼리

useInfiniteQuery는 페이지로 나뉘거나 무한 스크롤되는 목록을 처리합니다. fetchNextPage를 제공하고 로드된 모든 페이지를 추적합니다.

React Query 개발자 도구

@tanstack/react-query-devtools를 추가하면 캐시된 모든 쿼리와 그 상태를 보여 주고 수동으로 무효화할 수 있는 부동 패널이 표시됩니다.

빠른 확인

수동으로 useEffect와 fetch를 사용하는 것보다 SWR 또는 TanStack Query를 사용할 때 얻는 가장 큰 이점은 무엇인가요?

복습: SWR과 React Query

서버 상태에는 캐싱, 중복 제거, 재검증이 필요합니다. SWR은 작고 단순하며, TanStack Query는 변경 작업, 무한 쿼리, 개발자 도구 등 더 많은 기능을 제공합니다. 읽기에는 useQuery를, 쓰기에는 useMutation을 사용합니다. 변경 작업 후에는 invalidateQueries를 호출하세요. onMutate/onError를 사용해 낙관적으로 업데이트할 수 있습니다. 두 도구 모두 운영 앱에서 수동 useEffect+fetch 패턴을 사용하지 않아도 되게 해 줍니다.

자주 묻는 질문

“데이터 캐싱을 위한 SWR 및 React Query” 강의는 무료인가요?

네 — “데이터 캐싱을 위한 SWR 및 React Query” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“데이터 캐싱을 위한 SWR 및 React Query”에서 뭘 배우나요?

SWR 또는 TanStack Query를 사용해 서버 데이터를 가져오고, 캐시하고, 중복 요청을 제거하고, 재검증하여 수동으로 작성한 useEffect 가져오기 패턴을 대체합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Frontend Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“데이터 캐싱을 위한 SWR 및 React Query” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Fetch API: GET, POST, PUT, DELETE
  2. Axios: 인터셉터와 기본 URL
  3. 오류 처리: HTTP 상태 코드
  4. 데이터 캐싱을 위한 SWR 및 React Query
← Frontend Academy(으)로 돌아가기