hydrate
React 17 ์ดํ์์, hydrate
๋ react-dom/server
๋ก๋ถํฐ ์์ฑ๋ React ์ปดํฌ๋ํธ์ HTML ์ฝํ
์ธ ๋ฅผ ๋ธ๋ผ์ฐ์ DOM ๋
ธ๋์ ํ์ํ ์ ์๋๋ก ํด์ค๋๋ค.
hydrate(reactNode, domNode, callback?)
๋ ํผ๋ฐ์ค
hydrate(reactNode, domNode, callback?)
React 17 ์ดํ์์ hydrate
๋ฅผ ํธ์ถํ๋ฉด React๊ฐ ์๋ฒ ํ๊ฒฝ์์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ HTML์ React๋ฅผ ์ฐ๊ฒฐ(attach)ํ ์ ์์ต๋๋ค.
import { hydrate } from 'react-dom';
hydrate(reactNode, domNode);
React๋ domNode
์ ์๋ HTML์ ์ฐ๊ฒฐ๋๊ณ , ๊ทธ ๋ด๋ถ์ DOM ๊ด๋ฆฌ๋ฅผ ๋งก์ต๋๋ค. React๋ก ๋น๋๋ ์ฑ์ ๋ณดํต hydrate
๋ฅผ ๋ฃจํธ ์ปดํฌ๋ํธ์์ ๋ฑ ํ ๋ฒ ์คํํฉ๋๋ค.
๋ ๋ค์ํ ์์๋ฅผ ์ฝ์ด๋ณด์ธ์.
๋งค๊ฐ๋ณ์
-
reactNode
: HTML์ ๋ ๋๋งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ React ๋ ธ๋์ ๋๋ค. React 17์renderToString(<App />)
๊ฐ์ReactDOM Server
๋ฉ์๋๋ก ๋ ๋๋ง ๋<App />
์ฒ๋ผ, ์ผ๋ฐ์ ์ผ๋ก JSX ์กฐ๊ฐ ํํ์ ๋๋ค. -
domNode
: ์๋ฒ์์ ๋ฃจํธ ์์๋ก ๋ ๋๋ง ๋ DOM ์์์ ๋๋ค. -
optional:
callback
: ์ปดํฌ๋ํธ๊ฐ hydrate ๋ ํ ํธ์ถ๋๋ ํจ์์ ๋๋ค.
๋ฐํ ๊ฐ
hydrate
๋ null์ ๋ฐํํฉ๋๋ค.
์ฃผ์ ์ฌํญ
hydrate
๋ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง ๋ ์ฝํ ์ธ ๊ฐ ์๋ฒ์์ ๋ ๋๋ง ๋ ์ฝํ ์ธ ์ ๋์ผํ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค. ํ ์คํธ ์ฝํ ์ธ ์ ์ฐจ์ด ์ ๋๋ React๊ฐ ์กฐ์ ํ ์ ์๊ธด ํ์ง๋ง, ๋ถ์ผ์น๋ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผํ๊ณ ์์ ํด์ผ ํฉ๋๋ค.- ๊ฐ๋ฐ ๋ชจ๋์์ React๋ hydration ์ค ์ผ์ด๋ ๋ถ์ผ์น์ ๋ํด ๊ฒฝ๊ณ ํฉ๋๋ค. ๋ถ์ผ์นํ๋ ๊ฒฝ์ฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฐจ์ด๊ฐ ์กฐ์ ๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค. ์ด๋ ์ฑ๋ฅ์์ ์ด์ ๋ก ์ค์ํ๋ฐ, ๋๋ถ๋ถ์ ์ฑ์์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋งํฌ์ ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐ ์์ฒญ๋ ๋น์ฉ์ด ๋ค๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ฐ ์ฑ์์
hydrate
๋ ํ ๋ฒ๋ง ์คํํ์ธ์. ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ ์์ํฌ๊ฐ ๋์ ํธ์ถํ๊ณ ์์ ๊ฒ์ ๋๋ค. - ์ฑ์ด ์๋ฒ์์ ๋ ๋๋ง ๋ HTML ์์ด ํด๋ผ์ด์ธํธ์์๋ง ๋ ๋๋ง ๋๋ ๊ฒฝ์ฐ์
hydrate()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ด ๋๋ render()(React 17 ์ดํ) ๋๋ createRoot()(React 18+)๋ฅผ ์ฌ์ฉํ์ธ์.
์ฌ์ฉ๋ฒ
hydrate
๋ก React ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ์์ ๋ ๋๋ง ๋ ๋ธ๋ผ์ฐ์ DOM ๋
ธ๋์ ์ฐ๊ฒฐํ์ธ์.
import { hydrate } from 'react-dom';
hydrate(<App />, document.getElementById('root'));
hydrate()
๋ก ํด๋ผ์ด์ธํธ์์๋ง ๋์ํ๋ (์๋ฒ ์ธก์์ ๋ ๋๋ง ๋๋ HTML์ด ์๋) ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ด ๋๋ render()(React 17 ์ดํ) ๋๋ createRoot()(React 18+)๋ฅผ ์ฌ์ฉํ์ธ์.
์๋ฒ์์ ๋ ๋๋ง ๋ HTML Hydrate ํ๊ธฐ
React์์ โhydrationโ์ React๊ฐ ์๋ฒ ํ๊ฒฝ์์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ HTML์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. ํด๋ผ์ด์ธํธ์์ hydration์ด ์ผ์ด๋๋ฉด React๋ ์๋ฒ์์ ์์ฑ๋ ๋งํฌ์ ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ฑ ๋ ๋๋ง์ ์ด์ด๋ฐ์ผ๋ ค๊ณ ํฉ๋๋ค.
React๋ก ๋น๋๋ ์ฑ์์๋ ๋ณดํต ์ฑ์ด ์์๋ ๋ ๋จ ํ ๋ฒ ํ๋์ ๋ฃจํธ๋ง hydate ํฉ๋๋ค.
import './styles.css'; import { hydrate } from 'react-dom'; import App from './App.js'; hydrate(<App />, document.getElementById('root'));
๋๋ถ๋ถ์ ๊ฒฝ์ฐ hydrate
๋ฅผ ๋ค์ ํธ์ถํ๊ฑฐ๋ ๋ค๋ฅธ ๊ณณ์์ ๋ ํธ์ถํ ํ์๋ ์์ต๋๋ค. React๋ hydrate
๊ฐ ํธ์ถ๋ ์์ ๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์
์ DOM์ ๊ด๋ฆฌํฉ๋๋ค. UI๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ๋ค๋ฉด state๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
hydration์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ hydrateRoot
๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ถ๊ฐํผํ hydration ๋ถ์ผ์น ์๋ฌ ๋ฌด์ํ๊ธฐ
๋จ์ผ ์์์ ์ดํธ๋ฆฌ๋ทฐํธ๋ ํ ์คํธ ์ฝํ ์ธ ๊ฐ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ๋ค๋ฅผ ์๋ฐ์ ์๋ ๊ฒฝ์ฐ(์: ํ์์คํฌํ), hydration ๋ถ์ผ์น ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
hydration ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ค๋ฉด suppressHydrationWarning={true}
๋ฅผ ์ถ๊ฐํ์ธ์.
export default function App() { return ( <h1 suppressHydrationWarning={true}> Current Date: {new Date().toLocaleDateString()} </h1> ); }
์ด ๋ฐฉ๋ฒ์ ํ ๋ ๋ฒจ ๊น์ด์์๋ง ์๋ํ๋ฉฐ ์์๋ฐฉํธ์ผ ๋ฟ์ ๋๋ค. ํ ์คํธ ์ฝํ ์ธ ๊ฐ ์๋ ์ด์ React๋ ์กฐ์ ์ ์๋ํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ํฅํ ์ ๋ฐ์ดํธ๊ฐ ์์ ๋๊น์ง ์ผ๊ด์ ์ด์ง ์์ ์ํ๋ก ๋จ์ ์ ์์ต๋๋ค. ๋จ์ฉํ์ง ๋ง์ธ์.
์๋ก ๋ค๋ฅธ ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ์ฝํ ์ธ ์ฒ๋ฆฌํ๊ธฐ
์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ์๋์ ์ผ๋ก ๋ค๋ฅธ ๊ฒ์ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ, ํฌ ํจ์ค ๋ ๋๋ง(two-pass rendering)์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค. isClient
๊ฐ์ state๋ฅผ ์ ์ธํด effect์์ true
๋ก ๋ฐ๊ฟ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
import { useState, useEffect } from "react"; export default function App() { const [isClient, setIsClient] = useState(false); useEffect(() => { setIsClient(true); }, []); return ( <h1> {isClient ? 'Is Client' : 'Is Server'} </h1> ); }
์ด๋ ๊ฒ ํ๋ฉด ์ฒซ ๋ฒ์งธ ๋ ๋๋ง ํจ์ค(render pass)์์ ์๋ฒ์ ๊ฐ์ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ฏ๋ก ๋ถ์ผ์น๋ฅผ ํผํ ์ ์์ผ๋ฉด์๋, hydration ์งํ ์ถ๊ฐ ๋ ๋๋ง ํจ์ค๊ฐ ๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ๋๋ก ํ ์ ์์ต๋๋ค.