DEVLOG

ReactStrictMode ๋‘๋ฒˆ ๋ Œ๋”๋ง, api๊ฐ€ ๋‘๋ฒˆ ํ˜ธ์ถœ๋ผ์š” ReactStrictMode ๋‘๋ฒˆ ๋ Œ๋”๋ง, api๊ฐ€ ๋‘๋ฒˆ ํ˜ธ์ถœ๋ผ์š” ๋ณธ๋ฌธ

frontend/log

ReactStrictMode ๋‘๋ฒˆ ๋ Œ๋”๋ง, api๊ฐ€ ๋‘๋ฒˆ ํ˜ธ์ถœ๋ผ์š” ReactStrictMode ๋‘๋ฒˆ ๋ Œ๋”๋ง, api๊ฐ€ ๋‘๋ฒˆ ํ˜ธ์ถœ๋ผ์š”

meroriiDev 2023. 8. 16. 13:41
728x90
๋ฐ˜์‘ํ˜•
๐Ÿ“–  ๋ชฉ์ฐจ

     

    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์œผ๋กœ ์„ ์–ธํ–ˆ๋‹ค.
    ๋‘๊ฐ€์ง€ ์ด์œ ๋กœ ํŽ˜์ด์ง€๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋˜์—ˆ๋‹ค๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    1. ์ดˆ๊ธฐ ๋งˆ์šดํŠธ๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ฒซ๋ฒˆ์งธ useEffect์˜ ๋กœ๊ทธ๊ฐ€ ๋‘๋ฒˆ ์ฐํ˜”๋‹ค.
    2. ๋ฆฌ๋งˆ์šดํŠธ๋œ ๋กœ๊ทธ์—์„œ 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๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ๊ฒ ๋‹ค!


    ์ฐธ๊ณ  https://beta.reactjs.org/reference/react/StrictMode

    728x90
    ๋ฐ˜์‘ํ˜•
    Comments