Web

[WEB] 하이드레이션(Hydration): 서버와 클라이언트의 환상적인 협업 🌊

xeunnie 2025. 1. 5. 01:00
728x90
반응형

하이드레이션(Hydration) 톺아보기! 🌊

웹 개발을 하다 보면 하이드레이션(Hydration)이라는 개념을 마주칠 때가 있을 거예요. 단어부터 어딘가 ‘촉촉’한 느낌이 들지만, 사실 하이드레이션은 서버와 클라이언트가 힘을 합쳐 빠르고 매끄러운 사용자 경험을 제공하기 위한 기술입니다.

 

오늘은 이 하이드레이션이 무엇인지, 어떻게 작동하는지, 그리고 왜 중요한지를 살펴보면서 웹 개발의 세계로 한 발짝 더 들어가 봅시다!


🌟 하이드레이션이란?

하이드레이션이란, 서버에서 렌더링정적 HTML에 클라이언트에서 JavaScript를 결합인터랙티브한 애플리케이션으로 변환하는 과정을 말해요.

1. 서버에서 HTML 렌더링

서버는 사용자가 요청한 페이지를 HTML 형태로 제공합니다. 이 HTML은 초기 화면을 보여주는 데 사용되죠.

2. 클라이언트에서 JavaScript로 보강

브라우저가 서버에서 받은 HTML을 표시한 뒤, JavaScript가 로드되어 이 HTML을 인터랙티브하게 만듭니다. 이 ‘보강’ 과정이 바로 하이드레이션입니다.


🤔 하이드레이션은 왜 필요할까?

초기 로딩 속도 향상

서버에서 미리 렌더링된 HTML을 제공하면, 사용자가 페이지를 즉시 볼 수 있습니다. JavaScript가 로드되기 전이라도 콘텐츠는 이미 브라우저에 표시되죠. 이를 SSR(Server-Side Rendering)이라고 해요.

 

SEO와 접근성

검색 엔진은 JavaScript를 실행하지 않더라도 서버에서 제공된 HTML을 읽을 수 있습니다. 이는 검색 엔진 최적화(SEO)와 콘텐츠 접근성을 높이는 데 매우 유리합니다.

 

최종 목표: 사용자 경험

하이드레이션은 SSR과 CSR(Client-Side Rendering)의 장점을 결합합니다. 즉, 빠른 초기 렌더링리액티브한 사용자 경험을 동시에 제공합니다.


⚙️ 하이드레이션의 작동 원리

하이드레이션은 React, Vue, Svelte 같은 현대적인 프레임워크에서 많이 사용되며, 다음 과정을 거칩니다:

1. 서버에서 HTML 생성

React를 예로 들면, ReactDOMServer.renderToString()을 사용해 HTML을 생성합니다.

import ReactDOMServer from "react-dom/server";
import App from "./App";

const html = ReactDOMServer.renderToString(<App />);

2. 브라우저가 HTML 렌더링

브라우저는 서버에서 받은 HTML을 화면에 렌더링합니다. 이 단계에서는 아직 JavaScript가 동작하지 않아요.

 

3. JavaScript 로드 및 하이드레이션

브라우저가 JavaScript를 다운로드하고 실행하면, React는 서버에서 생성된 HTML과 클라이언트에서 렌더링할 내용을 비교합니다. 이를 통해 UI를 보강하고 이벤트 핸들러를 연결하죠.

import { hydrateRoot } from "react-dom/client";
import App from "./App";

hydrateRoot(document.getElementById("root"), <App />);

📑 하이드레이션의 한계와 도전 과제

하이드레이션이 항상 완벽할 수는 없습니다. 개발자가 알아야 할 몇 가지 한계문제를 살펴볼까요?

 

1. HTML과 JavaScript의 불일치

서버에서 생성된 HTML과 클라이언트에서 렌더링된 HTML이 일치하지 않으면 경고가 발생합니다.

Warning: Text content did not match. Server: "Hello" Client: "Hi" (예시)

 

이 문제를 해결하려면, 서버와 클라이언트가 동일한 데이터를 사용해 렌더링해야 합니다.

 

2. JavaScript 로드 시간

초기 화면은 빠르게 표시되지만, JavaScript가 로드되기 전까지는 인터랙션이 불가능합니다. 이를 “인터랙션 갭”이라고 하죠.

 

3. 리소스 사용

하이드레이션은 서버에서 HTML을 생성하고 클라이언트에서 이를 보강하는 두 단계를 필요로 하므로, 리소스를 더 많이 소비할 수 있습니다.


🗃️ 실전에서의 하이드레이션 예시

React에서의 하이드레이션

React에서 하이드레이션은 서버에서 생성된 HTML을 클라이언트에서 “활성화”하는 데 사용됩니다.

 

서버 코드

import ReactDOMServer from "react-dom/server";
import express from "express";
import App from "./App";

const app = express();

app.get("*", (req, res) => {
  const html = ReactDOMServer.renderToString(<App />);
  res.send(`<!DOCTYPE html>
    <html>
      <head><title>React Hydration</title></head>
      <body>
        <div id="root">${html}</div>
        <script src="/bundle.js"></script>
      </body>
    </html>`);
});

app.listen(3000, () => console.log("Server running on port 3000"));

 

클라이언트 코드

import { hydrateRoot } from "react-dom/client";
import App from "./App";

hydrateRoot(document.getElementById("root"), <App />);

🗄️ 하이드레이션 vs. CSR vs. SSR

특징 하이드레이션 CSR SSR
초기 로딩 속도 빠름 느림 빠름
인터랙션 가능 시점 JavaScript 로드 후 JavaScript 로드 후 HTML 렌더링 이후
SEO 좋음 나쁨 좋음
리소스 사용량 서버 + 클라이언트 리소스 모두 사용 클라이언트 중심 서버 중심

🚀 하이드레이션을 넘어: 진화하는 기술

Partial Hydration

  • 페이지의 일부만 하이드레이션
  • 초기 로드 속도와 성능을 더욱 개선

Streaming Hydration

  • 서버에서 HTML을 스트리밍하면서 동시에 클라이언트 하이드레이션을 수행

React Server Components

  • 서버에서만 렌더링 가능한 컴포넌트를 도입해 클라이언트 부담 최소화

🌊 마무리하며

하이드레이션은 SSR의 효율성과 CSR의 유연성을 동시에 가져가기 위한 강력한 도구입니다. 브라우저에 초기 화면을 빠르게 표시하고, 이후 JavaScript로 보강하여 인터랙티브한 웹 애플리케이션을 구현할 수 있죠.

 

🌷전설의 개발자가 되어봅시당!🌷

728x90
반응형