๐Ÿง  28. React ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ „๋žต ์ •๋ฆฌ โ€” ์ง„์งœ ์„ฑ๋Šฅ์„ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๊ผญ ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…๋“ค

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

๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ๋ณธ ์  ์žˆ์„ ๊ฑฐ๋‹ค.

[์ปดํฌ๋„ŒํŠธA] ๋ Œ๋”๋ง๋จ
[์ปดํฌ๋„ŒํŠธA] ๋ Œ๋”๋ง๋จ
[์ปดํฌ๋„ŒํŠธA] ๋ Œ๋”๋ง๋จ

๐Ÿ™„ โ€œ์ด๊ฑฐ ์™œ 3๋ฒˆ์ด๋‚˜ ๋ Œ๋”๋ง ๋˜์ง€...?โ€

React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ๋‚˜ props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๊ผญ "ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ง„๋‹ค"๋Š” ๋œป์€ ์•„๋‹ˆ๊ณ ,
๊ฐ€์ƒ DOM ๋น„๊ต + ์‹ค์ œ DOM ๋ณ€๊ฒฝ์€ React๊ฐ€ ์ตœ์ ํ™”ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ์„ฑ๋Šฅ ๋‚ญ๋น„์ด๊ณ ,
์‹ค์ œ๋กœ ํ”„๋ ˆ์ž„ ๋“œ๋ž, ๊นœ๋นก์ž„, ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š”
โ€œ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•โ€์„
๊ตฌ์กฐ์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด์ž.


โœ… ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด

  1. ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
  2. props๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์ „๋‹ฌ๋˜์—ˆ์„ ๋•Œ
  3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ์„ ๋•Œ (์ž์‹๋„ ๊ฐ™์ด ๋จ)
  4. context ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ (๊ตฌ๋… ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด์— ์˜ํ–ฅ)

๐Ÿ” ์ž์ฃผ ๋ณด๋Š” ๋น„ํšจ์œจ ์˜ˆ์‹œ

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

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

function Child() {
  console.log('๐ŸŸก Child ๋ Œ๋”๋ง');
  return <div>์ž์‹์ž…๋‹ˆ๋‹ค</div>;
}

๋ฒ„ํŠผ ํด๋ฆญ ์‹œ๋งˆ๋‹ค Child๋„ ๋งค๋ฒˆ ๋ Œ๋”๋ง๋œ๋‹ค.
โ†’ ์ด์œ : Parent๊ฐ€ ๋ Œ๋”๋ง๋˜๋ฉด ๋ชจ๋“  ์ž์‹๋„ ๋‹ค์‹œ ํ•จ์ˆ˜ ์‹คํ–‰๋จ


โœจ ์ตœ์ ํ™” ์ „๋žต ๋ชจ์Œ


1๏ธโƒฃ React.memo

const Child = React.memo(() => {
  console.log('Child ๋ Œ๋”๋ง');
  return <div>memoized child</div>;
});
  • props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ด๋‹ค
  • ์–•์€ ๋น„๊ต(shallow equal)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จ

2๏ธโƒฃ useCallback์œผ๋กœ ํ•จ์ˆ˜ ๋ฉ”๋ชจ์ด์ง•

const handleClick = useCallback(() => {
  // ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋กœ์ง
}, []);
  • props๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋งค๋ฒˆ ์ƒˆ ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฑธ ๋ฐฉ์ง€
  • React.memo์™€ ๊ฐ™์ด ์“ธ ๋•Œ ํŠนํžˆ ์ค‘์š”

3๏ธโƒฃ useMemo๋กœ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์บ์‹ฑ

const expensiveValue = useMemo(() => calculateHeavy(data), [data]);
  • ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ์บ์‹œํ•จ
  • ๋žœ๋”๋ง๋งˆ๋‹ค ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋„๋ก ๊ณ ์ • ์œ ์ง€

4๏ธโƒฃ key ์†์„ฑ ๊ด€๋ฆฌ

{list.map(item => (
  <Item key={item.id} {...item} />
))}
  • ๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ key๊ฐ€ ๋ฐ”๋€Œ๋ฉด React๋Š” ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ๋น„์šฉ ์ฆ๊ฐ€
  • key ์•ˆ์ •์„ฑ ํ™•๋ณด๋Š” ํ•„์ˆ˜

5๏ธโƒฃ ๋ถˆํ•„์š”ํ•œ props ์ „๋‹ฌ ์ค„์ด๊ธฐ

<Child value1={value1} /> // โŒ
<Child /> // โœ… ํ•„์š”ํ•œ props๋งŒ ์ „๋‹ฌ
  • props๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก shallow compare๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ
  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” props๋Š” ์ „๋‹ฌํ•˜์ง€ ๋ง ๊ฒƒ

๐Ÿงช ์‹ค์ „ ๋””๋ฒ„๊น… ํŒ

  • console.log('[์ปดํฌ๋„ŒํŠธ] ๋ Œ๋”๋ง')์œผ๋กœ ์ถ”์ 
  • React DevTools โ†’ Highlight updates ์ฒดํฌํ•˜๋ฉด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋๋Š”์ง€ ์ƒ‰์ƒ์œผ๋กœ ํ‘œ์‹œ๋จ
  • Profiler ํƒญ์œผ๋กœ ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ๋นˆ๋„ ํ™•์ธ ๊ฐ€๋Šฅ

๐Ÿ“Š ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์ข‹์„๊นŒ?

์ƒํ™ฉ์ถ”์ฒœ ์ „๋žต
๋™์ผํ•œ props๋กœ ๊ณ„์† ๋ Œ๋”๋ง๋จReact.memo
props๋กœ ํ•จ์ˆ˜ ์ „๋‹ฌ ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒuseCallback
๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ์ด ์ž์ฃผ ์‹คํ–‰๋จuseMemo
๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์ตœ์ ํ™”key ๊ด€๋ฆฌ + memo
context ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„ ์ค„์ด๊ธฐcontext ๋ถ„ํ•  or ๋ณ„๋„ store ์‚ฌ์šฉ

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

์ฒ˜์Œ์—” ๊ทธ๋ƒฅ React.memo ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐ๋˜๊ฒ ์ง€ ์‹ถ์—ˆ๋Š”๋ฐ,
์‹ค์ œ๋กœ๋Š” ํ•จ์ˆ˜๋‚˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ๋„ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•œ๋‹ค๋Š” ๊ฑธ ๋‚˜์ค‘์— ๊นจ๋‹ฌ์•˜๋‹ค.

์ง€๊ธˆ์€ ์„ฑ๋Šฅ ๋ฏผ๊ฐํ•œ ํŽ˜์ด์ง€์—์„ 

  • ๊ตฌ์กฐ๋ถ€ํ„ฐ props ์„ค๊ณ„
  • ํ•„์š”ํ•œ ๊ณณ๋งŒ memo
  • ํ•„์š” ์—†๋Š” props๋Š” ์•„์˜ˆ ์ œ๊ฑฐ
    ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ์žˆ๋‹ค.

โšก๏ธ "๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰๋Š” ๊ฑด ์ตœ์ ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ค๊ณ„์˜ ๊ฒฐ๊ณผ๋‹ค."


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

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