Server Component와 Client Component 차이

2025. 7. 25. 09:54·Next.js

컴포넌트?

데이터(props)를 인자로 받아서, jsx를 리턴하는 자바스크립트 함수를 컴포넌트라고 한다.

1. 실행 환경

서버 컴포넌트
서버에서 렌더링되며, 클라이언트(브라우저)로 전송되는 HTML 또는 React Server Component Payload(RSC Payload) 형태로 제공됩니다.

  • 클라이언트 측 JavaScript 번들 크기를 줄여 성능을 최적화합니다.
  • 기본적으로 Next.js 14의 모든 컴포넌트는 서버 컴포넌트로 간주됩니다.

클라이언트 컴포넌트

  • 클라이언트(브라우저)에서 렌더링되며, 서버에서 사전 렌더링된 후 클라이언트에서 "하이드레이션(hydration)" 과정을 거쳐 인터랙티브해집니다.
  • 'use client' 지시어를 파일 상단에 추가하여 정의합니다.

 

2. 주요 특징

서버 컴포넌트

  • 데이터 페칭: 서버에서 데이터베이스나 API에 직접 접근 가능. 클라이언트 요청 수를 줄이고, API 키와 같은 민감한 데이터를 안전하게 처리합니다.
  • 성능: 서버에서 HTML을 생성해 초기 로드 속도(First Contentful Paint, FCP)를 개선하고, 클라이언트로 전송되는 JavaScript 양을 최소화합니다.
  • 캐싱: 서버에서 렌더링된 결과를 캐싱하여 성능과 비용을 최적화할 수 있습니다.
  • 제한사항: React 훅(useState, useEffect)이나 이벤트 핸들러(onClick)를 사용할 수 없으며, 브라우저 API(예: localStorage)에 접근 불가.

클라이언트 컴포넌트

  • 인터랙티비티: React 훅(useState, useEffect)과 이벤트 핸들러를 사용하여 사용자 인터랙션을 처리합니다.
  • 브라우저 API: localStorage, geolocation 같은 브라우저 API에 접근 가능.
  • 제한사항: 클라이언트로 전송되는 JavaScript 번들 크기가 커질 수 있으며, 서버에서 직접 데이터 페칭이 불가능하므로 Server Actions나 API 호출이 필요.

 

3. 사용 사례

서버 컴포넌트

  • 정적 콘텐츠나 데이터 페칭이 필요한 컴포넌트(예: 블로그 포스트, 제품 목록).
  • SEO가 중요한 페이지(검색 엔진 봇이 렌더링된 HTML을 바로 인덱싱 가능).
  • 민감한 데이터를 서버에서 처리해야 하는 경우(예: API 키, 데이터베이스 쿼리).
  • 인터렉션이 없는 UI 적합

클라이언트 컴포넌트

  • 사용자 입력(폼, 버튼 클릭)이나 동적 UI(모달, 드롭다운)를 처리하는 경우.
  • 브라우저 API를 사용하는 기능(예: 로컬 스토리지, geolocation).

 

4. 컴포넌트 간 상호작용

  • 서버 컴포넌트는 클라이언트 컴포넌트를 자식으로 포함할 수 있다.
  • 클라이언트 컴포넌트는 서버컴포넌트를 직접 import 해서 사용할 수 없고, 서버 컴포넌트를 props나 자식으로 받아서 사용 할 수있다.

 

5. 데이터 페칭 방식

서버 컴포넌트

  • fetch나 React의 cache 함수를 사용해 서버에서 데이터를 가져옵니다.
  • 캐싱과 성능 최적화가 용이하며, 클라이언트 요청을 줄입니다.

클라이언트 컴포넌트

  • Server Actions를 사용하거나, SWR 같은 라이브러리로 클라이언트에서 데이터를 페칭합니다.
  • 사용자 인터랙션(예: "장바구니에 추가" 버튼 클릭)에 따라 데이터를 업데이트할 때 유용.

 

6. 렌더링 흐름

서버 컴포넌트

  • 서버에서 렌더링된 HTML이 클라이언트로 전송되어 즉시 표시.
  • RSC Payload를 통해 클라이언트와 서버 간 트리를 조정.

클라이언트 컴포넌트

  • 서버에서 사전 렌더링된 HTML이 클라이언트로 전송된 후, JavaScript 번들을 다운로드하고 하이드레이션 과정을 거쳐 인터랙티브해짐.

 

7. 장단점 요약

특성 서버컴포넌트 클라이언트 컴포넌트
렌더링 위치 서버 클라이언트 (사전 렌더링 후 하이드레이션)
React 훅 사용 불가 가능
브라우저 API 불가 가능
데이터 페칭 서버에서 직접 가능 Server Actions 또는 API 호출 필요
성능 적은 JavaScript, 빠른 초기 로드 JavaScript 번들 크기 증가 가능
보안 민감 데이터 처리 적합 클라이언트로 노출 가능성 주의
사용 사례 정적 UI, SEO, 데이터 페칭 인터랙티브 UI, 사용자 이벤트 처리

'Next.js' 카테고리의 다른 글

Next.js App Router의 실제 사용 경험과 한계점  (0) 2025.12.30
Full Route Cache를 활용한 성능 최적화  (2) 2025.08.06
Next 스트리밍 with Suspense  (5) 2025.07.24
persistQueryClient를 활용해 초기렌더링 개선하기  (3) 2025.07.08
Next.js with CSS-in-JS  (0) 2024.12.26
'Next.js' 카테고리의 다른 글
  • Next.js App Router의 실제 사용 경험과 한계점
  • Full Route Cache를 활용한 성능 최적화
  • Next 스트리밍 with Suspense
  • persistQueryClient를 활용해 초기렌더링 개선하기
ssund
ssund
  • ssund
    ssund의 기술블로그
    ssund
  • 전체
    오늘
    어제
    • TECH (82)
      • Next.js (8)
      • React (25)
      • Vite (1)
      • javascript (17)
      • CSS (6)
      • CS (10)
      • AWS (0)
      • Jest (1)
      • CI|CD (0)
      • 알고리즘 (8)
      • Tools (1)
      • Tips (5)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      커머스프로젝트
      redux
      서버컴포넌트
      react state management
      React
      global-style
      reat-head
      타입스크립트
      웹브라우저구성
      git배포
      함수와 메서드차이
      app-router
      theme-provider
      배열요소순서
      call signatures
      JavaScript
      TypeScript
      styled-components
      Array.sort()
      nextjs
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    ssund
    Server Component와 Client Component 차이
    상단으로

    티스토리툴바