
React Server Components(RSC)를 공부하면서
기존 React의 데이터 페칭 방식과 무엇이 다른지, 그리고 SSR과는 어떤 차이가 있는지 정리한 내용입니다.
기존 리액트에서는 데이터를 가져오는 방식이 주로 두 가지였습니다.
부모 컴포넌트가 필요한 모든 데이터를 한 번에 가져와 자식에게 props로 내려주는 방식입니다.
요청 횟수는 줄어들지만 컴포넌트 구조 변경 시 API도 함께 수정해야 하며,
불필요한 데이터까지 함께 요청하는 문제가 발생합니다.
특히 useEffect 기반 fetch는 렌더링 이후에 데이터 요청이 시작됩니다.
즉,
이처럼 요청이 순차적으로 이어지면서 네트워크 waterfall이 발생합니다.
결과적으로:
문제가 발생합니다.
React 18에서 도입된 개념으로,
서버에서 렌더링되고 서버에서 실행되는 컴포넌트입니다.
기존처럼 클라이언트에서 데이터를 요청하는 것이 아니라,
서버에서 컴포넌트를 실행하고 데이터를 가져온 뒤
그 결과만 클라이언트에 전달하는 방식입니다.
즉,
“데이터 fetching은 서버에서, 인터랙션은 클라이언트에서”
라는 역할 분리가 가능해졌습니다.
그 결과, 클라이언트가 서버에 여러 번 요청하지 않아도 되기 때문에
렌더링 속도가 개선됩니다.
서버 컴포넌트에서는 다음과 같은 리소스를 직접 사용할 수 있습니다.
이 로직은 브라우저로 전송되지 않기 때문에
보안 측면에서도 이점이 있습니다.
서버 컴포넌트 코드는 브라우저로 전달되지 않습니다.
즉, 초기 로딩 속도 개선 측면에서 큰 장점입니다.
React.lazy를 직접 사용하지 않아도 됨서버가 어떤 클라이언트 컴포넌트를 사용할지 미리 결정하므로
클라이언트는 필요한 번들만 다운로드합니다.
RSC 도입 이후 컴포넌트는 세 가지로 구분됩니다.
| 타입 | 실행 위치 | 특징 |
|---|---|---|
| 서버 컴포넌트 | 서버 | state, useEffect 사용 불가 / 서버 리소스 접근 가능 |
| 클라이언트 컴포넌트 | 브라우저 | state, 이벤트, 브라우저 API 사용 가능 |
| 공유 컴포넌트 | 서버 + 클라이언트 | 순수 UI 로직만 작성 가능 |
👉 관심사 분리가 명확해졌습니다.
Server-Side Rendering(SSR)은
클라이언트에서 실행될 React 코드를 서버에서 먼저 HTML로 렌더링하는 방식입니다.
대표적으로 Next.js 같은 프레임워크에서 사용됩니다.
즉, SSR의 핵심 목적은 초기 화면을 빠르게 보여주기 위한 것입니다.
| 구분 | RSC | SSR |
|---|---|---|
| 핵심 목표 | 번들 사이즈 감소 + 데이터 fetching 개선 | 초기 화면 빠르게 표시 |
| 해결 문제 | Client-Server Waterfall | 초기 빈 화면 문제 |
| 클라이언트 전송 코드 | ❌ 서버 컴포넌트 코드는 전송 안 됨 | ✅ 모든 컴포넌트 코드 전송 |
| 실행 구조 | 서버에서 실제로 컴포넌트 실행 | 서버에서 HTML만 먼저 생성 |
| 상태 유지 | 가능 | 새로운 요청 시 전체 HTML 재생성 필요 |
👉 서버는 “미리 보여주는 역할”
👉 서버는 “실제로 실행하는 역할”
✔ 두 기술은 서로 대체 관계라기보다는 보완 관계이므로 함께 사용할 수 있습니다.
즉,
SSR은 “빠르게 보여주기 위한 전략”
RSC는 “컴포넌트 아키텍처 개선”
React Server Components는 다음을 가능하게 합니다.
SSR은 초기 렌더링 성능을 개선하는 전략이며,
RSC는 컴포넌트 아키텍처를 개선하는 모델에 가까운 개념입니다.
React Server Components는
“데이터는 서버에서, 인터랙션은 클라이언트에서”
라는 방향으로 React 컴포넌트 구조를 재정의하는 시도이다.