0. 들어가며
React는 2013년 등장 이후, 프론트엔드 개발 방식에 큰 변화를 가져왔습니다.
하지만 사용자 경험과 성능을 동시에 챙기기란 여전히 쉽지 않았습니다.
**React Server Components(이하 RSC)**는 바로 이 문제를 해결하기 위해 등장했습니다.
서버에서 렌더링되는 컴포넌트를 도입함으로써, 클라이언트의 부담은 줄이고 성능은 극대화할 수 있도록 돕는 혁신적인 기능입니다.
❓1. RSC란 무엇인가?
RSC는 서버에서 실행되는 React 컴포넌트입니다.
클라이언트로 전송되지 않고, 서버에서만 렌더링되어 HTML로 변환된 후 브라우저로 전달됩니다.
- 기존 CSR(Component Side Rendering): 모든 코드를 브라우저로 전송 → 번들 사이즈 ↑
- 기존 SSR(Server Side Rendering): HTML은 서버에서 제공하지만, hydration을 위한 JS 번들 필요
- RSC: 서버에서만 실행되므로 JS 번들 X, 클라이언트 부하 ↓
쉽게 말해:
"React 컴포넌트를 클라이언트가 아니라 서버에서 실행하고, HTML만 넘겨주는 구조"
🧩 2. 클라이언트 컴포넌트와의 차이점
항목 | Server Component | Client Component |
실행 위치 | 서버 | 브라우저 |
번들 전송 여부 | ❌ JS 번들 없음 | ✅ JS 번들 전송 |
상태/이벤트 처리 | ❌ 불가능 | ✅ 가능 |
사용 목적 | 데이터 패칭, 렌더링 최적화 | 상호작용, UI 이벤트 처리 |
🔗 서버 컴포넌트는 오직 렌더링에만 집중하고, 상호작용은 클라이언트 컴포넌트에서 처리합니다.
📦 3. 언제, 왜 RSC를 도입해야 할까?
✅ 장점
- 성능 향상 – JS 번들 크기 감소
- 보안성 증가 – 민감한 데이터는 서버에서만 처리 가능
- 더 빠른 TTFB – 서버에서 HTML을 바로 렌더링
- 캐싱 최적화 – 서버 단에서 캐싱 처리 용이
⚠️ 도입 전 고려할 점
- 서버 환경이 반드시 필요함 (Vercel, Node 기반 서버 등)
- 클라이언트-서버 간 역할 분리를 잘 설계해야 함
- 학습 곡선이 있음 (새로운 렌더링 전략, useServerInsertedHTML 등)
⚙️ 4. 예시 코드: Server + Client 컴포넌트
// app/components/ServerOnlyComponent.tsx
// server component
import db from '@/lib/db';
export default async function ServerOnlyComponent() {
const posts = await db.post.findMany();
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
// app/components/ClientComponent.tsx
'use client';
export default function ClientComponent() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>Clicked {count} times</button>;
}
🚨 use client 지시어를 사용해야 클라이언트 컴포넌트로 처리됩니다.
반대로 server component는 기본적으로 서버에서 렌더링됩니다.
🔮 5. RSC 의 미래
React 공식은 RSC를 통해 "서버 퍼스트(Server-first)" 아키텍처로의 전환을 예고하고 있습니다.
특히 Next.js 13/14 App Router는 RSC를 완전히 지원하며, 앞으로의 React 생태계는 RSC 중심으로 재편될 가능성이 큽니다.
기존 CSR 중심 개발자는 점진적으로 서버 중심 렌더링으로 옮겨가는 것이 바람직합니다.
✅ 6. 마무리하며
React Server Components는 아직 발전 중이지만, 분명히 미래의 웹 아키텍처에 중심 역할을 할 기능입니다.
클라이언트와 서버를 적절히 나누어 효율적인 웹 앱을 만들고 싶다면, 지금부터 RSC에 익숙해지는 것이 큰 도움이 될 것입니다.
📚 참고 링크
'React' 카테고리의 다른 글
🐻 React + Zustand로 간단하고 가벼운 전역 상태 관리하기 (0) | 2025.04.12 |
---|---|
🚀 React 19 프리뷰: useFormState, useActionState 등 새 훅 분석 (0) | 2025.04.12 |
[JavaScript]🔍화살표 함수(Arrow Function) vs function 키워드 차이점 (0) | 2025.04.11 |
[React]🔑배열의 index를 key로 사용하면 안되는 이유 (0) | 2025.04.11 |
[JavaScript]💡3. 비동기 처리의 핵심, Promise와 async/await (0) | 2025.04.02 |