subiniwiki

[SSR / CSR] 서버 사이드 / 클라이언트 사이드 렌더링

subindev 2025. 1. 15. 16:09

SSR(서버 사이드 렌더링)과 CSR(클라이언트 사이드 렌더링)은 웹 애플리케이션에서 페이지를 렌더링하는 방식의 두 가지 주요 방법입니다. 이 두 가지 방식은 웹 애플리케이션이 어떻게 화면을 그리는지, 그리고 이 과정에서 서버와 클라이언트가 각각 어떤 역할을 맡는지에 따라 다릅니다.

1. SSR (서버 사이드 렌더링, Server

-Side Rendering)

SSR은 웹 페이지의 HTML을 서버에서 생성한 후 클라이언트에 전달하는 방식입니다. 클라이언트가 요청을 보내면 서버는 해당 페이지에 필요한 데이터를 가져와 HTML을 생성하고, 완성된 HTML을 클라이언트에 전달합니다. 클라이언트는 받은 HTML을 그대로 표시합니다.

동작 방식

  • 요청서버: 클라이언트(브라우저)가 페이지를 요청하면 서버가 해당 페이지의 HTML을 렌더링하여 응답합니다.
  • 클라이언트: 클라이언트는 렌더링된 HTML을 받으며, 그 후 자바스크립트가 실행되면 추가적인 동작이 가능해집니다.

장점

  • 빠른 초기 렌더링: 서버에서 미리 렌더링된 HTML을 전달하므로 페이지가 빨리 로드됩니다. 특히 검색 엔진 최적화(SEO)가 중요한 경우 유리합니다.
  • SEO 최적화: 검색 엔진 크롤러가 서버에서 렌더링된 HTML을 그대로 가져오므로 SEO에 유리합니다.

단점

  • 서버 부하: 각 페이지 요청마다 서버에서 HTML을 생성하므로 서버에 부담이 큽니다.
  • 느린 상호작용: HTML이 준비된 후 자바스크립트가 실행되기 전까지는 상호작용이 제한적일 수 있습니다.

사용 예시

  • Next.js(React 기반의 SSR 프레임워크)
  • Nuxt.js(Vue.js 기반의 SSR 프레임워크)

2. CSR (클라이언트 사이드 렌더링, Client-Side Rendering)

CSR은 웹 페이지를 클라이언트(브라우저)에서 생성하는 방식입니다. 클라이언트가 처음 페이지를 요청하면 빈 HTML 파일만 반환되고, 그 후에 자바스크립트가 실행되어 데이터를 요청하고 화면을 구성합니다. 클라이언트에서 모든 렌더링과 로직을 처리합니다.

동작 방식

  • 요청서버: 클라이언트는 HTML 파일을 요청하고, 서버는 빈 HTML 파일을 반환합니다.
  • 클라이언트: 자바스크립트가 실행되어 API나 서버에서 데이터를 가져오고, 이 데이터를 바탕으로 화면을 렌더링합니다.

장점

  • 서버 부하 감소: 페이지 렌더링이 서버가 아닌 클라이언트에서 이루어지므로 서버에 부담이 적습니다.
  • 동적인 웹 애플리케이션: 클라이언트에서 페이지 전환이나 상태 관리를 유연하게 할 수 있어 SPA(Single Page Application)에 적합합니다.
  • 빠른 상호작용: 페이지를 한 번 로드한 후, 서버와의 통신 없이 빠르게 상호작용할 수 있습니다.

단점

  • 초기 로딩 시간: 자바스크립트가 다운로드되고 실행된 후에야 페이지가 렌더링되므로 초기 로딩 시간이 길어질 수 있습니다.
  • SEO 최적화 문제: 검색 엔진 크롤러가 자바스크립트로 동적으로 렌더링된 내용을 제대로 인식하지 못할 수 있습니다.

사용 예시

  • React (CSR 방식으로 많이 사용)
  • Vue.js
  • Angular

SSR vs CSR 비교

특성 SSR (서버 사이드 렌더링) CSR (클라이언트 사이드 렌더링)

렌더링 위치 서버에서 HTML을 렌더링 클라이언트(브라우저)에서 자바스크립트를 이용해 렌더링
SEO SEO에 유리 (검색 엔진이 HTML을 그대로 읽을 수 있음) SEO에 불리 (자바스크립트로 렌더링된 콘텐츠는 크롤링이 어려움)
초기 로딩 속도 빠른 초기 로딩 (HTML이 서버에서 렌더링되어 빠르게 로드) 느릴 수 있음 (자바스크립트가 로드되어야 페이지가 렌더링됨)
서버 부하 서버 부하가 큼 (매번 페이지 요청 시 서버에서 렌더링) 서버 부하가 적음 (클라이언트에서 렌더링)
상호작용 초기 렌더링 후 동적 상호작용을 추가로 처리해야 함 빠른 동적 상호작용 (SPA에 적합)
사용 예시 Thymeleaf, Next.js, Nuxt.js React, Vue.js, Angular