reactserver-componentsnext.js
React Server Components - 서버에서 렌더링되는 컴포넌트
✨ AI 요약
긴 글, 핵심만 먼저 — 이 글을 3줄로 정리해드려요.
조회 1
React Server Components(RSC)는 서버에서만 실행되고, 클라이언트로 JavaScript 번들을 전송하지 않는 새로운 컴포넌트 모델입니다.
Next.js 13+ App Router에서 기본으로 사용되며, 성능과 번들 크기 최적화에 큰 도움을 줍니다.
1. Server Components vs Client Components
// Server Component (기본)
async function UserList() {
const users = await fetchUsers(); // 서버에서 직접 데이터 패칭
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
// Client Component
"use client";
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
- Server Components는
"use client"가 없으면 기본적으로 서버에서 실행됩니다. - 브라우저 API, 상태, 이벤트 핸들러가 필요하면 Client Component로 만들어야 합니다.
2. Server Components의 장점
- 번들 크기 감소: 서버 컴포넌트는 클라이언트로 전송되지 않음
- 직접 DB 접근: 서버에서 데이터베이스나 파일 시스템에 직접 접근 가능
- 보안: API 키나 시크릿을 서버에서만 사용
- 성능: 초기 로딩 시간 단축
3. Server와 Client 컴포넌트 조합
// Server Component
async function Page() {
const data = await fetchData();
return (
<div>
<ServerContent data={data} />
<ClientInteractive />
</div>
);
}
// Client Component는 Server Component의 자식으로 사용 가능
// 하지만 Server Component는 Client Component의 자식으로 사용 불가
- Server Component는 Client Component를 import하고 사용할 수 있습니다.
- 반대로 Client Component는 Server Component를 직접 import할 수 없습니다 (props로만 전달 가능).
4. 데이터 패칭 패턴
async function ProductPage({ params }: { params: { id: string } }) {
const product = await fetch(`https://api.example.com/products/${params.id}`, {
cache: "no-store", // 또는 "force-cache", { next: { revalidate: 60 } }
}).then((res) => res.json());
return (
<div>
<h1>{product.name}</h1>
<ProductDetails product={product} />
</div>
);
}
- Server Component에서는
fetch를 직접 사용하고, Next.js가 자동으로 중복 요청을 제거합니다.
5. 실무 팁
- 기본은 Server Component: 필요한 경우에만 Client Component로 전환
- 경계 명확히: Server/Client 경계를 명확히 나누고, 불필요한
"use client"지시어 피하기 - 스트리밍:
Suspense와 함께 사용하여 점진적 렌더링 - 에러 처리:
error.tsx로 Server Component 에러도 처리 가능
React Server Components는 "서버에서 할 수 있는 건 서버에서 하자"는 철학을 따릅니다.
클라이언트 번들을 줄이고, 초기 로딩 성능을 개선하는 강력한 도구입니다.