본문으로 건너뛰기

SSR과 Server Component

SSR과 Server Component는 둘 다 서버라는 단어가 들어가서 헷갈리기 쉽지만, 서로 다른 기준의 개념입니다.

  • SSR → HTML을 언제 생성하는가?
  • Server Component → React 컴포넌트를 어디서 실행하는가?

이 둘을 구분하는 것이 핵심입니다.

핵심 내용​

SSR​

SSR(Server-Side Rendering)은 사용자가 요청했을 때 서버에서 HTML을 생성하는 방식입니다.

사용자 요청
↓
서버에서 데이터 조회
↓
React 렌더링
↓
HTML 생성
↓
브라우저 전달

예를 들어 /profile을 요청하면 서버에서 사용자 정보를 가져온 뒤 다음과 같은 HTML을 만들어 보냅니다.

<h1>김서로</h1>
<p>Frontend Developer</p>

즉 SSR에서 중요한 것은 **"HTML을 언제 만드는가"**입니다.

요청할 때마다 HTML을 새로 만든다 → SSR


Server Component​

Server Component는 React 컴포넌트를 서버에서 실행하는 방식입니다.

async function Profile() {
const user = await getUser();

return <h1>{user.name}</h1>;
}

이 컴포넌트는 서버에서 실행되므로 서버의 DB나 API 등에 접근할 수 있습니다.

중요한 점은 Server Component가 곧 HTML이라는 것은 아닙니다.

서버에서 컴포넌트를 실행하면 먼저 React가 UI 결과를 계산합니다.

Server Component 실행
↓
React 결과 생성
↓
필요하면 HTML 생성

즉,

컴포넌트 실행과 HTML 생성은 별개의 과정입니다.


가장 헷갈리는 부분​

"서버에서 컴포넌트를 실행하면 HTML이 만들어지는 것 아닌가?"​

최종적으로 HTML이 만들어질 수 있지만, 둘은 같은 개념이 아닙니다.

예를 들어:

function Greeting() {
return <h1>Hello</h1>;
}

서버에서 Greeting()을 실행하면 React는 먼저

<h1>Hello</h1>

라는 UI 결과를 만듭니다.

그 다음 이 결과를 HTML로 만들어 브라우저에 보낼 수 있습니다.

컴포넌트 실행
↓
React 결과
↓
HTML 생성

따라서 **Server Component는 "컴포넌트를 서버에서 실행하는 것"이고, SSR은 "HTML을 서버에서 생성하는 것"**입니다.


Server Component와 SSR은 함께 사용할 수 있습니다​

둘은 서로 대체하는 관계가 아닙니다.

예를 들어 Next.js에서는:

사용자 요청
↓
Server Component 실행
↓
데이터 조회
↓
React 결과 생성
↓
초기 HTML 생성
↓
브라우저

처럼 동작할 수 있습니다.

즉,

Server Component
→ 어디서 실행할까?

SSR
→ HTML을 언제 만들까?

라는 서로 다른 질문에 답합니다.

그래서 Server Component + SSR도 가능합니다.

또한 Server Component는 SSG나 ISR과도 함께 사용할 수 있습니다.


Server Component와 Client Component​

Server Component와 비교하면 Client Component의 차이도 명확합니다.

Server Component​

서버에서 실행

DB 조회, 서버 데이터 접근 등에 적합합니다.

Client Component​

'use client';

브라우저에서 실행되며 useState, 이벤트 핸들러, 브라우저 API처럼 사용자와 상호작용하는 기능을 담당합니다.

예를 들어:

상품 페이지
│
├── 상품 정보
│ └── Server Component
│
└── 장바구니 버튼
└── Client Component

처럼 하나의 페이지에서 둘을 함께 사용할 수 있습니다.


Hydration은 어디에 등장하는가?​

SSR로 HTML을 먼저 받았다고 해서 바로 React의 상호작용이 가능한 것은 아닙니다.

서버
↓
HTML 생성
↓
브라우저 화면 표시
↓
JavaScript 로드
↓
Hydration
↓
이벤트 / 상태 연결

Hydration은 서버에서 만들어진 HTML에 클라이언트 React를 연결하는 과정입니다.

따라서:

  • SSR → HTML을 만들어줌
  • Hydration → 그 HTML에 React의 동작을 연결함

이라고 이해하면 됩니다.

Server Component 자체는 브라우저에서 다시 실행되는 것이 아니므로 Server Component 자체를 Hydration하는 것은 아닙니다.


헷갈리기 쉬운 점​

Server Component = SSR인가요?​

아닙니다.

Server Component → 실행 위치
SSR → HTML 생성 시점

입니다.

Client Component = CSR인가요?​

이것도 아닙니다.

Client Component → 브라우저에서 실행되는 컴포넌트
CSR → 브라우저에서 콘텐츠를 렌더링하는 방식

서로 다른 개념입니다.


실무에서 볼 점​

먼저 컴포넌트를 어디에서 실행할지 결정합니다.

DB / 서버 데이터
→ Server Component

상태 / 이벤트 / 브라우저 API
→ Client Component

그다음 HTML을 언제 생성할지 결정합니다.

거의 변하지 않음
→ SSG

주기적으로 변경됨
→ ISR

요청마다 최신 데이터 필요
→ SSR

예상 질문​

SSR과 Server Component를 한 문장으로 구분하면?​

SSR은 "HTML을 언제 서버에서 생성하는가"이고, Server Component는 "React 컴포넌트를 어디에서 실행하는가"입니다.

왜 Server Component와 SSR을 헷갈리면 안 되나요?​

Server Component는 서버에서 실행되어 React 결과를 만드는 개념이고, SSR은 그 결과를 바탕으로 HTML을 요청 시점에 생성하는 렌더링 전략이기 때문입니다.


한 번에 정리​

컴포넌트 실행 위치
├── Server Component → 서버
└── Client Component → 브라우저

HTML 생성 시점
├── SSG → 빌드 시
├── ISR → 재생성 시
└── SSR → 요청 시

가장 중요한 문장은 이것입니다.

Server Component는 "어디서 실행하는가", SSR은 "언제 HTML을 만드는가"를 의미한다.