35.서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR) 비교 및 구현, Next.js의 SSR과 SSG(정적 사이트 생성) 설정

2023년 10월 12일

1. 렌더링의 이해

웹 애플리케이션 개발에서 “렌더링”은 클라이언트 측에서 HTML, CSS, JavaScript를 사용하여 웹 페이지의 요소가 실제로 화면에 표시되는 과정을 의미합니다. 이러한 렌더링은 주로 두 가지 방법, 즉 서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR)을 통해 이루어집니다.

이 두 방법은 웹 애플리케이션의 로딩 속도, SEO 최적화, 사용자 경험 등에 큰 영향을 미치므로, 각 방법의 특징 및 장단점을 이해하고 적절하게 활용하는 것이 중요합니다.

2. 클라이언트 사이드 렌더링(CSR)

2.1 정의

클라이언트 사이드 렌더링(CSR)은 사용자가 웹 페이지를 요청하면, 서버가 HTML 페이지를 반환하는 대신 JavaScript 파일을 보내는 방식입니다. 그런 다음, 웹 브라우저가 JavaScript를 실행하여 클라이언트 측에서 페이지를 동적으로 생성합니다.

2.2 장점

  • 빠른 페이지 전환: 페이지가 클라이언트에서 동적으로 생성되기 때문에 사용자는 별도의 요청 없이도 페이지 간의 전환 속도가 빠릅니다.
  • 상태 관리: SPA(Single Page Application) 구조로 인해 사용자가 웹 페이지의 상태를 유지하기 용이합니다.
  • 개발자 경험: React, Vue 등 현대적인 프레임워크와 라이브러리의 활용으로 코드의 재사용성 및 모듈화가 용이합니다.

2.3 단점

  • 첫 로드 속도: 페이지를 처음 로드할 때 모든 JavaScript 파일을 다운로드하고 해석해야 하므로 초기 로딩 속도가 느릴 수 있습니다.
  • SEO: 검색 엔진이 클라이언트 측의 JavaScript를 완전히 해석하기 어려운 경우가 있어 SEO 최적화가 어려울 수 있습니다.
  • 브라우저 호환성: 다양한 브라우저 환경에서 JavaScript의 호환성 문제로 인해 나타나는 이슈가 발생할 수 있습니다.

3. 서버 사이드 렌더링(SSR)

3.1 정의

서버 사이드 렌더링(SSR)은 웹 페이지의 콘텐츠가 서버에서 미리 생성되어 클라이언트에게 전달되는 방식입니다. 사용자가 웹 페이지를 요청하면, 서버는 요청에 따라 HTML을 생성하여 클라이언트에 반환합니다.

3.2 장점

  • SEO 최적화: 검색 엔진이 페이지의 모든 콘텐츠를 쉽게 인식할 수 있도록 하여 검색 엔진 최적화에 유리합니다.
  • 빠른 첫 로드: 페이지의 콘텐츠가 서버에서 완전히 렌더링되어 클라이언트에 전달되므로 초기 로딩 속도가 빠릅니다.
  • 브라우저 호환성: HTML이 서버에서 생성되므로 모든 브라우저에서 호환성이 높습니다.

3.3 단점

  • 서버 부하: 모든 요청에 대해 서버가 HTML을 생성해야 하므로 서버에 부하가 걸릴 수 있습니다.
  • 페이지 간의 전환 느림: 페이지 전환 시마다 서버에 요청을 해야 하므로 빠른 전환이 어렵습니다.
  • 상태 관리 복잡성: 고객의 상태 관리를 위해 클라이언트 측에서 추가적인 작업이 필요할 수 있습니다.

4. SSR과 CSR 비교

특징 클라이언트 사이드 렌더링(CSR) 서버 사이드 렌더링(SSR)
초기 로딩 속도 느림 빠름
페이지 전환 속도 빠름 느림
SEO 불리 유리
서버 부하 낮음 높음

5. Next.js의 SSR과 SSG(정적 사이트 생성) 설정

5.1 Next.js 소개

Next.js는 React를 기반으로 하는 프레임워크로, 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG)을 모두 지원합니다. 이를 통해 개발자들은 다양한 유형의 웹 사이트 및 애플리케이션을 쉽게 구축할 수 있습니다.

5.2 Next.js에서 SSR 구현하기

Next.js에서 SSR을 구현하기 위해서는 `getServerSideProps`라는 함수를 사용해야 합니다. 이 함수는 페이지가 요청될 때마다 호출되어 데이터를 가져오고 해당 데이터를 기반으로 HTML을 렌더링합니다.


                import React from 'react';

                const Page = ({ data }) => {
                    return (
                        

{data.title}

{data.content}

); }; export async function getServerSideProps() { const res = await fetch('https://api.example.com/data'); const data = await res.json(); return { props: { data } }; } export default Page;

5.3 Next.js에서 SSG 구현하기

Next.js에서 정적 사이트 생성을 위해서는 `getStaticProps`와 `getStaticPaths`라는 함수를 사용해 데이터 가져오기 및 동적 경로 생성을 처리할 수 있습니다. 이 함수는 빌드 타임에 호출되어 HTML을 생성합니다.


                import React from 'react';

                const Page = ({ data }) => {
                    return (
                        

{data.title}

{data.content}

); }; export async function getStaticProps() { const res = await fetch('https://api.example.com/data'); const data = await res.json(); return { props: { data } }; } export default Page;

5.4 결론

SSR과 CSR은 각각의 장단점이 있으며, Next.js는 이러한 두 가지 방법론을 모두 지원하여 개발자가 프로젝트에 적합한 선택을 할 수 있도록 돕습니다.
비즈니스의 요구 사항과 사용자 경험을 모두 고려하여 적절한 방법을 선택하는 것이 중요합니다.
Next.js는 이러한 과정을 보다 용이하게 만들어 주며, 현대적 웹 애플리케이션 구축에 있어 강력한 도구로 자리 잡고 있습니다.