๐ซ Hydration Mismatch ๐ซ (2)2023. 6. 3.
์๊ธฐ์ ์ด๊ฒ ์ ๊ฒ ํด๋ดค๋๋ฐ ๋ค ๋ณ๋ก์ธ ๊ฒ ๊ฐ๋ค. ์๋๋ฉด ๋ค hydration mismatch๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ์๋๊ณ ํผํด๊ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ธ๋ฏ...
๊ทธ๋ฌ๋๊น ์ ์๋น์ด 'mismatch'๊ฐ ๋ฐ์ํ๋ ๊ฑด
- client state๊ฐ client์์๋ง ์ก์ธ์ค ๊ฐ๋ฅํ ๊ณณ์ persist ๋์ด์์ด์
- server์์ ์ก์ธ์ค๊ฐ ์๋๋๊น
- UI ์ํ๊ฐ ๋ฌ๋ผ์ง ์ ๋ฐ์ ์๋ค.
์ธ๋ฐ ๊ทธ๋ ๋ค๋ฉด
- client state persist๋ฅผ
- server์์ ์ก์ธ์ค ๊ฐ๋ฅํ ๊ณณ์ ํ๋ฉด ๋๋ ๊ฒ์๊ฒ๋กฑ.
๊ทธ๋์ ์ข ์์ด ๊ฐ์ง๋ง ๊ฑ ์ด๋ ๊ฒ ํด๋ดค๋๋ฐ,
- persist์
cookie
๋ฅผ ์ฌ์ฉํ๋ค. - ์๋๋ฉด ์ฟ ํค๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ฝ๊ธฐ ๊ฐ๋ฅ์ด๋ฏ๋ก. ์ํผ ๊ทธ๋์ ํ๋ก์ฐ๋,
- ์๋ฒ ์ปดํฌ๋ํธ์์
cookie
๋ฅผ ์ฝ์ด์ ๊ณ ์์ ๋ค์ด์๋ persisted state๋ฅผ ๊ฐ์ ธ์จ๋ค. - mismatch๊ฐ ๋ฐ์ํ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ state๋ฅผ ๋๊ฒจ์ค prop์ ํ๋ ๋ซ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์
useState
๋ก local state๋ฅผ ํ๋ ๋ง๋๋๋ฐ, - ๋ง๋ค๋ฉด์ initialState๋ก ์ ์๋ฒ ์ปดํฌ๋ํธ์์ ๋ฐ์์จ prop์ ๋๊ฒจ์ค๋ค.
useEffect
๋ฅผ ํ๋ ์ถ๊ฐํด์- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์ฐ๊ณ ์๋ persisted store์ local state์ ๋ฌถ์ด์ค๋ค.
- ๊น
๊น ๋๋ต
export function useSyncedState<T>(clientState: T, serverState?: T) { const [state, setState] = React.useState<T>(serverState ?? clientState) React.useEffect(() => { setState(clientState) }, [clientState]) return state }
export function useSyncedState<T>(clientState: T, serverState?: T) { const [state, setState] = React.useState<T>(serverState ?? clientState) React.useEffect(() => { setState(clientState) }, [clientState]) return state }
- ์๋ฃ
์ด๋ฌ๋ฉด
- ์ด์ฐจํผ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ ๊ฐ์ ๊ฑธ ๋ณด๊ณ ์์ผ๋ฏ๋ก ์ ์๋น์ด mismatch๊ฐ ์๋.
- hydration์ด ๋๊ธฐ ์ ์ ์ด๋ฏธ ๊ฐ์ ์ํ์ UI๊ฐ ๋ณด์ด๋ฏ๋ก ๊น๋นก์ ๊ฐ์ ๊ฒ ์์.
๊ตณ
๊ทผ๋ฐ:
- ์๋ฒ ํธ์ถ์ ํด์ผ ๋จ
- ๊ทธ๋์ ์๋ ๊ฒ ํ ์ปดํฌ๋ํธ๊ฐ ๋ค์ด์๋ ํ์ด์ง๋ static export๊ฐ ์๋จ