Front-end/React

[React] React.StrictMode: ๊นŠ์ด ์žˆ๊ณ  ์•Œ์ฐฌ ์™„๋ฒฝ ๊ฐ€์ด๋“œ ๐Ÿš€

xeunnie 2024. 12. 5. 01:00
728x90
๋ฐ˜์‘ํ˜•

React.StrictMode ํ†บ์•„๋ณด๊ธฐ! ๐Ÿš€

React.StrictMode๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ค‘ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” UI๋ฅผ ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” “๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋„๊ตฌ”๋กœ, ์ƒ์‚ฐ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

React.StrictMode๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€, ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ๋งˆ์ฃผ์น  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ๋ฒ•๊ณผ ์ฃผ์˜์ ์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”?


React.StrictMode๋ž€? ๐Ÿค”

React.StrictMode๋Š” React์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ๋กœ, ๊ฐœ๋ฐœ ์ค‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ์•ˆ์ „ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์ฃ .

 

์ฃผ์š” ์—ญํ• 

  1. Deprecated(ํ๊ธฐ ์˜ˆ์ •) ๋ฉ”์„œ๋“œ ๊ฒฝ๊ณ 
    • React์˜ ์˜ค๋ž˜๋œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ(์˜ˆ: componentWillMount, componentWillUpdate, componentWillReceiveProps) ์‚ฌ์šฉ ์‹œ ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜์‹ฌ์Šค๋Ÿฌ์šด ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ฐ์ง€
    • ๋ฆฌ์•กํŠธ์—์„œ์˜ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. useEffect ํ›…์—์„œ์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์ด๋‚˜, ๋ Œ๋”๋ง ๋„์ค‘ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐฐ์น˜ ์—…๋ฐ์ดํŠธ ๊ฒ€์‚ฌ
    • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ‘ํ•ฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๊ฐ์ง€
    • React.StrictMode๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜๋„์ ์œผ๋กœ ๋‘ ๋ฒˆ ๋ Œ๋”๋งํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด๋‚˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.
  5. ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 
    • React.StrictMode์™€ TypeScript ๋˜๋Š” PropTypes๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋”์šฑ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•: ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ๊นŒ? ๐Ÿ“š

React.StrictMode๋Š” ๋ฃจํŠธ ์ˆ˜์ค€ ๋˜๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <React.StrictMode> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋ฃจํŠธ ์ˆ˜์ค€์—์„œ ์ ์šฉํ•˜๊ธฐ

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

 

ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ ์šฉํ•˜๊ธฐ

function App() {
  return (
    <div>
      <Header />
      <React.StrictMode>
        <MainContent />
      </React.StrictMode>
      <Footer />
    </div>
  );
}

React.StrictMode๊ฐ€ ๊ฐ์ง€ํ•˜๋Š” ๋ฌธ์ œ๋“ค โš ๏ธ

1. Legacy ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ

React์˜ ์˜ค๋ž˜๋œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๋ฉ”์„œ๋“œ๋Š” StrictMode์—์„œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค:

  • componentWillMount
  • componentWillReceiveProps
  • componentWillUpdate

๋Œ€์•ˆ์œผ๋กœ๋Š” ์ตœ์‹  ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ์ธ getDerivedStateFromProps ๋˜๋Š” componentDidUpdate๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class MyComponent extends React.Component {
  componentWillMount() {
    console.log("์ด ๋ฉ”์„œ๋“œ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!");
  }

  render() {
    return <div>React.StrictMode์—์„œ ๊ฒฝ๊ณ  ๋ฐœ์ƒ!</div>;
  }
}

 

2. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ฐ์ง€

React.StrictMode๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜๋„์ ์œผ๋กœ ๋‘ ๋ฒˆ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋„์ค‘ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ
  • useEffect ๋˜๋Š” useLayoutEffect ๋‚ด๋ถ€์—์„œ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ์ฝ”๋“œ
import React, { useState } from "react";

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

  // ์ž˜๋ชป๋œ ์‚ฌ์šฉ ์˜ˆ์‹œ: ๋ Œ๋”๋ง ์ค‘ ์ƒํƒœ ๋ณ€๊ฒฝ
  if (count === 0) {
    setCount(1); // React.StrictMode์—์„œ ๊ฒฝ๊ณ  ๋ฐœ์ƒ!
  }
  return <p>Count: {count}</p>;
}

 

3. ์˜์‹ฌ์Šค๋Ÿฌ์šด findDOMNode ํ˜ธ์ถœ

findDOMNode๋Š” React์˜ ์˜ค๋ž˜๋œ API๋กœ, StrictMode์—์„œ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ๋Š” ref๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

import React from "react";
import ReactDOM from "react-dom";

class MyComponent extends React.Component {
  componentDidMount() {
    ReactDOM.findDOMNode(this); // StrictMode ๊ฒฝ๊ณ  ๋ฐœ์ƒ
  }

  render() {
    return <div>findDOMNode๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์š”!</div>;
  }
}

 

๋Œ€์•ˆ: ref ์‚ฌ์šฉํ•˜๊ธฐ

class MyComponent extends React.Component {
  divRef = React.createRef();
  componentDidMount() {
    console.log(this.divRef.current); // ref๋ฅผ ํ†ตํ•ด DOM ์š”์†Œ ์ ‘๊ทผ
  }

  render() {
    return <div ref={this.divRef}>ref ์‚ฌ์šฉํ•˜๊ธฐ</div>;
  }
}

 

4. ์ค‘๋ณต ํ‚ค ๋ฌธ์ œ ๊ฐ์ง€

React์—์„œ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ key๊ฐ€ ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ, StrictMode๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

const items = ["A", "B", "C"];

function List() {
  return (
    <ul>
      {items.map((item) => (
        <li key={item}> // ์ค‘๋ณต ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๊ณ  ๋ฐœ์ƒ
          {item}
        </li>
      ))}
    </ul>
  );
}

์‹ค๋ฌด์—์„œ StrictMode๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  ๐Ÿ’ก

  1. ๋” ๋‚˜์€ ์ฝ”๋“œ ํ’ˆ์งˆ
    • ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜๊ณ  ์ˆ˜์ •ํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ ํ’ˆ์งˆ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฏธ๋ž˜ ๋Œ€๋น„
    • React์˜ ์ตœ์‹  ๊ธฐ๋Šฅ๊ณผ ๋ฏธ๋ž˜ ์—…๋ฐ์ดํŠธ์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ˜‘์—… ํšจ์œจ์„ฑ ํ–ฅ์ƒ
    • ํŒ€์› ๊ฐ„์˜ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

React.StrictMode ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ โš ๏ธ

1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉ

StrictMode๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

 

2. ๋‘ ๋ฒˆ ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•œ ํ˜ผ๋ž€

์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘ ๋ฒˆ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆํ•„์š”ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•œ ์˜๋„์ ์ธ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

 

3. ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ์ถฉ๋Œ

์˜ค๋ž˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, StrictMode์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


React.StrictMode ์š”์•ฝ ๐Ÿ“

ํŠน์ง• ์„ค๋ช…
Deprecated ๋ฉ”์„œ๋“œ ๊ฐ์ง€ ์˜ค๋ž˜๋œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์‹œ ๊ฒฝ๊ณ  ๋ฐœ์ƒ
์˜๋„์ ์ธ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง
findDOMNode ๊ฒฝ๊ณ  findDOMNode ๋Œ€์‹  ref ์‚ฌ์šฉ ๊ถŒ์žฅ
React 18๊ณผ ํ˜ธํ™˜์„ฑ ์ž๋™ ๋ฐฐ์น˜ ๋ฐ ๋™์‹œ์„ฑ ๋ชจ๋“œ์™€ ํ•จ๊ป˜ ์ž˜ ์ž‘๋™
ํ”„๋กœ๋•์…˜์—์„œ ๋น„ํ™œ์„ฑํ™” ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ํ™œ์„ฑํ™”๋˜์–ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ

 

React.StrictMode๋Š” ๊ฐœ๋ฐœ ์ค‘ ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ง€ํ•˜๊ณ  ๊ณ ํ’ˆ์งˆ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•ด React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ๋ณด์„ธ์š”!

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•