본문 바로가기
React

React에서 SSR(Server-Side Rendering) 개념 이해하기

by 굿센스굿 2024. 12. 13.
반응형

 

오늘날 웹 개발에서 사용자 경험(UX)과 성능은 매우 중요한 요소입니다. React는 클라이언트 측 렌더링(Client-Side Rendering, CSR)을 기본으로 사용하지만, 서버 측 렌더링(Server-Side Rendering, SSR)을 통해 초기 로딩 속도를 향상시키고 SEO(검색 엔진 최적화) 효과를 높일 수 있습니다. 이번 글에서는 React에서 SSR의 개념과 작동 방식, 장단점, 그리고 실무에서의 활용 방법을 깊이 있게 다루어 보겠습니다.

1. 서버 측 렌더링(SSR)이란 무엇인가?

SSR(Server-Side Rendering)이란 React 애플리케이션의 초기 HTML을 서버에서 생성하고, 클라이언트에 전달하는 방식입니다. 이는 CSR(Client-Side Rendering)과 대비되며, CSR에서는 브라우저가 빈 HTML 파일을 받아 React 라이브러리와 함께 JavaScript를 로드하여 화면을 렌더링합니다.

CSR과 SSR의 차이점

특징CSRSSR

초기 로딩 속도 느림 빠름
SEO 친화성 낮음 높음
서버 부하 적음 많음
동적 상호작용 뛰어남 비교적 구현 복잡

SSR에서는 클라이언트에 이미 렌더링된 HTML 파일을 제공하므로, 초기 로딩 속도가 빠르고 검색 엔진이 HTML 콘텐츠를 바로 읽을 수 있어 SEO에 유리합니다.

2. React에서 SSR의 작동 방식

React에서 SSR은 ReactDOMServer 라이브러리를 사용하여 구현됩니다. 이 라이브러리는 React 컴포넌트를 HTML 문자열로 변환할 수 있는 기능을 제공합니다. 일반적으로 다음과 같은 프로세스를 따릅니다:

  1. 요청 수신: 사용자가 웹페이지를 요청하면 서버는 요청을 처리합니다.
  2. React 컴포넌트 렌더링: 서버는 ReactDOMServer의 renderToString 또는 renderToPipeableStream 메서드를 사용하여 React 컴포넌트를 HTML 문자열로 렌더링합니다.
  3. HTML 반환: 렌더링된 HTML이 클라이언트에 전달됩니다.
  4. 하이드레이션(Hydration): 클라이언트 측에서 React가 초기 HTML과 연결되어 동적 기능을 활성화합니다.

간단한 예제

import React from 'react';
import ReactDOMServer from 'react-dom/server';
import express from 'express';
import App from './App';

const app = express();

app.get('*', (req, res) => {
  const html = ReactDOMServer.renderToString(<App />);
  res.send(`
    <!DOCTYPE html>
    <html>
      <head>
        <title>React SSR Example</title>
      </head>
      <body>
        <div id="root">${html}</div>
        <script src="/static/bundle.js"></script>
      </body>
    </html>
  `);
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

이 코드는 Express.js를 사용하여 React 컴포넌트를 서버에서 렌더링하고 클라이언트에 전달하는 간단한 SSR 구현 예제입니다.

3. SSR의 장점과 단점

장점

  1. 빠른 초기 로딩: HTML이 서버에서 미리 생성되므로 사용자가 콘텐츠를 더 빠르게 볼 수 있습니다.
  2. SEO 향상: 검색 엔진이 콘텐츠를 쉽게 크롤링할 수 있습니다.
  3. 공유 가능한 링크: 소셜 미디어에서 미리보기가 제대로 표시됩니다.

단점

  1. 서버 부하 증가: 요청마다 서버에서 렌더링을 수행하므로 트래픽이 많을 경우 서버 리소스 사용량이 늘어납니다.
  2. 복잡한 코드베이스: CSR과 SSR을 함께 구현하려면 코드가 복잡해질 수 있습니다.
  3. 동적 상호작용 처리: 브라우저에서 하이드레이션 과정이 필요하므로 클라이언트에서 약간의 딜레이가 발생할 수 있습니다.

4. SSR의 실제 활용

React 애플리케이션에서 SSR을 효과적으로 사용하려면 적합한 프레임워크와 도구를 사용하는 것이 좋습니다. 대표적인 예는 다음과 같습니다:

4.1 Next.js

Next.js는 React 기반의 인기 있는 프레임워크로, SSR과 SSG(Static Site Generation)를 손쉽게 구현할 수 있는 기능을 제공합니다.

기본 사용법

import React from 'react';

function Home({ data }) {
  return (
    <div>
      <h1>SSR Example</h1>
      <p>{data}</p>
    </div>
  );
}

export async function getServerSideProps() {
  const data = '서버에서 가져온 데이터';
  return { props: { data } };
}

export default Home;

4.2 Gatsby

Gatsby는 SSG에 중점을 둔 프레임워크지만, 일부 페이지에서 SSR을 지원하여 다양한 요구사항에 대응할 수 있습니다.

4.3 Express.js와 커스텀 SSR

앞서 언급한 Express.js를 사용한 SSR은 맞춤화가 가능하며, 특정 요구사항에 최적화된 SSR 솔루션을 구축할 수 있습니다.

5. SSR 최적화 전략

SSR을 활용할 때 성능과 효율성을 높이기 위한 몇 가지 전략을 소개합니다:

  1. 캐싱(Cache): HTML 결과를 캐싱하여 반복적인 렌더링을 줄입니다.
  2. 코드 스플리팅(Code Splitting): React.lazy와 같은 기능을 사용하여 초기 로딩 크기를 줄입니다.
  3. CDN 활용: 정적 자산을 CDN(Content Delivery Network)을 통해 제공하여 로딩 속도를 개선합니다.
  4. 동적 데이터 최소화: 서버에서 렌더링할 데이터 양을 줄여 서버 부하를 낮춥니다.

결론

React에서 SSR은 초기 로딩 속도를 개선하고 SEO를 강화할 수 있는 강력한 도구입니다. 그러나 구현의 복잡성과 서버 부하를 고려해야 하며, 애플리케이션의 요구사항에 맞는 접근 방식을 선택하는 것이 중요합니다. Next.js와 같은 프레임워크를 활용하면 SSR을 더 쉽게 구현할 수 있으니, 이를 적절히 활용해 성공적인 프로젝트를 만들어 보세요!

반응형