Next.jsNext.js 기초 · 1기초

Next.js란? — App Router와 풀스택 React

Next.jsAppRouterSSRSSG풀스택

React vs Next.js

React는 UI 라이브러리, Next.js는 React 기반 풀스택 프레임워크입니다.

flowchart LR
    subgraph REACT["React (CSR)"]
        B["브라우저\n빈 HTML 받음"]
        JS["JS 다운로드\n+ 실행"]
        UI["UI 렌더링"]
        B --> JS --> UI
    end

    subgraph NEXT["Next.js (SSR)"]
        S["서버\nHTML 생성"]
        C["브라우저\n완성된 HTML"]
        HYD["Hydration\n인터랙티브"]
        S --> C --> HYD
    end

렌더링 방식

방식언제 생성사용 사례
CSR브라우저에서대시보드, 인증 후 페이지
SSR요청마다 서버에서사용자별 피드, 실시간 데이터
SSG빌드 시 1번블로그, 문서, 마케팅
ISR빌드 후 주기적 재생성제품 목록, 뉴스

프로젝트 생성

npx create-next-app@latest my-app --typescript --tailwind --eslint --app
cd my-app
npm run dev
# http://localhost:3000

App Router 폴더 구조

app/
├── layout.tsx          ← 루트 레이아웃 (항상 유지)
├── page.tsx            ← / 경로
├── loading.tsx         ← 로딩 UI
├── error.tsx           ← 에러 UI
├── not-found.tsx       ← 404
├── about/
│   └── page.tsx        ← /about
├── users/
│   ├── page.tsx        ← /users
│   └── [id]/
│       └── page.tsx    ← /users/123
└── api/
    └── users/
        └── route.ts    ← API 엔드포인트

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

// 서버 컴포넌트 (기본값)
// - 서버에서만 실행
// - useState, useEffect 사용 불가
// - DB, 파일 직접 접근 가능
// - 번들 크기에 포함 안 됨

async function ProductPage({ params }: { params: { id: string } }) {
    // 직접 DB 쿼리 가능 (서버에서만 실행)
    const product = await db.products.findById(params.id);
    return <div>{product.name}</div>;
}

// 클라이언트 컴포넌트
// "use client" 지시어 필요
"use client";
import { useState } from "react";

function AddToCart({ productId }: { productId: string }) {
    const [count, setCount] = useState(0);
    return (
        <button onClick={() => setCount(c => c + 1)}>
            장바구니 ({count})
        </button>
    );
}

루트 레이아웃

// app/layout.tsx
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
    title: "My App",
    description: "Next.js 앱",
};

export default function RootLayout({
    children,
}: {
    children: React.ReactNode;
}) {
    return (
        <html lang="ko">
            <body className={inter.className}>
                <header>헤더</header>
                <main>{children}</main>
                <footer>푸터</footer>
            </body>
        </html>
    );
}

첫 페이지

// app/page.tsx
export default function HomePage() {
    return (
        <div>
            <h1>Next.js 앱에 오신 것을 환영합니다!</h1>
            <p>App Router를 사용하고 있습니다.</p>
        </div>
    );
}

정리

개념설명
App Routerapp/ 폴더 기반 파일 라우팅
서버 컴포넌트기본값, 서버에서만 실행
클라이언트 컴포넌트"use client", 브라우저에서 실행
SSR요청마다 서버 렌더링
SSG빌드 시 정적 생성

다음 편에서는 페이지와 라우팅 — 동적 라우트, 중첩 레이아웃, 라우트 그룹을 배웁니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.