๐Ÿ” 20. React์˜ ๋ฆฌ๋ Œ๋”๋ง ํ๋ฆ„ ์ •๋ฆฌ โ€” ์–ธ์ œ, ์™œ, ์–ผ๋งˆ๋‚˜ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฑธ๊นŒ?

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

๋ฆฌ์•กํŠธ๋ฅผ ์“ฐ๋‹ค ๋ณด๋ฉด ์™œ ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋˜ ๋ Œ๋”๋ง๋˜์ง€?๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋ฒˆ ๊ธ€์€ React์˜ ๋ฆฌ๋ Œ๋”๋ง ํ๋ฆ„์„ ๊ตฌ์กฐ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ ,
์‹ค์ œ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์–ด๋–ค ์ „๋žต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


๐Ÿง  ๊ธฐ๋ณธ ๊ฐœ๋… ๋จผ์ € ์žก์ž

React๋Š” ์ƒํƒœ(state)๋‚˜ props๊ฐ€ ๋ฐ”๋€Œ๋ฉด
ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์™€ ๊ทธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค.

โœ… ๋‹จ, "๋ Œ๋”๋ง(Render)" = ๋‹ค์‹œ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๊ฑด ์•„๋‹˜
โ†’ ์‹ค์ œ DOM ์—…๋ฐ์ดํŠธ๋Š” React๊ฐ€ Virtual DOM์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•จ (diff ์•Œ๊ณ ๋ฆฌ์ฆ˜)


โœ… ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ• ๊นŒ?

์ƒํ™ฉ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์—ฌ๋ถ€
useState๋กœ ์ƒํƒœ ๋ณ€๊ฒฝโœ… ๋ฐœ์ƒ
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋จโœ… ์ž์‹๋„ ๋ฐœ์ƒ
props๊ฐ€ ๋ณ€๊ฒฝ๋จโœ… ๋ฐœ์ƒ
context ๊ฐ’ ๋ณ€๊ฒฝ๋จโœ… ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง
๋™์ผํ•œ ๊ฐ’์œผ๋กœ setState ํ˜ธ์ถœโŒ (React๊ฐ€ ๋ฌด์‹œํ•จ)
useRef ๊ฐ’ ๋ณ€๊ฒฝโŒ (๋ Œ๋”๋ง ์•ˆ๋จ)

๐Ÿ” ์‹ค์ œ ์ฝ”๋“œ ํ๋ฆ„ ์˜ˆ์‹œ

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('๋ Œ๋”๋ง ๋ฐฉ์ง€๋จ');
  return <div>memoized</div>;
});
  • props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋ง์„ ๋ง‰์•„์คŒ
  • shallow compare๋กœ ๋น„๊ต๋จ

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

const handleClick = useCallback(() => {
  // ๋กœ์ง
}, []);
  • React.memo๋œ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธธ ๋• ํ•„์ˆ˜
  • ์ƒˆ ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ๋ง‰์•„์คŒ

3๏ธโƒฃ useMemo๋กœ ์—ฐ์‚ฐ ๋ฉ”๋ชจ์ด์ง•

const value = useMemo(() => expensiveCalc(num), [num]);
  • ๋ฆฌ๋ Œ๋”๋ง๋งˆ๋‹ค ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€

โœจ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ๋ฆ„ ์š”์•ฝ

[์ƒํƒœ ๋ณ€๊ฒฝ or props ๋ณ€๊ฒฝ]
        โ†“
  ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์‹คํ–‰๋จ (๋ Œ๋”๋ง)
        โ†“
  JSX ๋ฐ˜ํ™˜ โ†’ Virtual DOM ์ƒ์„ฑ
        โ†“
  ์ด์ „ VDOM๊ณผ ๋น„๊ต(diff)
        โ†“
  ์‹ค์ œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ DOM ์—…๋ฐ์ดํŠธ

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

  • console.log('๋ Œ๋”๋ง')์œผ๋กœ ์ง์ ‘ ํ™•์ธ
  • React Developer Tools โ†’ ์ปดํฌ๋„ŒํŠธ๋ณ„ ๋ Œ๋”๋ง ํ™•์ธ ๊ฐ€๋Šฅ
  • <React.StrictMode>๋ฅผ ํ™œ์šฉํ•ด ๊ฐœ๋ฐœ ์ค‘ ๋ฆฌ๋ Œ๋”๋ง ํƒ์ง€

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

์ฒ˜์Œ์—” "setStateํ•˜๋ฉด ๋‹ค์‹œ ๊ทธ๋ ค์ง€์ง€" ์ •๋„๋กœ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ,
์‹ค์ œ๋กœ๋Š” Virtual DOM diff, ๋ฆฌ๋ Œ๋”๋ง๊ณผ DOM ์—…๋ฐ์ดํŠธ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋ผ๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ž€ ๊ฑด ๊ฒฐ๊ตญ,
๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋А๋ƒ์˜ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ๋„ ๋А๊ผˆ๋‹ค.

์ง€๊ธˆ์€ React.memo, useCallback, useMemo๋ฅผ
"์ตœ์ ํ™”์šฉ ๊ธฐ๋ณธ ์„ธํŠธ"์ฒ˜๋Ÿผ ์“ฐ๊ฒŒ ๋๋‹ค!


๐Ÿ’ก "React๋Š” ๋˜‘๋˜‘ํ•˜์ง€๋งŒ, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰๋Š” ๊ฑด ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ด๋‹ค."

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

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