우리는 지금까지 React를 사용하여 동적인 사용자 인터페이스를 만드는 방법에 집중해왔습니다.
기본적으로 React 애플리케이션은 사용자의 브라우저에서 JavaScript를 실행하여 화면을 그리는
클라이언트 사이드 렌더링(Client-Side Rendering, CSR)
방식으로 동작하는 경우가 많습니다.
CSR은 풍부한 상호작용을 제공하지만, 초기 로딩 시 사용자가 빈 화면을 보게 되거나 검색 엔진 최적화(SEO)에 어려움을 겪는 단점이 있을 수 있습니다.
이러한 단점을 보완하기 위해 등장한 것이 바로 *서버 사이드 렌더링(Server-Side Rendering, SSR)*과 *정적 사이트 생성(Static Site Generation, SSG)*입니다.
오늘은 이 다양한 렌더링 방식들이 각각 어떻게 동작하고 어떤 특징을 가지는지, 그리고 이들과 밀접하게 관련된
TTFP(Time To First Paint)와 FCP(First Contentful Paint)는 사용자가 첫 화면을 보기까지 걸리는 시간을 측정하는 지표입니다.
SSR은 서버에서 완성된 HTML을 보내주므로 사용자가 첫 화면 콘텐츠를 보는 시점(First Contentful Paint, FCP)이 CSR보다 빠릅니다. 사용자가 느끼는 초기 로딩 성능이 좋습니다.
SEO
서버에서 완성된 HTML을 제공하므로 검색 엔진 크롤러가 페이지 콘텐츠를 쉽게 수집할 수 있어 SEO에 유리합니다.
서버 부하
각 사용자 요청마다 서버에서 페이지를 렌더링해야 하므로 CSR보다 서버 부하가 높습니다.
첫 바이트까지의 시간 (TTFB)
서버에서 HTML을 생성하는 시간이 필요하므로, 서버로부터 첫 번째 데이터 바이트를 받는 시간(Time To First Byte, TTFB)은 CSR보다 느릴 수 있습니다.
SSG는 콘텐츠가 자주 변경되지 않고, 빌드 시점에 모든 페이지를 생성할 수 있는 경우에 매우 효과적입니다.
블로그 게시물
문서 사이트 (API 문서, 튜토리얼 등)
마케팅 페이지, 랜딩 페이지
포트폴리오 사이트
Q: "SSR과 SSG의 차이점은 무엇이고, 각각 언제 사용하는 것이 좋을까요?"
A: "SSR은 요청 시 서버에서 HTML을 생성하고, SSG는 빌드 시 HTML을 미리 생성합니다. SSR은 사용자별 동적 콘텐츠나 매우 자주 바뀌는 데이터에 적합하고, SSG는 정적 콘텐츠 위주의 사이트에서 최고의 성능을 제공합니다."
Hydration 과정에서 React는 서버에서 렌더링된 HTML 구조와 클라이언트에서 렌더링하려는 가상 DOM 구조가
정확히 일치
할 것으로 기대합니다.
만약 두 구조 사이에 불일치가 발생하면, React는 Hydration을 제대로 수행할 수 없다는 경고(Hydration Mismatch Error)를 표시하고, 경우에 따라 클라이언트 측에서 전체를 다시 렌더링하게 되어 SSR/SSG의 이점을 잃을 수도 있습니다.
이런 불일치는 주로 다음과 같은 경우에 발생할 수 있습니다.
서버 환경과 클라이언트 환경 간의 차이 (예: window 객체 접근, 타임존 차이 등)
잘못된 HTML 중첩 구조 (예: p 태그 안에 div 넣기)
렌더링 시점에 따라 내용이 달라지는 로직 (예: Math.random(), 현재 시간 표시 - 서버 렌더링 시점과 클라이언트 Hydration 시점이 다름)
이런 오류를 피하려면 서버와 클라이언트에서 렌더링 결과가 일관되도록 코드를 작성하는 것이 중요합니다. 필요한 경우 useEffect 등을 사용하여 클라이언트에서만 실행되어야 하는 로직을 분리해야 합니다.
부분 Hydration 개념을 기반으로, 웹 페이지를 정적인 HTML '바다' 위에 떠 있는 여러 개의 상호작용 가능한 '섬(Island)'들로 구성하는 아키텍처 패턴입니다.
각 '섬'은 독립적인 위젯 또는 컴포넌트이며, 자체적으로 스크립트를 로드하고 Hydration을 수행합니다.
오늘은 React 애플리케이션을 사용자에게 보여주는 다양한 렌더링 방식에 대해 깊이 알아보았습니다.
CSR
은 클라이언트에서 모든 것을 처리하며 풍부한 상호작용에 강점이 있지만, 초기 로딩과 SEO에 약점이 있을 수 있습니다.
SSR
은 서버에서 HTML을 미리 렌더링하여 초기 로딩 속도와 SEO를 개선하지만, 서버 부하가 증가할 수 있습니다.
스트리밍 SSR
은 TTFB를 개선하는 진화된 형태입니다.
SSG
는 빌드 시점에 정적 HTML을 생성하여 최고의 성능과 안정성을 제공하지만, 동적인 데이터 처리에는 제약이 따릅니다.
Hydration
은 SSR/SSG로 생성된 정적 HTML 위에 JavaScript(React)를 적용하여 상호작용 가능한 앱으로 만드는 필수 과정입니다.
부분 Hydration
과
아일랜드 아키텍처
는 필요한 부분만 JavaScript를 로드하고 실행하여 성능을 더욱 최적화하려는 최신 접근 방식입니다.
어떤 렌더링 방식이 절대적으로 좋다고 말하기는 어렵습니다. 애플리케이션의 특징, 콘텐츠의 동적성, 성능 요구사항, SEO 중요도 등을 종합적으로 고려하여 가장 적합한 방식을 선택하거나 혼합하여 사용하는 것이 중요합니다.
Next.js와 같은 프레임워크는 이러한 다양한 렌더링 전략을 편리하게 사용하고 조합할 수 있도록 많은 기능을 제공하고 있습니다.
다음 시간에는 React와 함께 사용되는 다양한
자료구조
에 대해 알아보겠습니다.
배열, 연결 리스트, 트리 등 기본 자료구조들이 React의 내부 동작이나 컴포넌트 구현에 어떻게 활용되는지 살펴보며 기본기를 더욱 탄탄히 다져보겠습니다.