React와 Next.js 환경에서 개발 도중 다음과 같은 에러가 발생
Error: Hydration failed because the initial UI does not match what was rendered on the server.
Next.js 공식 문서에서 설명하는 Hydration Error는 다음과 같다.
React Hydration Error
While rendering your application, there was a difference between the React tree that was pre-rendered (SSR/SSG) and the React tree that rendered during the first render in the Browser. The first render is called Hydration which is a feature of React.
This can cause the React tree to be out of sync with the DOM and result in unexpected content/attributes being present.
즉, 사전 렌더링(SSR/SSG)된 트리
와 브라우저에서 첫번째 렌더링된 트리
사이에 차이가 있을 때 해당 에러가 발생할 수 있다.
후자는 위에서 언급한 하이드레이션(Hydration)이다.
스택오버플로우에서 나와 같은 문제를 발견하였다.
다양한 답변들이 있었고 하나씩 적용해 보았다.
<Box>
<하위 컴포넌트 />
</Box>
<>
<하위 컴포넌트 />
</>
<div>
<하위 컴포넌트 />
</div>
<></> 를 통해 일시적으로 문제를 해결했지만, 문제의 원인과 근본적 해결책은 찾지못하였다.
const Index = () => {
const [domLoaded, setDomLoaded] = useState(false);
useEffect(() => {
setDomLoaded(true);
}, []);
return (
<>
{domLoaded && (
<div>
<하위 컴포넌트 />
</div>
)}
</>
);
};
export default Index;
다음과 같은 구조로 DOM이 로드된 이후에 렌더링 하도록 구조를 만들어보았고, 문제가 바로 해결된 것을 확인하였다.
해당 방법으로 해결이 된것을 보니, next에서 ssr을 막는 설정을 통해서도 해결이 가능할 것 같다.
해당 컴포넌트는 ssr처리가 필요없어서 쉽게 해결할 수 있었지만, 추후에 ssr시점에서부터 컴포넌트를 읽어와야한다면 다른 방법으로 해결할 수 있도록 공부가 필요할 것 같다.