웹 페이지 렌더링 전략: 정적 생성 vs 서버 사이드 렌더링

SB신범
3분 읽기
조회수 로딩 중...

웹 페이지 렌더링 전략: 정적 생성 vs 서버 사이드 렌더링

소개

현대 웹 개발에서 페이지 렌더링 방식은 애플리케이션의 성능, SEO, 사용자 경험에 직접적인 영향을 미칩니다. Next.js는 정적 생성(Static Generation)서버 사이드 렌더링(Server-Side Rendering) 을 모두 지원하여 개발자에게 유연성을 제공합니다.

정적 생성(Static Generation)의 심층 분석

작동 원리

정적 생성은 빌드 타임에 HTML을 생성하는 방식입니다. 빌드 과정에서 모든 페이지가 미리 렌더링되어 정적 HTML 파일로 저장됩니다.

jsx
1// 기본 정적 생성 2export default function StaticPage() { 3 return <div>이 페이지는 빌드 시점에 생성됩니다</div>; 4} 5 6// 데이터를 포함한 정적 생성 7export async function getStaticProps() { 8 const posts = await fetchBlogPosts(); 9 return { 10 props: { posts }, 11 // 10초마다 페이지 재생성 (ISR) 12 revalidate: 10 13 }; 14}

증분 정적 재생성(ISR)

Next.js의 혁신적인 기능인 ISR(Incremental Static Regeneration)은 전체 사이트를 다시 빌드하지 않고도 페이지를 정적으로 재생성할 수 있게 해줍니다.

jsx
1// ISR 구현 예제 2export async function getStaticProps() { 3 const product = await fetchProduct(productId); 4 return { 5 props: { product }, 6 revalidate: 60 // 60초마다 재검증 7 }; 8}

성능 데이터

메트릭정적 생성서버 사이드 렌더링클라이언트 사이드 렌더링
초기 로드 시간~0.1s~0.5s~1.0s
TTFB (Time to First Byte)최소중간최소
FCP (First Contentful Paint)빠름중간느림
SEO 효과최고좋음제한적
서버 부하최소 (빌드 시만)높음 (매 요청마다)낮음

서버 사이드 렌더링(SSR)의 심층 분석

작동 원리

서버 사이드 렌더링은 요청 시점에 HTML을 생성합니다. 사용자가 페이지를 요청할 때마다 서버에서 페이지를 렌더링하고 완성된 HTML을 전송합니다.

jsx
1// 서버 사이드 렌더링 구현 2export async function getServerSideProps(context) { 3 // 요청 파라미터, 쿠키, 헤더 등에 접근 가능 4 const { req, query } = context; 5 const userAgent = req.headers['user-agent']; 6 const userId = getUserIdFromCookie(req); 7 8 const userData = await fetchUserData(userId); 9 return { 10 props: { 11 userData, 12 deviceType: detectDeviceType(userAgent) 13 } 14 }; 15}

동적 라우팅과 국제화

SSR은 동적 라우팅과 국제화(i18n) 구현에 특히 유용합니다:

jsx
1// 동적 라우팅의 서버 사이드 렌더링 2export async function getServerSideProps({ params, locale }) { 3 const { id } = params; 4 const product = await fetchProductInLanguage(id, locale); 5 6 return { 7 props: { 8 product, 9 locale 10 } 11 }; 12}

하이브리드 접근법의 실제 사례

이커머스 플랫폼 사례

  • 정적 생성: 제품 카탈로그, 카테고리 페이지, 마케팅 랜딩 페이지
  • ISR: 제품 상세 페이지 (재고 및 가격 업데이트를 위해 주기적 재생성)
  • SSR: 사용자 장바구니, 체크아웃 페이지, 개인화된 추천
jsx
1// 제품 상세 페이지 (ISR) 2export async function getStaticProps({ params }) { 3 const product = await fetchProduct(params.id); 4 return { 5 props: { product }, 6 revalidate: 300 // 5분마다 재검증 7 }; 8} 9 10export async function getStaticPaths() { 11 const popularProducts = await fetchPopularProducts(); 12 13 return { 14 paths: popularProducts.map(product => ({ 15 params: { id: product.id } 16 })), 17 fallback: 'blocking' // 인기 상품은 미리 빌드, 나머지는 첫 요청 시 생성 18 }; 19}

콘텐츠 중심 사이트 사례

  • 정적 생성: 블로그 포스트, 문서, FAQ
  • ISR: 댓글이 있는 블로그 포스트 (댓글 업데이트를 위해)
  • SSR: 검색 결과 페이지, 개인화된 대시보드

성능 최적화 팁

정적 생성 최적화

  1. 선택적 정적 경로 생성: 인기 있는 페이지만 빌드 시 생성하고 나머지는 필요할 때 생성
  2. 효율적인 데이터 페칭: getStaticProps 내에서 필요한 데이터만 가져오기
  3. 이미지 최적화: Next.js Image 컴포넌트 사용하여 이미지 최적화

서버 사이드 렌더링 최적화

  1. 서버 캐싱: 자주 변경되지 않는 데이터는 서버 측에서 캐싱
  2. 스트리밍 SSR: React 18의 Suspense와 함께 사용하여 페이지 일부 먼저 전송
  3. 엣지 컴퓨팅: Vercel Edge Functions나 Cloudflare Workers를 활용한 SSR

결론

렌더링 전략 선택은 프로젝트의 요구사항, 대상 사용자, 콘텐츠 유형에 따라 달라집니다. Next.js의 유연성을 활용하여 단일 애플리케이션 내에서도 페이지별로 최적의 렌더링 방식을 선택할 수 있습니다.

  • 정적 생성: 콘텐츠가 자주 변경되지 않고 성능이 중요한 경우
  • ISR: 콘텐츠가 주기적으로 업데이트되지만 모든 요청마다 재생성할 필요는 없는 경우
  • 서버 사이드 렌더링: 실시간 데이터나 요청별 맞춤형 콘텐츠가 필요한 경우

각 프로젝트의 특성을 고려하여 적절한 전략을 선택하고, 필요에 따라 혼합 사용하는 것이 최상의 결과를 가져올 수 있습니다.