Next.js - Hydration failed β¦ (ft. MUI)
π§Ά Problem
Next.jsλ₯Ό μ¬μ©νμ¬ ν¬νΈν΄λ¦¬μ€ μμ μ νκ³ μμλλ° λ€μμ μλ¬κ° λ°μνμλ€.
Error: Hydration failed because the initial UI does not match what was rendered on the server.
Warning: Expected server HTML to contain a matching <h6> in <h6>.
See more info here: https://nextjs.org/docs/messages/react-hydration-error
Next.js ννμ΄μ§λ‘ λ€μ΄κ°λ³΄λ μ΄ μ€λ₯λ μ ν리μΌμ΄μ μ λ λλ§νλ λμ 미리 λ λλ§λ React νΈλ¦¬(SSR/SSG)μ λΈλΌμ°μ μμ 첫 λ²μ§Έ λ λλ§ μ€μ λ λλ§λ React νΈλ¦¬ κ°μ μ°¨μ΄κ° μμ΄μ λ°μνλ κ²μ΄λΌλ μ€λͺ μ΄ λμ΄ μμλ€. κ·Έλ¦¬κ³ ν΄λΉ λ°©λ²μ λν μμκ° λμ μμ΄μ ν΄λΉ μμμ λ§μΆ° λ³κ²½ν΄ 보μλ€.
πͺ Solution 1
export default function App({ Component, pageProps }: AppProps) {
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);
return (
<>
<Head>...</Head>
{mounted && (
<ThemeProvider theme={theme}>
<CssBaseline />
<Component {...pageProps} />
</ThemeProvider>
)}
</>
);
}
μλ¬κ° μ΄λ μ λ ν΄κ²°λ κ²μ²λΌ 보μμΌλ κΈ°λ³Έμ μΌλ‘ MUI ν λ§κ° μ λλ‘ μ μ©λμ§ μμκ³ λ€μμ μλ¬ νλκ° λ¨μλ€.
client.js:1 Warning: validateDOMNesting(...): <h6> cannot appear as a child of <h6>.
at h6
ν΄λΉ μλ¬λ μ²μ λ°μν μλ§μ μλ¬ μ€ νλμλλ° μ λλ‘ λ³΄μ§ μμμλ€. ν΄λΉ μλ¬λ₯Ό λ€μ ꡬκΈλ§ν΄μ μ°Ύμ보λ ν΄λΉ μλ¬λ MUIμ κ΄λ ¨λ μλ¬μλ€.
λ€μμ νμ΄μ§μμ ν΄λΉ μλ¬μ²λ¦¬μ ννΈλ₯Ό μ»μλ€.
https://github.com/mbrn/material-table/issues/653
MUIμ Typography νκ·Έλ₯Ό μλͺ» μ€μ²©ν΄μ μ¬μ©νλ©΄ λ°μνλ λ¬Έμ μλ€.
λλ μλ¬κ° λκΈ΄ μ μμ μ νμΈνκ³ λ¬Έμ λ₯Ό μ°Ύμλλ€.
πͺ Solution 2
<Typography variant="subtitle1" m={5}>
μ£Όμ κΈ°λ₯ : νμ΅νκ³ μ νλ μμ΄λ¬Έμ₯μ λ±λ‘, λ¬Έμ₯μ§(κ·Έλ£Ή)λ³λ‘ ꡬλΆνμ¬ νμ΅ν
μ μμΌλ©°, νμ΅ν λ¬Έμ₯μ λ°λ‘ μ²΄ν¬ κ°λ₯, κ°κ°μ λ¬Έμ₯ λ°λ‘ μμΈν μ‘°ννμ¬
νμ΅ν μ μλ€
<br></br>
<br></br>
FrontEnd : React, NextJS, TypeScript, TailwindCSS, React Query, Recoil
<br></br>
BackEnd : MongoDB
<br></br>
Deployment : Vercel
<br></br>
GitHub :
<Typography
variant="subtitle1" // μ€λ³΅!!!
...
>
<a href="https://github.com/Gryffindor0ne/me-moonjang">
https://github.com/Gryffindor0ne/me-moonjang
</a>
</Typography>
</Typography>
ν΄λΉ μλ¬λ MUI λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ μ€ Typegraphy νκ·Έλ₯Ό μ€μ²©μΌλ‘ μ¬μ©νλ€κ° κ°μ μ΅μ μ μ€λ³΅μΌλ‘ μ¬μ©νμ¬ λ°μν μλ¬λΌλ κ²μ μκ² λμλ€. ν΄λΉ μ΅μ μ μμ νκ³ μμμ μ€μ ν λΆλΆλ λ€ μμ ν ν μ±μ λ€μ μ€νν΄λ³΄λ μλ¬μμ΄ μ μλνμλ€.
κ²°κ΅ ν΄λΉ μλ¬λ λ΄κ° SSRμΌλ‘ μλνλ NextJSμμ MUI λΌμ΄λΈλ¬λ¦¬λ₯Ό μλͺ» μ¬μ©νμ¬ λ λνΈλ¦¬ μ€λ₯λ₯Ό λ°μμν¨ κ²μ΄ μμΈμ΄μλ€. μ΄μ°λ³΄λ©΄ μμ£Ό λ¨μν μ€μμΈλ° μλ¬κ° 무μνκ² λ§μ΄ λ¨λ λ΄μ¬ λΉν©νμλ€. λ€νν μμΈμ κΈλ°© μ°Ύμλ΄μ΄ ν΄κ²°νμκ³ κ·Έλ‘ μΈν΄ λ ν κ°μ§ λ°°μ°λ μμ μ΄ λμλ€.