오류 화면 캡처
NextJS는 서버 사이드에서 HTML
을 생성하고 클라이언트에 전달한 후, 클라이언트에선 각 요소에 이벤트 핸들러를 달아서 실행 가능하도록 만든다(이를 Hydration이라고 부름)
하지만 서버 사이드에서 HTML
을 생성하는 시점엔 document
객체가 존재하지 않으므로 에러가 발생하는 것. document
는 DOM(객체처럼 HTML
을 조작할 수 있는 모델)에 접근할 때 사용하는 객체이며, 브라우저 환경에서만 접근할 수 있다.
때문에 클라이언트에서 React 컴포넌트가 마운트된 후 document
객체에 접근하도록 해야 한다. react-no-ssr 같은 라이브러리를 사용하거나 useIsMounted 같은 커스텀훅을 사용하면 위 문제를 해결할 수 있다.
💡 useIsMounted 같은 커스텀 훅은 보통 useEffect
를 활용한다. useEffect
는 DOM이 화면에 그려진(페인트) 후 호출되기 때문. 반면 useLayoutEffect
는 DOM이 화면에 그려지기 전에 호출된다.