DEVLOG
ReactStrictMode ๋๋ฒ ๋ ๋๋ง, api๊ฐ ๋๋ฒ ํธ์ถ๋ผ์ ReactStrictMode ๋๋ฒ ๋ ๋๋ง, api๊ฐ ๋๋ฒ ํธ์ถ๋ผ์ ๋ณธ๋ฌธ
ReactStrictMode ๋๋ฒ ๋ ๋๋ง, api๊ฐ ๋๋ฒ ํธ์ถ๋ผ์ ReactStrictMode ๋๋ฒ ๋ ๋๋ง, api๊ฐ ๋๋ฒ ํธ์ถ๋ผ์
meroriiDev 2023. 8. 16. 13:41๐ ๋ชฉ์ฐจ
double rendering ์ด์
๋ฆฌ์กํธ๋ก ํ๋ก์ ํธ๋ฅผ ์์ ํ๋๋ฐ api๊ฐ ๋๋ฒ์ฉ ์ฐํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ฌ์ค ์ฒ์ ํ์ด์ง์ ์ง์ ํ์๋ ๋ฟ๋ง ์๋๋ผ ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ๋๋ ๋๋ฒ์ฉ ์ฐํ์ ์ฝ๋์์ ๋ฌธ์ ์ธ๊ฐ๋ณด๋ค..ํ๋๋ฐ ๋ฐ์ดํฐ ๋๋ฒ์ฉ ํธ์ถ๋๋ ๋ถ๋ถ์ ํด๊ฒฐํ๋๋ฐ๋ ํ์ด์ง ์ฒ์ ๋ ๋๋ง์์ ๋๋ฒ์ด ์ฐํ๋๊ฒ์ ์ฌ์ ํ๋ค.
๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด๋ ๋ก๊ทธ๋ ๋๋ฒ ์ฐํ๋ ๊ฒ์ผ๋ก ๋ ๋๋ง์ด ๋๋ฒ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
๐ ์์ธ
ReatStrictMode
api ์ค๋ณต ํธ์ถ๊ณผ ๊ด๋ จํด์ ๊ตฌ๊ธ๋ง์ ํ๋ค๊ฐ ReatStrictMode์ ๊ด๋ จ์ด ์์์ ์๊ฒ ๋์๋ค. google์์ react strictmode render twice๋ผ๋ ํค์๋๋ก ์ฌ๋ฌ ์ ๋ณด๋ค์ ์ป์ ์ ์์๋ค. ์์ด๋ก ๋ ๋ฌธ์๋ ๋ง๊ณ ์ ํ๋ธ ์์๋ค๋ ๋ง์๊ฒ์ ๋ณด๋ ์ค์ ๋ก ๊ตญ๋ด์ธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ ๊ดด๋กญํ๋ ๋ ์์ธ๊ฐ๋ณด๋ค!
๋ฆฌ์กํธ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด
React๋ ์์ฑํ๋ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์์ ํจ์๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฆ, ์์ฑํ๋ React ๊ตฌ์ฑ ์์๋ ๋์ผํ ์ ๋ ฅ(props, state ๋ฐ context)์ด ์ฃผ์ด์ง๋ฉด ํญ์ ๋์ผํ JSX๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
์ด ๊ท์น์ ์๋ฐํ๋ ๊ตฌ์ฑ ์์๋ ์๊ธฐ์น ์๊ฒ ๋์ํ์ฌ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํต๋๋ค. ์ค์๋ก ์์ํ์ง ์์ ์ฝ๋๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด ๋๋๋ก ์๊ฒฉ ๋ชจ๋๋ ๊ฐ๋ฐ ์ค์ ์ผ๋ถ ํจ์(์์ํด์ผ ํ๋ ํจ์๋ง)๋ฅผ ๋ ๋ฒ ํธ์ถํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
- ๊ตฌ์ฑ ์์ ํจ์ ๋ณธ๋ฌธ (์ต์์ ๋ ผ๋ฆฌ๋ง ์์ผ๋ฏ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์ ์ฝ๋๋ ํฌํจ๋์ง ์์)
- useState, setfunctions , useMemo๋๋ ์ ์ ๋ฌํ๋ ํจ์useReducer
- constructor, render, ๊ฐ์ ์ผ๋ถ ํด๋์ค ๊ตฌ์ฑ ์์ ๋ฉ์๋ shouldComponentUpdate( ์ ์ฒด ๋ชฉ๋ก ์ฐธ์กฐ )
ํจ์๊ฐ ์์ํ ๊ฒฝ์ฐ ์์ํ ํจ์๋ ๋งค๋ฒ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ๋ ๋ฒ ์คํํด๋ ๋์์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํจ์๊ฐ ์์ํ์ง ์์ ๊ฒฝ์ฐ(์๋ฅผ ๋ค์ด, ์์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ) ๊ทธ ์์ํ์ง ์์ ์ฝ๋๋ฅผ ๋ ๋ฒ ์คํํ๋ ๊ฒ์ ๋์ ๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค(๊ทธ๊ฒ์ด ํจ์๋ฅผ ์์ํ์ง ์๊ฒ ๋ง๋ญ๋๋ค!) ์ด๋ ๊ฒ ํ๋ฉด ๋ฒ๊ทธ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ์์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ทธ๋์ ๋ญ๋ผ๊ตฌ?
์ ๋ฆฌํ์๋ฉด, StrictMode๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์์๋ด๊ธฐ ์ํ ๋๊ตฌ๋ก, ์ด๊ธฐ์๋ ํ์ธํ ์ ์๋ ๋ฌธ์ ๊ฐ ์ฌ๋ ๋๋ง์ด ๋ ๋๋ง ํ์ธ์ด ๋ ๋ ์ด๋ฅผ ๊ฐ๋ฐํ๊ฒฝ์์ ๋ฏธ๋ฆฌ ํ์ ํ๊ณ ์ ๋๋ธ๋ ๋๋ง์ ์์ผ ์ค๋ฅ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ๋ ์ญํ ์ ํ๋ค.
๋ง์ด๋ > ์ธ๋ง์ดํธ > ๋ฆฌ๋ง์ดํธ ๊ณผ์ ์ ๋น ๋ฅด๊ฒ ์ง๋๋ฉด์ ๋ง์ดํธ ๋์ด ๋ ๋๋ง์ด ์งํ๋ ํ ํ๋ฒ ๋ ์ฒดํฌํ๊ธฐ ์ํด ์ธ๋ง์ดํธ ํ ๋ฆฌ๋ง์ดํธ๋๋ฉด์ ํ๋ฒ ๋ ๋ ๋๋ง์ด ์งํ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ํด๋น ๊ณผ์ ์ ํ์ธํด๋ณด๊ธฐ ์ํด ์๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
ํ์ธํด๋ณด์.
let renderCount = 0;
const [rendered, setRendered] = useState(false);
useEffect(() => {
//๋ง์ดํธ
renderCount++;
setRendered(true);
console.log("mount", renderCount); //1
return () => {
//์ธ๋ง์ดํธ
console.log("unmount");
};
}, []);
useEffect(() => {
//๋ฆฌ๋ง์ดํธ
if (rendered) {
console.log("remount", renderCount); //2
}
}, [rendered]);
๋ฆฌ๋ง์ดํธ๋ฅผ ๊ฐ์งํ๋ state๋ฅผ ๋ง๋ค๊ณ , renderCount๋ฅผ ํ๋ ๋ณ์๋ let์ผ๋ก ์ ์ธํ๋ค.
๋๊ฐ์ง ์ด์ ๋ก ํ์ด์ง๊ฐ ์ฌ๋ ๋๋ง ๋์๋ค๊ณ ํ์ธํ ์ ์์๋ค.
- ์ด๊ธฐ ๋ง์ดํธ๋ฅผ ์๋ฏธํ๋ ์ฒซ๋ฒ์งธ useEffect์ ๋ก๊ทธ๊ฐ ๋๋ฒ ์ฐํ๋ค.
- ๋ฆฌ๋ง์ดํธ๋ ๋ก๊ทธ์์ renderCount๊ฐ 0์ผ๋ก ์ด๊ธฐํ๋์ด ์ฌ๋ ๋๋ง์ด ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
useEffect(() => {
//๋ง์ดํธ
setRendered(true);
return () => {
//์ธ๋ง์ดํธ
console.log("unmount");
};
}, []);
useEffect(() => {
//๋ฆฌ๋ง์ดํธ
if (rendered) {
fetchData(page);
}
}, [rendered]);
์ฒซ๋ฒ์งธ ๋ง์ดํธ ๋ ๋ rendered state๋ฅผ ๋ณ๊ฒฝ์์ผ ๋ฆฌ๋ง์ดํธ ๋ ๋์ api๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋ ๋๋ง์ด ๋๋ฒ ๋ฐ์ํ๋ ํ์์ ํด๊ฒฐํ ์ ์๋ค.
ํ์ง๋ง ๋ด ์ฝ๋์ api๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ์ปค์คํ
hook์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์กฐ๊ฑด๋ถ์ ํจ๊ป ์ฐ์ผ ์ ์๋ ์ ์์ ์ด ๋ฐฉ๋ฒ์ด ์ฝ์ง ์์๋ค.
๐ ํด๊ฒฐ
๋ง์์ด๋ค์ ํด๊ฒฐ์ฑ
๋ง์์ด๋ค์ ์ด๋ฌํ React.StrictMode๋ฅผ ์ฃผ์์ฒ๋ฆฌ ํด๋ฒ๋ฆฌ๋ ๊ฒ์ผ๋ก ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ณค ํ๋ค. ์ค์ ๋ก ํด๋น ์ฝ๋๋ฅผ ์ฃผ์์ฒ๋ฆฌํ์๋ง์ api๊ฐ ๋๋ฒ ํธ์ถ๋๋ ์ค๋ฅ๊ฐ ์กํ๊ณ ,, ๋๋ ์๊นํ๋ ๋ง์์ผ๋ก ์ฃผ์์ฒ๋ฆฌ๋ฅผ ํ๊ณ ๊ฐ๋ฐ์ ์งํํ๋ค.
๊ทธ๋๋ ์ผ์ผ์ง!
๋จ์ํ๊ฒ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋์ด๋ณด์ธ๋ค๋ ์ด์ ๋ก ReactStrictMode๋ฅผ ์ ๊ฑฐํ๊ณ ๊ฐ๋ฐ์ ํ์ง๋ง ์ฌ๋ฌ ๊ธ์์ ReactStrictMode๋ฅผ ํด์ ํ์ง ์๋ ๊ฒ์ ์ถ์ฒํ์ฌ ๋ค์ ReactStrictMode๋ฅผ ์ค์ ํด์ฃผ์๋ค. ReactStrictMode๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ “use strict”๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ฉฐ Strict ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๊ฒ์ฌํ๊ณ ์๋ชป ์ฌ์ฉ๋ ๋ถ๋ถ์ ์๋ ค์ค๋๋ค. ์ด๋ฌํ ๋ฉ์ธ์ง๋ ์ ์ฌ๋ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ํด๊ฒฐํ ์ ์๋ค.
ReactStrictMode๋ ๊ฐ๋ฐ๋ชจ๋์์๋ง ๋๋ธ๋ ๋๋ง์ด ๋ฐ์ํ๊ณ ์ค์ ๋ฐฐํฌ๋ฅผ ์งํํ์ ๊ฒฝ์ฐ์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๋ผ๋ ๋ฉํธ๊ฐ ๋ฌธ์ ๊ณณ๊ณณ์ ์ฐ์ฌ์๊ณ , ์ค์ ๋ก vercel๋ฅผ ํตํด ๋ฐฐํฌํด ๋๋ธ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ ๋ณด๊ณ ReactStrictMode๋ฅผ ์ญ์ ํ์ง ์๊ณ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ ์ ํํ๋ค.
+์ด์ ์ ์งํํ๋ ํ๋ก์ ํธ๋ ์ด๋ป๊ฒ ํ๊ธธ๋ ์ด์ ์ผ ๋ฐ๊ฒฌํ๊ฑธ๊น,,? ํ๊ณ ๊นํ์ ์ฌ๋ ค๋์ ๊ฐ์ธ ํ๋ก์ ํธ ์ฝ๋๋ฅผ ๋ค์ ์ดํด๋ณด๋ ํ ํ๋ก์ ํธ๋ React.StrictMode๋ฅผ ์ฃผ์์ด ์๋๋ผ ์์ ๊น๋ํ๊ฒ ์ง์๋ฒ๋ ธ๊ณ ..^^ ํ ํ๋ก์ ํธ๋ Next๋ฅผ ์ฌ์ฉํ๊ฒ์ผ๋ก StrictMode๋ ์ค์ ๋์ด ์์์ง๋ง api๊ฐ ๋๋ฒ ํธ์ถ๋๋๋ฐ๋ ์ฝ๋์ ์ด์ ๋ฅผ ์ฐพ์ง ๋ชปํด ๋ณ๋ค๋ฅธ ์์ ์ ํ์ง ๋ชปํ์๋ค. ์ด์ ๋ฅผ ์์์ผ๋ ์ผ๋ฅธ ๊ฐ์ StrictMode๋ฅผ ๋ค์ ์ค์ ํด์ฃผ์ด์ผ๊ฒ ๋ค!