이번 시간에는 CSR SSR RSC를 프론트엔드 렌더링 패러다임 변화의 순서를 기준으로 설명해보는 시간을 갖도록 하겠습니다.
초창기 웹 렌더링 방식(1990년대~2000년대 초반)은 정적 웹 페이지
와 동적 서버 렌더링
에 의존 하였다. 화면에 어떠한 변화를 주려고 화면을 전환하면 그 때마다 서버로부터 새로운 HTML을 전송 받아서 다시 렌더링 해야 했다. 당연히 성능적인 문제도 많았고 사용자 경험 측면에서도 좋지 못했다.
그러다 자바스크립트를 통해서 서버(프론트엔드 프로그램)와 브라우저(클라이언트)가 비동기로 데이터를 주고 받을 수 있는 Ajax(Asynchronous JavaScript and XML)
가 등장하게 되면서 현대의 React
, Angular
, Vue.js
와 같은 SPA
프레임워크의 기초가 됨.
Ajax(Asynchronous JavaScript and XML)
의 등장으로 다양한 SPA
프레임워크와 더불어 CSR
이 함께 등장하게 되었다.SPA
는 처음 한번 페이지 전체를 로딩한 후 필요시 데이터만 바꿔 화면을 그려주는 것을 말한다.
CSR
은 최초에 하나의 페이지만 서버(프론트엔드 프로그램)로부터 불러와 렌더링하고 그 이후에는 모든 것을 클라이언트(브라우저) 사이드에서 렌더링하는 방식을 말한다. 서버에서 html
을 받고 js
를 사용하여 웹페이지를 동적으로 렌더링하는 방식이다.
CSR
방식에서는 SEO
문제가 발생한다. Next.js
와 같은 도구들은 이같은 문제를 SSR
로 해결하려고 하였다. 이 때, Hydration
이라는 기술로 CSR
도 가능하게하여 SSR+CSR
로 SPA
와 SEO
요구를 동시에 해결하였다.
하이드레이션은 서버에서 생성된 HTML이 사용자의 상호작용을 처리할 수 있도록 만드는 과정
React의 새로운 렌더링 패러다임으로, 컴포넌트 단위로 렌더링 방식을 SSR
또는 CSR
로 나눌 수 있는 기술이다. 서버에서 렌더링된 컴포넌트와 클라이언트 컴포넌트를 혼합하여 사용하게 된다.
1. 서버에서 렌더링된 컴포넌트
2. JavaScript 번들 크기 감소
3. 데이터 가져오기 최적화
4. 클라이언트 및 서버 컴포넌트의 조합
클라이언트 컴포넌트
는 상태 관리, 사용자 입력 처리 등 클라이언트 측 상호작용이 필요한 기능을 담당하고, 서버 컴포넌트
는 데이터 로드와 비상호작용성 UI 렌더링을 담당한다.5. React의 Streaming 지원
서버에서 렌더링된 결과를 스트리밍하여 클라이언트가 빠르게 초기 화면을 렌더링할 수 있도록 지원한다.
성능 개선
SEO 친화적
SEO(검색 엔진 최적화)
에 유리하다.코드 분리 및 재사용성 증가
서버 컴포넌트 (.server.js 파일)
// ServerComponent.server.js
export default async function ServerComponent() {
const data = await fetchDataFromAPI(); // 서버에서 데이터 가져오기
return <div>{data.title}</div>; // 서버에서 바로 렌더링
}
클라이언트에서 사용
import ServerComponent from './ServerComponent.server';
export default function App() {
return (
<div>
<h1>React Server Components Demo</h1>
<ServerComponent /> {/* 서버에서 렌더링된 결과를 가져옴 */}
</div>
);
}
RSC와 같은 내용들은 Next.js에만 한정된 것은 아니지만, 최적화 되어있는 것은 맞기에 빨리 Next.js도 공부해서 최신 트렌드를 몸소 느껴보고 싶다는 생각이 들었다.
아티클 잘 읽었습니다!!
초창기 웹 렌더링 방식부터 CSR과 SSR 그리고 서버 컴포넌트까지 가는 과정을 잘 설명해주셔서 이해하기 너무 좋았던 것 같아요. 특히 Hidration으로 SSR과 CSR을 같이 사용하면서 SEO에 대한 문제를 해결했다는 사실은 새롭게 알게 되었습니다! 확실히 저도 아직 사용을 안 해봤지만 이런 이점들을 보면 SSR을 한번 사용해보고 싶다는 생각이 듭니다.
그리고 서버 컴포넌트의 장점 중에서 저는 코드 분리, 즉 역할을 확실히 분리해 준다는 점이 정말 좋은 이점 같았습니다. view를 보여주고 상태를 관리하는 로직과 서버 데이터를 받는 컴포넌트(로직)를 분리하면 정말 좋지 않을까 생각합니다! 얼른 배워보고 싶네요! 수고하셨습니다 :)