본문으로 건너뛰기
AIDevOps
  • Learn
  • Learning Paths
  • Practice
  • Open Source
  • Books
  • Engineering

    AI DevOpsAI 서비스 개발·운영 전체 지도LLMOpsLLM 배포·평가·관측실전 프로젝트AI Agent 프로젝트 실습

    Knowledge

    Docs기술 문서 모음Blog엔지니어링 아티클Plogger개발 기록 피드

    Validate

    Certification3단계 역량 인증 · 준비 중
AI Models
LlamaMistralGemmaDeepSeekQwen
🎨 Frontend
Frontend 입문 & 로드맵JavaScriptTypeScript|ReactNext.js|VueNuxt
🤖 AI 실전 개발
AI 실전 입문 & 로드맵Hugging FaceLangChainLlamaIndexLLMOps|LangGraphMCPMulti-AgentAgent Evaluation
🧠 AI Core
AI 입문 & 로드맵ML FundamentalsLLM Fundamentals|Python AIC++|PyTorchTensorFlowJAX
🧠 AI Agent 개발
금융 AI AgentLLM API 서버주식 투자 AgentAIOps AI Agent교육 AI Agent코딩 AI Agent
🌱 Spring Cloud
Spring 입문 & 로드맵Spring Cloud GatewaySpring BootJava|Spring AISpring SecuritySpring BatchSpring JPA
🐳 DevOps
DevOps 입문 & 로드맵LinuxDockerCI/CD|Kubernetes 기본K8s 심화/실무PrometheusGrafana
🧱 인프라
인프라 입문 & 로드맵NginxRedis
☁️ 클라우드
클라우드 입문 & 로드맵AWSGCPAzureNCPCloudflare
📱 Mobile
Mobile 입문 & 로드맵KotlinAndroidFlutter
⚙️ Backend
Backend 입문 & 로드맵Python 기본FastAPIDjangoFlask|CGoGinNode.js
💾 Database
DB 입문 & 로드맵공통 SQLOracleMySQLPostgreSQL|MongoDB벡터 DB
🧪 검증
k6JMeternGrinder
AIDevOps

Engineering AI. From Code to Production.
AI와 AI Agent를 개발하고 운영하기 위한 엔지니어링 학습 플랫폼

Learn

  • 전체 가이드
  • Learning Paths
  • Practice
  • Books

Resources

  • AI DevOps
  • LLMOps
  • 실전 프로젝트
  • Docs
  • Blog
  • Plogger
  • Open Source
  • Certification (준비 중)

Start Here

  • AI Core 로드맵
  • AI 실전 개발 로드맵
  • Spring Cloud 로드맵
  • DevOps 로드맵
  • 인프라 로드맵

 

  • 클라우드 로드맵
  • Frontend 로드맵
  • Mobile 로드맵
  • Backend 로드맵
  • Database 로드맵
© 2026 AI DevOps Korea. All rights reserved.
이용약관개인정보처리방침Sitemaptestforge.kr
  1. Home
  2. Learn
  3. Frontend
  4. Next.js
React 프레임워크 가이드

▲ Next.js 완전 가이드

Visitors

React 기반 풀스택 프레임워크. App Router, 서버/클라이언트 컴포넌트, 데이터 캐싱, 서버 액션, Route Handlers, 미들웨어, 메타데이터·SEO, 스트리밍, 배포까지 — 현대 웹 개발의 표준을 전 과정으로 학습합니다.

  • Intermediate · 중급
  • 업데이트 2026.09.19
  • 약 12분 읽기
  • 15개 섹션
  • 예제 코드 14개
  • 웹 IDE 실습 제공
▲

Next.js 웹 IDE

설치 없이 브라우저에서 코드를 실행하고 단계별 예제로 익혀보세요.

웹 IDE 열기 →
SSR/SSG 풀스택 앱App RouterServer ActionsVercel/Cloudflare 배포

관련 프레임워크 & 개발환경

⚛️React→🔷TypeScript→🟢Node.js→💡Nuxt→

목차

0 / 17
  1. 가이드 사용법
  2. 구조 다이어그램
  3. Next.js란?
  4. App Router & 파일 기반 라우팅
  5. 서버 vs 클라이언트 컴포넌트
  6. 데이터 페칭 & 캐싱
  7. 서버 액션 & 폼
  8. Route Handlers (API)
  9. 미들웨어
  10. 메타데이터 & SEO
  11. Loading/Error UI & 스트리밍
  12. 이미지 & 폰트 최적화
  13. 배포 (Vercel / Cloudflare)
  14. 다음 단계
  15. Next.js 설계
  16. 운영 기준
  17. 검증 전략
목차 17개 섹션
  1. 가이드 사용법
  2. 구조 다이어그램
  3. Next.js란?
  4. App Router & 파일 기반 라우팅
  5. 서버 vs 클라이언트 컴포넌트
  6. 데이터 페칭 & 캐싱
  7. 서버 액션 & 폼
  8. Route Handlers (API)
  9. 미들웨어
  10. 메타데이터 & SEO
  11. Loading/Error UI & 스트리밍
  12. 이미지 & 폰트 최적화
  13. 배포 (Vercel / Cloudflare)
  14. 다음 단계
  15. Next.js 설계
  16. 운영 기준
  17. 검증 전략

가이드 사용법

읽는 방향

Next.js를 실무 흐름으로 이해하기

React 기반 풀스택 프레임워크. App Router, 서버/클라이언트 컴포넌트, 데이터 캐싱, 서버 액션, Route Handlers, 미들웨어, 메타데이터·SEO, 스트리밍, 배포까지 — 현대 웹 개발의 표준을 전 과정으로 학습합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.

핵심 관점

프론트엔드 / 앱 개발

화면을 그리는 법에서 멈추지 않고, 상태, 데이터 요청, 라우팅, 접근성, 배포 단위까지 함께 봅니다.

SSR/SSG 풀스택 앱App RouterServer ActionsVercel/Cloudflare 배포

구조 다이어그램

글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 Next.js를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.

학습 흐름

다이어그램 렌더링 중…

아키텍처 관점

다이어그램 렌더링 중…

Next.js란?

Next.js를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.

Next.js는 React 위에 라우팅, 렌더링 전략, 데이터 페칭, 배포까지 하나로 묶은 풀스택 프레임워크입니다. 앱 전체가 아니라 페이지·컴포넌트 단위로 렌더링 방식을 다르게 선택할 수 있는 것이 핵심입니다.
렌더링설명사용 시점
SSG빌드 시 정적 HTML 생성변경 적은 콘텐츠
ISR정적 + 주기적 재검증블로그, 상품 목록
SSR요청마다 서버 렌더링사용자별 맞춤 페이지
CSR클라이언트 렌더링대화형 대시보드

App Router & 파일 기반 라우팅

여기서는 App Router & 파일 기반 라우팅을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

app/ 디렉터리의 폴더 구조가 곧 URL입니다. 폴더 안에서도 page.tsx만 실제 라우트로 노출되고, 나머지 파일(layout, loading, error 등)은 규칙에 따라 자동으로 연결됩니다.
TEXT
app/
├── layout.tsx        # 루트 레이아웃
├── page.tsx          # /
├── blog/
│   ├── page.tsx      # /blog
│   └── [slug]/
│       └── page.tsx  # /blog/:slug (동적 세그먼트)
├── docs/
│   └── [...slug]/
│       └── page.tsx  # /docs/a/b/c (catch-all)
├── (marketing)/      # route group — URL에 영향 없이 폴더만 그룹화
│   └── about/page.tsx  # /about
└── api/
    └── users/
        └── route.ts  # /api/users
패턴의미
[id]동적 세그먼트 — params.id로 접근
[...slug]catch-all — 여러 세그먼트를 배열로 매칭
[[...slug]]optional catch-all — 상위 경로 자체도 매칭
(marketing)route group — URL 경로에는 나타나지 않는 폴더 그룹
@modalparallel route — 같은 레이아웃에 여러 페이지를 동시 렌더링
(.)photointercepting route — 모달 등에서 다른 라우트를 가로채기

서버 vs 클라이언트 컴포넌트

여기서는 서버 vs 클라이언트 컴포넌트을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

기본은 서버 컴포넌트입니다. 상태·이벤트·브라우저 API가 필요한 리프(leaf) 컴포넌트에만 최소 범위로 "use client"를 선언하세요.
TSX
// 서버 컴포넌트 (기본) — DB 직접 접근 가능
async function ProductList() {
    const products = await db.product.findMany({ take: 20 });
    return <ul>{products.map(p => <li key={p.id}>{p.name}</li>)}</ul>;
}

// 클라이언트 컴포넌트 — 인터랙션 필요 시
'use client';
import { useState } from 'react';
export function Counter() {
    const [n, setN] = useState(0);
    return <button onClick={() => setN(n+1)}>{n}</button>;
}

Tip

  • "use client" 경계는 트리 아래로 전파된다 — 최대한 잎(leaf) 노드에 가깝게 선언한다
  • 서버 컴포넌트는 async 함수로 직접 await 가능, 클라이언트 컴포넌트는 훅으로만 상태를 다룬다
  • 서버 컴포넌트를 클라이언트 컴포넌트의 children으로 넘기면 그 부분은 여전히 서버에서 렌더링된다

데이터 페칭 & 캐싱

여기서는 데이터 페칭 & 캐싱을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

Next.js는 fetch를 확장해 캐싱을 선언적으로 제어합니다. 기본은 정적(무기한 캐시)이고, 옵션으로 주기적 재검증이나 완전 동적 렌더링을 선택합니다.
TSX
// 기본 — 무기한 캐시 (SSG처럼 동작)
const res = await fetch('https://api.example.com/products');

// ISR — N초마다 백그라운드에서 재검증
const res2 = await fetch(url, { next: { revalidate: 60 } });

// 태그 기반 재검증 — 특정 데이터만 선택적으로 무효화
const res3 = await fetch(url, { next: { tags: ['products'] } });
// 이후 서버 액션 등에서: revalidateTag('products');

// 매 요청마다 새로 페칭 (SSR)
const res4 = await fetch(url, { cache: 'no-store' });

// 라우트 전체를 동적 렌더링으로 강제
export const dynamic = 'force-dynamic';
옵션동작
(기본, 옵션 없음)빌드 시 캐시, 재검증 전까지 재사용
next: { revalidate: N }N초 경과 후 백그라운드에서 재검증 (ISR)
next: { tags: [...] }revalidateTag()로 특정 캐시만 선택적으로 무효화
cache: 'no-store'매 요청마다 새로 페칭 (SSR과 동일)
export const dynamic = 'force-dynamic'페이지 전체를 요청마다 서버 렌더링

서버 액션 & 폼

여기서는 서버 액션 & 폼을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

서버 액션은 클라이언트에서 직접 호출 가능한 서버 함수입니다. 폼 제출과 mutation을 별도 API 라우트 없이 처리할 수 있습니다. `use server` 지시어만 붙이면 함수 본문이 서버에서 실행되고, 클라이언트 컴포넌트에서는 useActionState로 그 함수의 로딩·에러 상태를 그대로 받아 폼 UI에 반영할 수 있어 별도의 fetch·상태 관리 코드가 필요 없습니다.
app/users/actions.tsTSX
'use server';
import { revalidatePath } from 'next/cache';
import { z } from 'zod';

const schema = z.object({ name: z.string().min(1, '이름을 입력하세요') });

export async function createUser(prevState: { error?: string }, formData: FormData) {
  const parsed = schema.safeParse({ name: formData.get('name') });
  if (!parsed.success) {
    return { error: parsed.error.issues[0].message };
  }
  await db.user.create({ data: parsed.data });
  revalidatePath('/users');
  return { error: undefined };
}
app/users/UserForm.tsxTSX
'use client';
import { useActionState } from 'react';
import { createUser } from './actions';

export function UserForm() {
  const [state, formAction, isPending] = useActionState(createUser, {});
  return (
    <form action={formAction}>
      <input name="name" />
      {state.error && <p>{state.error}</p>}
      <button disabled={isPending}>추가</button>
    </form>
  );
}

Tip

  • 서버 액션 안에서는 항상 서버 측 검증을 다시 한다 — 클라이언트 검증은 UX용일 뿐 신뢰하지 않는다
  • mutation 후에는 revalidatePath/revalidateTag로 캐시를 갱신해야 화면에 반영된다

Route Handlers (API)

여기서는 Route Handlers (API)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

서버 액션이 폼·mutation용이라면, Route Handler는 외부에 공개하는 REST API나 webhook 수신용입니다. app/api/**/route.ts에 HTTP 메서드별 함수를 export합니다.
app/api/users/[id]/route.tsTYPESCRIPT
import { NextRequest, NextResponse } from 'next/server';

export async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  const { id } = await params;
  const user = await db.user.findUnique({ where: { id } });
  if (!user) return NextResponse.json({ error: 'not found' }, { status: 404 });
  return NextResponse.json(user);
}

export async function DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  const { id } = await params;
  await db.user.delete({ where: { id } });
  return new NextResponse(null, { status: 204 });
}
상황선택
같은 앱 안 폼 제출·mutationServer Action
외부 클라이언트(모바일 앱 등)가 호출할 REST APIRoute Handler
webhook 수신 (결제, GitHub 등)Route Handler
서버 컴포넌트 밖에서 스트리밍 응답이 필요할 때Route Handler

미들웨어

여기서는 미들웨어을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

미들웨어는 요청이 라우트에 도달하기 전에 실행됩니다. 인증 체크, 리다이렉트, rewrite, 헤더 조작에 사용하며 matcher로 적용 범위를 좁혀야 합니다.
middleware.tsTYPESCRIPT
import { NextRequest, NextResponse } from 'next/server';

export function middleware(req: NextRequest) {
  const token = req.cookies.get('session')?.value;
  if (!token) {
    return NextResponse.redirect(new URL('/login', req.url));
  }
  return NextResponse.next();
}

export const config = {
  matcher: ['/dashboard/:path*', '/settings/:path*'],
};

Tip

  • matcher를 지정하지 않으면 정적 자산을 포함한 모든 요청에서 실행되어 성능에 영향을 준다
  • 미들웨어는 Edge 런타임에서 실행되므로 Node.js 전용 API(fs 등)는 사용할 수 없다

메타데이터 & SEO

여기서는 메타데이터 & SEO을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

generateMetadata로 페이지별 title/description/OG 태그를 동적으로 생성하고, sitemap.ts·robots.ts로 검색엔진 크롤링을 제어합니다.
app/blog/[slug]/page.tsxTSX
import type { Metadata } from 'next';

export async function generateMetadata(
  { params }: { params: Promise<{ slug: string }> }
): Promise<Metadata> {
  const { slug } = await params;
  const post = await getPost(slug);
  return {
    title: post.title,
    description: post.excerpt,
    openGraph: { title: post.title, images: [post.coverImage] },
  };
}
app/sitemap.tsTYPESCRIPT
export default async function sitemap() {
  const posts = await getAllPosts();
  return posts.map((p) => ({
    url: 'https://example.com/blog/' + p.slug,
    lastModified: p.updatedAt,
  }));
}

Loading/Error UI & 스트리밍

여기서는 Loading/Error UI & 스트리밍을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

loading.tsx, error.tsx, not-found.tsx는 각각 Suspense fallback, Error Boundary, 404 처리를 파일 하나로 대체합니다. 늦게 준비되는 데이터만 로 감싸면 나머지 화면은 먼저 스트리밍됩니다.
TEXT
app/dashboard/
├── layout.tsx
├── page.tsx
├── loading.tsx     # page.tsx 준비되는 동안 자동 표시
├── error.tsx       # 하위에서 던진 에러를 잡음 (use client 필요)
└── not-found.tsx   # notFound() 호출 시 표시
app/dashboard/error.tsxTSX
'use client';

export default function Error({ error, reset }: { error: Error; reset: () => void }) {
  return (
    <div>
      <p>문제가 발생했습니다: {error.message}</p>
      <button onClick={() => reset()}>다시 시도</button>
    </div>
  );
}
app/dashboard/page.tsxTSX
import { Suspense } from 'react';

export default function Dashboard() {
  return (
    <>
      <Header />
      <Suspense fallback={<p>통계 불러오는 중...</p>}>
        <SlowStats />
      </Suspense>
    </>
  );
}

이미지 & 폰트 최적화

여기서는 이미지 & 폰트 최적화을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

next/image는 자동으로 리사이징·포맷 변환(WebP/AVIF)·lazy loading을 처리하고, next/font는 폰트를 빌드 타임에 셀프 호스팅해 레이아웃 이동(CLS)을 없앱니다.
TSX
import Image from 'next/image';
import { Inter } from 'next/font/google';

const inter = Inter({ subsets: ['latin'], display: 'swap' });

export default function Hero() {
  return (
    <main className={inter.className}>
      <Image
        src="/hero.png"
        alt="제품 소개 이미지"
        width={1200}
        height={600}
        priority // LCP 이미지에만 사용
      />
    </main>
  );
}

Tip

  • priority는 최초 화면(LCP)에 보이는 이미지 하나에만 붙인다 — 남발하면 오히려 느려진다
  • 외부 도메인 이미지는 next.config.ts의 images.remotePatterns에 등록해야 최적화가 적용된다

배포 (Vercel / Cloudflare)

여기서는 배포 (Vercel / Cloudflare)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

Vercel은 별도 설정 없이 App Router 기능을 100% 지원합니다. Cloudflare는 OpenNext 어댑터로 Workers/Pages에 배포합니다.
BASH
# Vercel
npm i -g vercel && vercel --prod

# Cloudflare Workers
npm install -D @opennextjs/cloudflare
npx opennextjs-cloudflare build
npx wrangler deploy
배포 대상특징
VercelNext.js 제작사, ISR·Edge·이미지 최적화 등 모든 기능 완전 지원
Cloudflare Workers/Pages@opennextjs/cloudflare로 배포, 낮은 지연시간과 저렴한 비용
Docker (자체 호스팅)next.config.ts에 output: 'standalone' 설정 후 경량 이미지로 빌드

다음 단계

이 섹션은 다음 단계을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.

🚀
Next.js 기본기를 마쳤다면?

컴포넌트 내부의 Hooks, 상태 관리, 폼 검증, 성능 최적화는 React 가이드에서 더 깊이 다룹니다. 대규모 코드베이스라면 TypeScript 가이드로 타입 안전성을 더하고, 배포 파이프라인 자동화는 CI/CD 가이드를 참고하세요.

연계 가이드: React 가이드 · TypeScript 가이드 · CI/CD 가이드 · Nuxt.js 가이드

Next.js 실무 설계

Next.js 실무 설계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.

Next.js는 App Router에서 server/client boundary를 설계하는 것이 핵심입니다. data fetching 위치와 cache 정책을 페이지별로 명시해야 합니다.
결정 지점확인 질문실무 기준
경계Next.js 코드에서 바뀌기 쉬운 부분은 어디인가?입출력, 설정, 외부 연동, 핵심 규칙을 분리합니다.
상태상태가 어디서 생성되고 어디서 사라지는가?상태 소유자와 수명 주기를 코드로 드러냅니다.
장애실패했을 때 호출자는 무엇을 받는가?timeout, fallback, error contract를 먼저 정합니다.

Next.js 운영 기준

이 섹션은 Next.js 운영 기준을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.

ISR/revalidate, dynamic route, edge/runtime 차이, bundle split, image optimization을 운영 기준으로 봐야 합니다.

Tip

  • server/client boundary
  • cache policy
  • metadata/canonical
  • hydration check

Next.js 검증 전략

Next.js 검증 전략은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.

route handler, metadata, sitemap, canonical, hydration mismatch를 테스트해야 합니다.
품질 축검증 방법완료 기준
정확성정상/실패 케이스를 자동화합니다.핵심 시나리오가 재현 가능하게 통과합니다.
회귀 방지버그 수정 시 동일 케이스를 테스트로 남깁니다.같은 장애가 다시 배포되지 않습니다.
운영성로그, 메트릭, 알림을 확인합니다.문제가 생겼을 때 원인 추적 경로가 있습니다.
← 이전 가이드React다음 가이드 →Vue