Communitygithub.com

Next.js 타입스크립트 스킬

Next.js App Router에서 데이터를 가져올 때 사용 — RSC fetch, 캐싱, 재검증, Suspense 스트리밍, 병렬 요청 또는 Route Handler. 올바른 캐시 및 워터폴 동작을 보장합니다.

Next.js 타입스크립트 스킬란 무엇인가요?

이 AI 에이전트 스킬은 Next.js App Router 환경에서 데이터 가져오기 및 캐싱 전략을 안내합니다. 서버 컴포넌트에서 `async/await`와 함께 `fetch()`를 사용하고, `useEffect`를 초기 데이터 로딩에 사용하지 않도록 규정합니다. `fetch()`의 기본 캐싱 동작, 정적 재생성(ISR), 동적 요청, 온디맨드 무효화(`revalidateTag`) 등 다양한 패턴을 제공합니다. 병렬 데이터 요청은 `Promise.all`로 최적화하고, 느린 섹션은 `Suspense` + `loading.tsx`로 스트리밍 처리합니다. 또한 클라이언트 사이드 페칭(SWR/React Query)은 인터랙티브 UI에만 제한하도록 합니다. 이 스킬은 Claude Code, Cursor, Codex 등 주요 AI 코딩 어시스턴트와 호환되며, SKILL.md 문서를 기반으로 개발자에게 올바른 Next.js 데이터 로딩 패턴을 제시합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sakilanwar12/nextjs-typescript-skills/tree/HEAD/skills/nextjs-data-fetching

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Next.js 데이터 가져오기

규칙

  1. 서버 컴포넌트에서 async/await로 데이터를 가져오세요. 초기 데이터에 useEffect를 사용하지 마세요.
  2. fetch()는 { cache: 'no-store' } 또는 next: { revalidate }를 지정하지 않는 한 App Router에서 기본적으로 캐시됩니다. 원하는 동작을 명확히 파악하세요.
  3. 독립적인 요청은 Promise.all로 병렬 처리하고, 의존성이 있는 경우에만 순차 처리하세요.
  4. 느린 섹션은 <Suspense fallback> + loading.tsx로 감싸 스트리밍하세요.
  5. 온디맨드 무효화를 위해 next: { tags: ['posts'] } + revalidateTag('posts')를 사용하세요.
  6. 클라이언트 사이드 페칭(SWR/React Query)은 인터랙티브 UI/필터 UI에만 사용하고, 초기 렌더링에는 사용하지 마세요.

패턴

// 재검증이 있는 정적 데이터 (ISR)
async function getPosts() {
  const res = await fetch('https://api.example.com/posts', {
    next: { revalidate: 60 },
  });
  if (!res.ok) throw new Error('게시물을 가져오지 못했습니다');
  return res.json();
}

// 동적, 캐시되지 않음
async function getInbox(userId: string) {
  const res = await fetch(`https://api.example.com/inbox/${userId}`, {
    cache: 'no-store',
  });
  return res.json();
}

// 서버 컴포넌트에서 병렬 처리
export default async function Dashboard() {
  const [user, posts] = await Promise.all([getUser(), getPosts()]);
  return <View user={user} posts={posts} />;
}

// 느린 섹션 스트리밍
import { Suspense } from 'react';
export default function Page() {
  return (
    <div>
      <FastHeader />
      <Suspense fallback={<CommentsSkeleton />}>
        <SlowComments />
      </Suspense>
    </div>
  );
}
// app/api/revalidate/route.ts — 온디맨드 재검증
import { revalidateTag } from 'next/cache';
export async function POST(req: Request) {
  const { tag, secret } = await req.json();
  if (secret !== process.env.REVALIDATE_SECRET)
    return Response.json({ ok: false }, { status: 401 });
  revalidateTag(tag);
  return Response.json({ ok: true });
}

체크리스트

  • 서버 컴포넌트에서 fetch, useEffect 사용 안 함?
  • 캐시 모드 명시됨 (revalidate, no-store 또는 태그)?
  • 독립적인 요청 병렬 처리됨?
  • 느린 부분에 Suspense 경계 적용됨?
  • 오류 처리됨 (throw → error.tsx 또는 우아한 대체)?

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

관련 스킬