카테고리 없음

Hydration 오류

관리자 2025. 7. 26. 12:34
SMALL

● Hydration 오류는 Next.js와 React에서 발생하는 일반적인 문제입니다.       

  Hydration이란?

  Hydration은 서버에서 렌더링된 정적 HTML을 클라이언트에서 React 컴포넌트로
   "활성화"하는 과정입니다.

  1. 서버: HTML 생성 → 브라우저로 전송
  2. 브라우저: HTML 표시 (정적 상태)
  3. React: JavaScript 로드 후 HTML에 이벤트 연결 (Hydration)

  Hydration 오류가 발생하는 경우

  1. 시간/날짜 표시

  // ❌ 문제: 서버와 클라이언트 시간이 다름
  <div>{new Date().toLocaleString()}</div>
  // 서버: "2025-07-26 12:26:14"
  // 클라이언트: "2025-07-26 12:26:17" (3초 후)

  // ✅ 해결: useEffect 사용
  const [time, setTime] = useState('');
  useEffect(() => {
    setTime(new Date().toLocaleString());
  }, []);

  2. Math.random() 사용

  // ❌ 문제: 서버와 클라이언트의 랜덤값이 다름
  <div>{Math.random()}</div>

  // ✅ 해결: useEffect 사용
  const [random, setRandom] = useState(0);
  useEffect(() => {
    setRandom(Math.random());
  }, []);

  3. 브라우저 전용 API 사용

  // ❌ 문제: window는 서버에 없음
  <div>{window.innerWidth}px</div>

  // ✅ 해결: useEffect 사용
  const [width, setWidth] = useState(0);
  useEffect(() => {
    setWidth(window.innerWidth);
  }, []);

  4. 조건부 렌더링

  // ❌ 문제: localStorage는 서버에 없음
  {localStorage.getItem('user') && <UserMenu />}

  // ✅ 해결: useEffect 사용
  const [user, setUser] = useState(null);
  useEffect(() => {
    setUser(localStorage.getItem('user'));
  }, []);

  오류가 문제가 되는 이유

  1. 사용자 경험 저하: 깜빡임, 레이아웃 변경
  2. 성능 문제: React가 전체 DOM을 다시 렌더링
  3. SEO 영향: 검색 엔진이 잘못된 콘텐츠 인덱싱

  디버깅 방법

  // suppressHydrationWarning 사용 (임시 해결책)
  <div suppressHydrationWarning>
    {new Date().toLocaleString()}
  </div>

  // 또는 동적 import 사용
  const DynamicComponent = dynamic(
    () => import('./TimeComponent'),
    { ssr: false }
  );

LIST