Next.js의 서버 컴포넌트와 클라이언트 컴포넌트
'use client'를 언제 추가할지와 서버 및 클라이언트 트리를 구성하는 방법을 결정합니다.
Next.js의 서버 컴포넌트와 클라이언트 컴포넌트은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
기본값: 서버 컴포넌트
App Router에서는 기본적으로 모든 컴포넌트가 서버 컴포넌트입니다. 서버에서 렌더링되고 클라이언트 측 JavaScript가 전혀 없으며, 데이터베이스와 환경 변수, 파일 시스템에 직접 액세스할 수 있습니다.
클라이언트 컴포넌트 사용 설정하기
파일 맨 위에 'use client'를 추가하면 해당 파일이 클라이언트 컴포넌트가 됩니다. 가져오는 모든 모듈도 클라이언트 측 코드가 되어 클라이언트 경계를 만듭니다.
'use client';
import { useState } from 'react';
export function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}서버 컴포넌트에서 할 수 있는 작업
서버 컴포넌트에서는 데이터 가져오기를 인라인으로 await하고, 환경 변수를 읽고, 파일 시스템에 액세스하며, 클라이언트 묶음 크기를 늘리지 않고 서버 전용 대형 패키지를 가져올 수 있습니다.
// app/products/page.tsx — Server Component
export default async function ProductsPage() {
const products = await db.query('SELECT * FROM products');
return (
<ul>
{products.map(p => <li key={p.id}>{p.name}</li>)}
</ul>
);
}서버 컴포넌트에서 할 수 없는 작업
서버 컴포넌트에서는 훅(useState, useEffect), 브라우저 API 또는 이벤트 처리기를 사용할 수 없습니다. 이러한 기능에는 'use client'가 필요합니다.
서버와 클라이언트 조합하기
서버 컴포넌트의 출력을 속성이나 자식 요소로 클라이언트 컴포넌트에 전달하십시오. 핵심 패턴은 서버 컴포넌트에서 데이터를 가져오고 클라이언트 컴포넌트에서 상호작용을 처리하는 것입니다.
// Server Component (no 'use client')
async function ProductPage({ id }) {
const product = await getProduct(id); // direct DB call
return <AddToCartButton product={product} />; // client component
}
// Client Component
'use client';
function AddToCartButton({ product }) {
const [added, setAdded] = useState(false);
return <button onClick={() => { addToCart(product); setAdded(true); }}>{added ? 'Added!' : 'Add to cart'}</button>;
}서버에서 클라이언트로 자식 전달하기
서버 컴포넌트는 JSX를 children으로 클라이언트 컴포넌트에 전달할 수 있습니다. 자식 요소는 서버에서 렌더링된 상태로 유지되고, 클라이언트 래퍼가 상호작용 기능을 추가합니다.
// Client wrapper — Modal with open/close state
'use client';
function Modal({ children }) {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>Open</button>
{open && <dialog>{children}</dialog>}
</>
);
}
// Server Component — passes server-fetched content into client modal
async function Page() {
const content = await fetchContent();
return <Modal><ServerRenderedContent data={content} /></Modal>;
}클라이언트 경계
'use client'를 추가하면 해당 파일과 모든 자식 가져오기가 클라이언트 측 코드가 됩니다. 자식을 서버 컴포넌트로 유지하려면 직접 가져오는 대신 속성이나 슬롯으로 전달하십시오.
데이터 가져오기 패턴
서버 컴포넌트에서 데이터를 가져온 다음 하위 컴포넌트로 전달하십시오. 가능하면 클라이언트 컴포넌트에서 데이터를 가져오지 마십시오. 클라이언트 묶음이 커지고 서버 로직이 중복되기 때문입니다.
// Good: fetch in server, pass to client
async function Page() {
const user = await getUser();
return <UserProfile user={user} />; // client component
}
// Avoid: fetch in client
'use client';
function UserProfile() {
const { data } = useSWR('/api/user', fetcher); // network request from browser
}서버 전용 유틸리티
server-only 패키지는 서버 전용 모듈을 클라이언트 컴포넌트에서 실수로 가져오면 빌드 오류를 발생시킵니다.
// lib/db.ts
import 'server-only'; // throws at build time if imported in 'use client' file
export const db = createDbClient(process.env.DB_URL);서버와 클라이언트 간 상태 공유하기
서버 컴포넌트는 상태를 보유할 수 없습니다. 서버에서 가져온 데이터와 상호작용하는 클라이언트 컴포넌트 간에 상태를 공유하려면 초기 렌더링에서 속성으로 전달한 다음 클라이언트에서 업데이트를 관리하십시오.
use client를 추가할 때
다음이 필요할 때 'use client'를 추가하십시오. 훅(useState, useEffect), 브라우저 이벤트(onClick), 브라우저 API(localStorage, window) 또는 타사 클라이언트 라이브러리입니다.
빠른 확인
Next.js App Router에서 useState 또는 onClick을 사용하려면 파일 맨 위에 무엇을 추가해야 합니까?
복습
모든 App Router 컴포넌트는 기본적으로 서버 컴포넌트이므로 JS 묶음이 없고 데이터에 직접 액세스할 수 있습니다. 상호작용이 필요한 곳에만 'use client'를 추가하십시오. 서버에서 가져온 데이터를 속성이나 자식 요소로 클라이언트 래퍼에 전달하여 조합하고, 클라이언트 경계는 가능한 한 말단에 가깝게 유지하십시오.
자주 묻는 질문
“Next.js의 서버 컴포넌트와 클라이언트 컴포넌트” 강의는 무료인가요?
네 — “Next.js의 서버 컴포넌트와 클라이언트 컴포넌트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Next.js의 서버 컴포넌트와 클라이언트 컴포넌트”에서 뭘 배우나요?
'use client'를 언제 추가할지와 서버 및 클라이언트 트리를 구성하는 방법을 결정합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
React Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Next.js의 서버 컴포넌트와 클라이언트 컴포넌트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- App Router 파일 규칙
- Next.js의 서버 컴포넌트와 클라이언트 컴포넌트
- 동적 경로와 경로 그룹
- 메타데이터 API와 App Router의 SEO