๊ด€๋ฆฌ ๋ฉ”๋‰ด

My Boundary As Much As I Experienced

๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ํ€ด์ฆˆ์‡ผ. ์ž์‹ ์žฌ๋ Œ๋”๊ฐ€ ์•ˆ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๋ ค๋ฉด?(useCallback, React.memo) ๋ณธ๋ฌธ

FrontEnd/React

๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ํ€ด์ฆˆ์‡ผ. ์ž์‹ ์žฌ๋ Œ๋”๊ฐ€ ์•ˆ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๋ ค๋ฉด?(useCallback, React.memo)

Bumang 2024. 5. 15. 01:39
๐Ÿงž‍โ™‚๏ธ ํ˜น์—ฌ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํ€ด์ฆˆ. ๋ถ€๋ชจ๊ฐ€ ์žฌ๋ Œ๋”๋˜๋ฉด ์ž์‹๋“ค์€ ์žฌ๋ Œ๋”๋ ๊นŒ ์•ˆ ๋ ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ ์žฌ๋ Œ๋” ๋œ๋‹ค. ์žฌ๋ Œ๋”๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด 'useCallback' ํ˜น์€ 'React.memo'๋ฅผ ์“ฐ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ถ€๋ชจ๊ฐ€ ์ž์‹ํ•œํ…Œ prop์„ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚ด๋ ค์ฃผ๊ณ  ์žˆ๊ณ  ์ž์‹์€ ๊ทธ์ € ๋ถ€๋ชจ์—๊ฒŒ ๋งˆ์šดํŠธ๋งŒ ๋˜์–ด์žˆ๋‹ค๊ณ  ์น˜์ž.

๋ถ€๋ชจ์˜ state๋“ค์€ ์‚ฌ์‹ค ์ž์‹์—๊ฒŒ ํ•˜๋“ฑ ์ƒ๊ด€์—†์ง€๋งŒ ๋ถ€๋ชจ์˜ state๊ฐ€ ๋ฐ”๋€Œ์–ด ์žฌ๋ Œ๋”๋˜๋ฉด ์ž์‹๋„ ์žฌ๋ Œ๋”๋œ๋‹ค.

 

์ปดํฌ๋„ŒํŠธ ์žฌ๋ Œ๋”๋ฅผ ๋ง‰๊ธฐ์œ„ํ•œ ๋Œ€ํ‘œ์ˆ˜๋‹จ React.memo

์ด๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด ์“ฐ๋Š” ๊ฒƒ์ด React.memo์ด๋‹ค. ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•ด๋†“๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด ์บ์‹ฑํ•ด๋‘๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์ด์ „์— ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์•„๋ฌด๋Ÿฐ prop๋„ ๋ฐ›์ง€ ์•Š๋Š” ์ž์‹์ปดํฌ๋„ŒํŠธ์˜ ์˜ˆ์‹œ์ด๋‹ค. 

React.memo๋กœ ChildComponent์˜ ์žฌ๋ Œ๋”๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ์ „์—ญ์— ํฌ์ŠคํŠธ์ž‡ ๋ฉ”๋ชจํ•ด๋†“๋Š” ๋“ฏ์ด.

// React.Memo
const ChildComponent = React.memo(() => {
  console.log('ChildComponent rendered');
  return <div>I am the child component.</div>;
});

const ParentComponent = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      {/* ์‚ฌ์‹ค ์•„๋ฌด๋Ÿฐ prop๋„ ๋ฐ›๊ณ  ์žˆ์ง€ ์•Š๋‹ค. */}
      <ChildComponent />
    </div>
  );
};

 

 

React.memo๋ฅผ ํ•ด๋†“์•„๋„ ์žฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚˜๋Š” ์ˆœ๊ฐ„: ๋ฐ›๋Š” Prop์ด ๋ฐ”๋€œ

// count๋ผ๋Š” prop์„ ๋ฐ›๋Š”๋‹ค.
const ChildComponent = React.memo(({ count }) => {
  console.log('ChildComponent rendered');
  return <div>I am the child component.</div>;
});

const ParentComponent = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      {/* ์‚ฌ์‹ค ์•„๋ฌด๋Ÿฐ prop๋„ ๋ฐ›๊ณ  ์žˆ์ง€ ์•Š๋‹ค. */}
      <ChildComponent count={count} />
    </div>
  );
};

 

์œ„ ์˜ˆ์‹œ์—์„œ ์ด์ œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” count๋ฅผ ๋ฐ›๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ return๋ถ€๋ฅผ ๋ณด๋ฉด ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ count๋ผ๋Š” state๋ฅผ ๊ณ„์† ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฒ„ํŠผ์„ ์—ฐํƒ€ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์•„๋ฌด๋ฆฌ React.Memo๋ฅผ ํ•ด๋’€์–ด๋„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ๋ Œ๋” ๋˜๊ฒŒ ๋œ๋‹ค.

 

์‚ฌ์‹ค ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” count๋ฅผ ๋ฐ›์•„์„œ ์‹ค์ œ ํ™œ์šฉํ•˜์ง€๋„ ์•Š๊ณ  ๋ Œ๋”ํ•˜์ง€๋„ ์•Š์•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ๋„? ๊ทธ๋ ‡๋‹ค. props์— ๋ณ€๋™์ด ์ƒ๊ธฐ๋ฉด props๋ฅผ ๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ๋ Œ๋”๋˜๊ฒŒ ๋œ๋‹ค.

์‹ฌ์ง€์–ด props๋ฅผ ๋ฐ›์•„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ”๋กœ ์ด์ฃผ๋Š” wrapper ์ปดํฌ๋„ŒํŠธ๋ผ๋„ ์˜ˆ์™ธ์—†๋‹ค.

๋ฐ›์€ props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์žฌ๋ Œ๋” ๋œ๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ state๋ฅผ props๋กœ ์ฃผ๊ณ ์žˆ๊ณ  ์ด state๋Š” ๋ณ€๋™์ด ์—†๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋ถ€๋ชจ์˜ ๋‹ค๋ฅธ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์ž์‹์€ ์žฌ๋ Œ๋”๋˜๋‚˜?

๋ง์ด ์ข€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค. ๋ถ€๋ชจ๋Š” stateA์™€ stateB๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ž์‹์—๊ฒŒ stateA๋ฅผ ๋‚ด๋ ค์คฌ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ถ€๋ชจ๋‹จ์—์„œ stateB๋ฅผ ์กฐ์ž‘ํ•ด์„œ ๋ถ€๋ชจ๋Š” ์žฌ๋ Œ๋”๊ฐ€ ๊ณ„์† ์ผ์–ด๋‚œ๋‹ค. ์ด๋•Œ ์ž์‹์ด ๋ฐ›๊ณ ์žˆ๋Š” stateA๋Š” ๋ณ€ํ•จ ์—†๋‹ค๊ณ  ํ• ๋•Œ,

์žฌ๋ Œ๋” ๋˜๋Š”๊ฐ€?

 

๋‹ต์€... ์ž์‹์„ React.memo๋กœ ์•ˆ ๊ฐ์ŒŒ๋‹ค๋ฉด ๋‘ ๋งํ•  ํ•„์š”์—†์ด ์žฌ๋ Œ๋” ๋œ๋‹คใ…Žใ…Ž (ํ•จ์ •)

๊ทธ๋Ÿฌ๋‚˜ React.memo๋ฅผ ์ผ๋‹ค๋ฉด ์žฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

 

์ด๋•Œ ์•Œ์•„๋‘ฌ์•ผํ• ๊ฒŒ, ์žฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚  ๋•Œ ๊ทธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ํ•จ์ˆ˜, ํ•ธ๋“ค๋Ÿฌ ๋“ฑ์€ ๋ชจ๋‘ ์žฌ๋ Œ๋”๋˜์ง€๋งŒ

state๋“ค์€ (์ง์ ‘์ ์ธ setํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ์ด ์—†๋‹ค๋ฉด) ์œ ์ง€๋œ๋‹ค. (์ด๋ฏธ ์ง๊ด€์ ์œผ๋กœ ๋งŽ์ด ์ฒดํ—˜ํ•ด๋ด์„œ ์•„๋Š” ๋ถ€๋ถ„์ผ ๊ฒƒ์ด๋‹ค.)

 

์ฆ‰, ์ž์‹์ด ๋ฐ›๊ณ  ์žˆ๋Š” props๊ฐ€ ์•ˆ ๋ฐ”๋€Œ๋ฉด์„œ ์ œ๋Œ€๋กœ React.memo๊ฐ€ ๋˜์–ด์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด ์žฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ '์›์‹œํ˜• ๋ฐ์ดํ„ฐ'๋ฅผ props๋กœ ์ฃผ๊ณ ์žˆ๊ณ 
์ด ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๋™์ด ์—†๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ถ€๋ชจ์˜ ๋‹ค๋ฅธ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
์žฌ๋ Œ๋”๋˜๋‚˜? (์ž์‹์€ React.memo๋กœ ๊ฐ์‹ธ์คŒ)

const ChildComponent = React.memo(({ a }) => {
  console.log('ChildComponent rendered');
  return <div>I am the child component.</div>;
});

const ParentComponent = () => {
  const [count, setCount] = useState(0);
  
  const a = 100;

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      {/* ์ฟจํ•˜๊ฒŒ number ์ž๋ฃŒํ˜•์ธ a๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค. */}
      <ChildComponent a={a} />
    </div>
  );
};


์žฌ๋ Œ๋” ์•ˆ ๋œ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์˜์•„ํ•  ๊ฒƒ์ด๋‹ค.

์žฌ๋ Œ๋” ๋  ๋•Œ state๋กœ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ์ƒˆ๋กœ ์žฌ์ƒ์„ฑ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ƒ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ๋ง์ด ๋งž๋‹ค. ์›์‹œํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ชจ๊ฐ€ ์žฌ๋ Œ๋” ๋ ๋•Œ๋งˆ๋‹ค ๋งจ๋‚  ์žฌ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ React.memo๋Š” ์–•์€ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์›์‹œํ˜• ๊ฐ’๋“ค์€ ์‚ฌ์‹ค ์–•์€ ๋น„๊ต๋“  ๊นŠ์€ ๋น„๊ต๋“  ์ƒ๊ด€์—†์ด '๊ฐ’'์ด ๊ฐ™๋‹ค๋ฉด

๋™์ผํ•œ ๊ฑธ๋กœ ์ทจ๊ธ‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์›์‹œํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ๋ถ€๋ชจ ๋‚ด์—์„œ ์žฌ์ƒ์„ฑ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.

์ด๋Š” classํ˜• ์ปดํฌ๋„ŒํŠธ์˜ shouldComponentUpdate์™€ ์›๋ฆฌ๊ฐ€ ๋น„์Šทํ•˜๋‹ค.

(React.memo๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ shouldComponentUpdate ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„์ฒด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.)

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ handler๋ฅผ prop๋กœ ์ฃผ๊ณ ์žˆ๊ณ 
handler๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ถ€๋ชจ์˜ ๋‹ค๋ฅธ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
์ด๋•Œ ์ž์‹์€ ์žฌ๋ Œ๋” ๋˜๋‚˜? (์ž์‹์€ React.memo๋กœ ๊ฐ์‹ธ์คŒ)

const ChildComponent = React.memo(({ onClick }) => {
  console.log('ChildComponent rendered');
  return <div onClick={onClick}>I am the child component.</div>;
});

const ParentComponent = () => {
  const [count, setCount] = useState(0);
  
  const handleClick = () => {
    setCount(prev => prev + 1)
  }

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      {/* handleClick์„ ๋‚ด๋ ค๋ฐ›๊ณ  ์žˆ๋‹ค. */}
      <ChildComponent onClick={handleClick} />
    </div>
  );
};

์œ„์ฒ˜๋Ÿผ handler๋ฅผ useCallback์œผ๋กœ ๊ณ ์ •ํ•ด๋‘์ง€ ์•Š์•˜๋‹ค๋ฉด ์žฌ๋ Œ๋” ๋œ๋‹ค.

์ฆ‰ useCallback์œผ๋กœ handler์˜ ์žฌ์ƒ์„ฑ์„ ๋ง‰์•„๋’€๋‹ค๋ฉด ์žฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

 

์ง์ „์— ๋งํ–ˆ๋“ฏ์ด, React.memo๋Š” ์–•์€ ๋น„๊ต๋ฅผ ํ•œ๋‹ค.

์–•์€ ๋น„๊ต์—์„œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ,

์‹ค์ œ ๋‚ด๋ถ€์˜ ๊ฐ’๋“ค์ด ๋™์ผํ•œ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ

์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ๋˜‘๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜, ๊ฐ์ฒด, ๋ฐฐ์—ด (์ด ๋ชจ๋“ ๊ฒŒ ์‚ฌ์‹ค ๋‹ค ๊ฐ์ฒด์ง€๋งŒ..) ๋“ฑ๋„

๋ถ€๋ชจ ์žฌ๋ Œ๋” ์‹œ ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋ฉฐ, ์ฃผ์†Œ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ, React.memo๊ฐ€ ์–•์€ ๋น„๊ต๋ฅผ ํ•  ๋•Œ ๊ฐ™์€ ๊ฐ’์ด ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์—

ํ•ธ๋“ค๋Ÿฌ ๊ฐ™์€ ๊ฒƒ์„ ๋‚ด๋ ค์ค„ ๋•Œ useCallback์„ ์จ์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

useCallback๋„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(์‰ฝ๊ฒŒ ๋งํ•ด ์บ์‹ฑ)์„ ํ•˜๋Š” ํ›… ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ,

์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์žฌ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ์œ ์ง€์‹œ์ผœ์ค€๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋์„ ์‹œ์—๋งŒ callback์„ ์žฌ์ƒ์„ฑ ํ•ด์ค€๋‹ค.

 

 

๋งˆ์ง€๋ง‰ ๋ฌธ์ œ,
๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ useCallback์„ ์จ์„œ ์žฌ์ƒ์„ฑ์„ ๋ง‰์€ handler๋ฅผ ๋‚ด๋ ค์ค€๋‹ค.
์žฌ๋ Œ๋”๊ฐ€ ๋  ๊ฒƒ์ธ๊ฐ€? (์ž์‹์—๊ฒŒ React.memo๊ฐ€ ๋‘˜๋Ÿฌ์ ธ ์žˆ์ง€ ์•Š๋‹ค)

๋‹ต์€ ์žฌ๋ Œ๋” ๋œ๋‹ค. React.memo๊ฐ€ ์—†๋‹ค๋ฉด

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ž์‹, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ๋ Œ๋”๊ฐ€ ๋œ๋‹ค๋Š”๊ฑธ ์ „์ œ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.

๋ฌผ๋ก  useCallback์„ ์จ์„œ ํ•ธ๋“ค๋Ÿฌ์˜ ์ฐธ์กฐ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ์œ ์ง€์‹œ์ผฐ๊ณ 

์ด๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ›์€ prop์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ React.memo๋กœ ๊ฐ์‹ธ์ง€ ์•Š์€ ์ž์‹์ด๋ผ๋ฉด ์žฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋  ๋•Œ ์žฌ๋ Œ๋” ๋œ๋‹ค.

 

์ฆ‰, useCallback์„ ์ผ๋‹ค๊ณ  ๋์ด ์•„๋‹ˆ๋‹ค.

์ฐธ์กฐ๋ฅผ ์œ ์ง€์‹œํ‚ค๋Š” ์ด์œ ๋Š” React.memo๊ฐ€ ์–•์€ ๋น„๊ต๋ฅผ ์ž˜ ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ž€๊ฑธ ๊นŒ๋จน์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

์ฆ‰, React.memo๋ฅผ ์•ˆ ์“ฐ๋ฉด ๋ฌด์šฉ์ง€๋ฌผ์ด๋‹ค.

(React.memo์„ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ useCallback์„ ์จ์•ผํ•˜๋Š” ์ˆœ๊ฐ„์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€ ์•Š๋‹ค.)

 

๋‚˜์ค‘์— ๊ณต๋ถ€ํ•  ๊ฒƒ

- ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ ํ•œ ๋ฒˆ ๋”ฅํ•˜๊ฒŒ ์ •๋ฆฌ

- class ์ปดํฌ๋„ŒํŠธ์˜ shouldComponentUpdate

- useMemo

- ๋ฆฌ์•กํŠธ ๋ถˆ๋ณ€์„ฑ

 

๋๋งˆ์น˜๋ฉฐ

chatGPT์˜ ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ํ—›์†Œ๋ฆฌ๋ฅผ ๋งŽ์ด ์“ฐ๋Š” ๋ฐ”๋žŒ์— ๊ต์ฐจ๊ฒ€์ฆํ•˜๋Š๋ผ ์ž‘์„ฑ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

useCallback๊ณผ React.memo๋ฅผ ๋์žฅ๋‚˜๊ฒŒ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์ด ๋˜์–ด ์„ฑ์žฅ์— ์ข‹์€ ์ž์–‘๋ถ„์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค.