DRY STATE) + JS Bundle(Water) => Interactive App'use client'가 붙은 Client Component만 hydration 진행.서버쪽 HTML 렌더링과 브라우저 쪽 렌더링이 1픽셀이라도 다르면 Hydration Mismatch가 발생 함.
흔히 하는 실수 예시 코드:
/* ❌ [안티 패턴] Mismatch를 유발하는 전형적인 초보자의 실수 */
export default function TimeDisplay() {
// 🚨 실수 1: 시간 (Time)
// 서버가 HTML을 만든 시간(10:00:00)과,
// 인터넷 선을 타고 브라우저에 도착해 JS가 실행된 시간(10:00:01)은 영원히 다릅니다!
const time = new Date().toLocaleTimeString();
// 🚨 실수 2: 랜덤 값 (Random)
// 서버가 굴린 주사위 값(0.12)과 브라우저가 굴린 주사위 값(0.99)은 일치할 수 없습니다!
const randomId = Math.random();
return (
<div id={randomId.toString()}>
<h1>현재 시각</h1>
<p>{time}</p>
{/* 🚨 실수 3: 잘못된 HTML 구조 (Invalid Nesting) */}
<p>
{/* p태그(문단) 안에는 div태그(구역)가 들어갈 수 없습니다. (HTML 문법 위반) */}
{/* 브라우저가 이걸 몰래 고치려고 시도하다가 리액트에게 딱 걸려서 에러가 납니다. */}
<div>Description</div>
</p>
</div>
);
}
해결방안:
useEffect)로 데이터를 넣는 가장 안전한 방식.