๐Ÿงช 22. React.StrictMode โ€” ์™œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์“ฐ๊ณ , ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š” ๊ฑธ๊นŒ?

JM_Devยท2025๋…„ 5์›” 2์ผ
0
post-thumbnail

React ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ index.tsx์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

<React.StrictMode>
  <App />
</React.StrictMode>

์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ "๊ฐœ๋ฐœ์šฉ์ด๊ฒ ์ง€" ํ•˜๊ณ  ์ง€๋‚˜์น˜๊ธฐ ์‰ฌ์šด๋ฐ,
์•Œ๊ณ  ๋ณด๋ฉด React.StrictMode๋Š” ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” StrictMode๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”์ง€,
์–ธ์ œ ์ผœ๊ณ  ๊บผ์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


โœ… React.StrictMode๋ž€?

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ
React ์•ฑ์—์„œ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

โœ… ์ค‘์š”ํ•œ ํŠน์ง•

  • ๋ Œ๋”๋ง์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•ด์„œ ์ด์ƒ ๋™์ž‘์„ ๋ฏธ๋ฆฌ ํŒŒ์•…ํ•จ
  • ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋‚˜ ์˜๋„์น˜ ์•Š์€ ๋ Œ๋”๋ง ํ๋ฆ„์„ ์žก์•„๋ƒ„
  • DOM์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ

๐Ÿ” ์–ด๋–ค ์ผ๋“ค์ด ๋ฐœ์ƒํ•˜๋‚˜?

1๏ธโƒฃ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง 2๋ฒˆ ์‹คํ–‰

function Test() {
  console.log('๋ Œ๋”๋ง');
  return <div>ํ…Œ์ŠคํŠธ</div>;
}

StrictMode์—์„œ๋Š” console.log๊ฐ€ 2๋ฒˆ ์‹คํ–‰๋จ
โ†’ React๊ฐ€ "์ด ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€" ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋‘ ๋ฒˆ ๋ Œ๋”๋งํ•จ


2๏ธโƒฃ useEffect์™€ useLayoutEffect clean-up ํ…Œ์ŠคํŠธ

useEffect(() => {
  console.log('์ดํŽ™ํŠธ ์‹คํ–‰');

  return () => {
    console.log('์ •๋ฆฌ ํ•จ์ˆ˜ ์‹คํ–‰');
  };
}, []);

StrictMode์—์„œ๋Š” ๋งˆ์šดํŠธ โ†’ ์–ธ๋งˆ์šดํŠธ โ†’ ๋‹ค์‹œ ๋งˆ์šดํŠธ
โ†’ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ •๋ฆฌ(clean-up)๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ชฉ์ 


3๏ธโƒฃ Deprecated API ๊ฒฝ๊ณ 

  • class component์—์„œ legacy lifecycle(componentWillMount, ๋“ฑ) ์‚ฌ์šฉ ์‹œ ๊ฒฝ๊ณ 
  • ์ž˜๋ชป๋œ ref, unsafe context ์‚ฌ์šฉ ์‹œ๋„์— ๋Œ€ํ•œ ๊ฒฝ๊ณ 

โœ… ์ด๋ฅผ ํ†ตํ•ด React์˜ ๋ฏธ๋ž˜ ๋ฒ„์ „์— ๋ฌธ์ œ๊ฐ€ ๋  ์š”์†Œ๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Œ


โŒ production ํ™˜๊ฒฝ์—์„œ๋Š” ์ œ๊ฑฐ๋œ๋‹ค

StrictMode๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ 
์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

โœ… ๊ทธ๋ž˜์„œ ๊ฑฑ์ • ์—†์ด ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
โŒ ๋‹จ, StrictMode์—์„œ ๋ฐœ์ƒํ•œ ๋ Œ๋”๋ง ๋‘ ๋ฒˆ ํ˜„์ƒ์€ ์‹ค์ œ ๋ฐฐํฌ์—์„  ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.


๐Ÿ’ก ์™œ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง ๋˜๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•ด๋ณด์ž

function Demo() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('๐ŸŸก useEffect');
    return () => {
      console.log('๐Ÿ”ด clean-up');
    };
  }, []);

  return <button onClick={() => setCount(count + 1)}>+1</button>;
}

StrictMode ON
์ฝ˜์†” ์ถœ๋ ฅ:

๐ŸŸก useEffect  
๐Ÿ”ด clean-up  
๐ŸŸก useEffect  

์ด๊ฑธ ๋ชจ๋ฅด๊ณ  ์žˆ๋‹ค๋ฉด,
"์™œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง๋˜์ง€?"
"์™œ useEffect๊ฐ€ ๋‘ ๋ฒˆ ์‹คํ–‰๋˜์ง€?"
๊ฐ™์€ ํ˜ผ๋ž€์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.


๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ CRA(create-react-app)์—์„œ ์ž๋™์œผ๋กœ ์“ฐ๋‹ˆ๊นŒ ๊ทธ๋Ÿฐ๊ฐ€๋ณด๋‹ค ํ–ˆ๋Š”๋ฐ,
์ง„์งœ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ DOM์„ ๊ฑด๋“œ๋ฆด ๋•Œ,
StrictMode๊ฐ€ ๊ทธ๊ฑธ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ๋Š” ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค.

๋•๋ถ„์— ์ƒํƒœ ๊ด€๋ฆฌ, useEffect ์„ค๊ณ„ํ•  ๋•Œ "์ด๊ฒŒ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ž‘๋™ํ• ๊นŒ?"
ํ•œ ๋ฒˆ ๋” ์ ๊ฒ€ํ•˜๊ฒŒ ๋˜๋Š” ์Šต๊ด€์ด ์ƒ๊ฒผ๋‹ค.


๐Ÿ” "StrictMode๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ฐ€ํ˜นํ•œ ์„ ์ƒ๋‹˜์ด๋‹ค.
์ง€๊ธˆ์€ ๊ท€์ฐฎ์•„๋„, ๋ฏธ๋ž˜์—” ์•ˆ์ •์„ฑ์œผ๋กœ ๋Œ์•„์˜จ๋‹ค."

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€