Next.js: 서버 컴포넌트와 렌더링 (Step 3)
1. 서버 컴포넌트 (Server Components)
Next.js 13 버전부터 도입된 핵심 개념으로, 기본적으로 모든 컴포넌트는 서버 컴포넌트 입니다.
- 서버에서만 렌더링되므로 JS 번들 크기가 줄어듭니다.
- 데이터베이스나 파일 시스템에 직접 접근할 수 있습니다.
- 보안이 중요한 API 키 등을 노출하지 않고 데이터를 가져올 수 있습니다.
2. 클라이언트 컴포넌트 (Client Components)
브라우저에서의 상호작용(useState, useEffect, onClick 등)이 필요한 경우 사용합니다. 파일 최상단에 'use client'; 지시어를 추가해야 합니다.
'use client';
import { useState } from 'react';
export default function InteractiveCounter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
3. 데이터 페칭 (Data Fetching)
서버 컴포넌트에서는 async/await를 직접 사용하여 데이터를 가져옵니다.
// app/posts/page.tsx
async function getPosts() {
const res = await fetch('https://api.example.com/posts');
return res.json();
}
export default async function Page() {
const posts = await getPosts();
return (
<ul>
{posts.map(post => <li key={post.id}>{post.title}</li>)}
</ul>
);
}
4. 렌더링 전략 개요
- SSG (Static Site Generation): 빌드 시점에 페이지를 생성합니다. (기본값)
- SSR (Server Side Rendering): 요청 시점마다 서버에서 페이지를 생성합니다.
- ISR (Incremental Static Regeneration): 정적으로 생성하되, 일정 주기로 페이지를 백그라운드에서 갱신합니다.