๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / ์ตœ์ ํ™” ํ•จ์ˆ˜

 

์ƒํƒœ๊ฐ€ ๋ณ€ํ™”๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒƒ์€ React์˜ ๊ธฐ๋ณธ ํŠน์ง•์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง์ด ํ•„์š”์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค๋„ ํ•จ๊ป˜ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ณค ํ•œ๋‹ค. 

๋˜, ํŽ˜์ด์ง€ ์ฒซ ๋กœ๋”ฉ ์‹œ csr๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋น„๊ต์  ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•ด์ง„๋‹ค.

 

๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ธ€ ์ฐธ๊ณ 

 

 

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ž˜์Šค๋กœ ์ •์˜ -> ์ปดํฌ๋„ŒํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋จ
  • ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ -> ์ธ์Šคํ„ด์Šค์˜ ๋‚ด๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ -> ๋ฐ”๋€ ๊ฐ’์— ๋งž์ถฐ ํ™”๋ฉด์ด ๋ฆฌ๋ Œ๋”๋ง

=> ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค๋Š” ์ œ๊ฑฐ๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์žฌ์‚ฌ์šฉ๋จ

 

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜๋กœ ์ •์˜ -> ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • ์ƒํƒœ ๋ณ€๊ฒฝ -> ๊ธฐ์กด์— ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ์ œ๊ฑฐ -> ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ -> ํ™”๋ฉด์— ๋ Œ๋”๋ง

=> ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ๋งค๋ฒˆ ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋“ค๋„ ์ „๋ถ€ ์ƒˆ๋กœ ์„ ์–ธ ๋ฐ ํ• ๋‹น๋จ

=> ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ๋จ => ๋น„ํšจ์œจ ๋ฐœ์ƒ

 


 

์ตœ์ ํ™” ํ•จ์ˆ˜

์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

React์—์„œ ์ œ๊ณตํ•˜๋Š” ์ตœ์ ํ™” ํ•จ์ˆ˜ ์ค‘ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” useMemo(), useCallback(), memo() ๋“ฑ์ด ์žˆ๋‹ค.

 

 

 


 

 


useMemo()

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ (๊ณ„์‚ฐ ๊ฒฐ๊ณผ)๋ฅผ ์ €์žฅํ•˜๋Š” ํ›…์ด๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด useEffect์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ํŠน์ง•...

const ์ €์žฅํ• _ํ˜ธ์ถœ ๊ฒฐ๊ณผ = useMemo(()=>{
	return ํ•จ์ˆ˜ ์ฝ”๋“œ
},[๊ฐ’]) // ์ปดํฌ๋„ŒํŠธ ํ˜ธ์ถœ์‹œ [๊ฐ’]์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค

 

useEffect์™€์˜ ์ฐจ์ด

  useMemo useEffect
์—ญํ•  ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฐ’์„ ๊ธฐ์–ต
+ ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋์„ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์‹œ ๊ณ„์‚ฐ
ํ˜ธ์ถœ ๊ณผ์ •์—์„œ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ชจ์•„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ((api ํ˜ธ์ถœ, ํƒ€์ด๋จธ, ์ด๋ฒคํŠธ ๋“ฑ๋ก ๋“ฑ)
์‹คํ–‰ ์‹œ์  ๋ Œ๋”๋ง ์ค‘์— ์‹คํ–‰ (๋™๊ธฐ์ ) ๋ Œ๋”๋ง ํ›„์— ์‹คํ–‰ (๋น„๋™๊ธฐ์ )
๋ Œ๋”๋ง ์˜ํ–ฅ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ›„ ๋ Œ๋”๋ง์— ์ง์ ‘ ์‚ฌ์šฉ effect๋งŒ ๋ฐœ์ƒํ•˜๋ฉฐ ๋ Œ๋”๋ง์— ์ง์ ‘์ ์ธ ๊ด€์—ฌX

 

 

์˜ˆ์‹œ 1 

์ˆซ์ž์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด counter ์ƒํƒœ์™€ ๊ทธ๋ƒฅ ๋ Œ๋”๋ง์„ ์œ„ํ•œ render ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

function App() {
  const [count, setCount] = useState(0);
  const [rerender, setRerender] = useState(false);

  const plus1 = (count) => {
    console.log('plus1 ์‹คํ–‰');
    return count + 1;
  };
  const countPlus1 = plus1(count);

  return (
    <>
      <div>countPlus1 : {countPlus1}</div>
      <button onClick={() => {
          setCount(count + 1);
        }}>
        count + 1
      </button>
      <button onClick={() => {
          setRerender(!rerender);
        }}>
        Rerender
      </button>
    </>
  );
}

 

 

 

number๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ ๋ฟ๋งŒ์ด ์•„๋‹Œ rerender์˜ ์ƒํƒœ๊ฐ€ false, true๋กœ๋งŒ ๋ฐ”๋€Œ๊ณ  ์žˆ๋Š”๋ฐ

์ด์™€ ๊ด€๋ จ์—†๋Š” plus1์ด ๊ณ„์†ํ•ด์„œ ํ˜ธ์ถœ์ด ๋˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

์˜ˆ์‹œ 1-1 : useMemo ์‚ฌ์šฉ

constPlus1์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด useMemo()๋ฅผ ์‚ฌ์šฉํ•ด ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๊ฐ’์œผ๋กœ count๋ฅผ ๋„ฃ์–ด์คฌ๋‹ค.

  const countPlus1 = useMemo(() => {
    return plus1(count);
  }, [count]);

 

 

 

count์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ plus1์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

useCallback()

ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ €์žฅ 

const ์ €์žฅํ• _ํ•จ์ˆ˜ = useCallback(()=>{
	return ํ•จ์ˆ˜ ์ฝ”๋“œ
},[๊ฐ’]) // ์ปดํฌ๋„ŒํŠธ ํ˜ธ์ถœ์‹œ [๊ฐ’]์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค

 

 

์˜ˆ์‹œ 2

์œ„์˜ ์˜ˆ์‹œ 1-1์—์„œ ์ผ๋˜ ์ฝ”๋“œ์— useEffect๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ plus1 ํ•จ์ˆ˜๊ฐ€ ์–ธ์ œ ์žฌ์ƒ์„ฑ๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ดค๋‹ค.

  useEffect(() => {
    console.log('plus1 ์žฌ์ƒ์„ฑ');
  }, [plus1]);

 

 

rerender ์ƒํƒœ์˜ ๋ณ€๊ฒฝ ์‹œ์—๋„ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์˜ˆ์‹œ 2-1 : ์˜์กด์„ฑ ๋ฐฐ์—ด []

  const plus1 = useCallback(
    (count) => {
      console.log('plus1 ์‹คํ–‰');
      return count + 1;
    }, [],
  );

 

plus1์˜ ์ƒ์„ฑ์€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋„ ๋•Œ ํ•œ๋ฒˆ๋งŒ ์ด๋ฃจ์–ด์ง€๋ฉฐ,

์ดํ›„๋Š” ์ƒํƒœ๋ฅผ ์•„๋ฌด๋ฆฌ ๋ฐ”๋€Œ์–ด๋„ plus1๋งŒ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์˜ˆ์‹œ 2-2 : ์˜์กด์„ฑ ๋ฐฐ์—ด [count]

  const plus1 = useCallback(
    (count) => {
      console.log('plus1 ์‹คํ–‰');
      return count + 1;
    }, [count],
  );

 

count๊ฐ€ ๋ฐ”๋€”๋•Œ๋งŒ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค..

(์ง€๊ธˆ์€ useMemo์—์„œ rerender ๊ฐ’์ด ๋ฐ”๋€”๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ์ž‘์„ฑํ•œ ์ƒํƒœ๋ผ, rerender ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ ๋ฐ”๋€ ๊ฐ’์ด ๋ฆฌ๋ Œ๋”๋œ๋‹ค.)

 

 

์˜ˆ์‹œ 2-3 : ์˜์กด์„ฑ ๋ฐฐ์—ด [rerender]

  const plus1 = useCallback(
    (count) => {
      console.log('plus1 ์‹คํ–‰');
      return count + 1;
    }, [rerender],
  );

 

count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋Š” ์•„๋ฌด์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์ง€๋งŒ rerender๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

memo()

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ

const ์ €์žฅํ• _์ปดํฌ๋„ŒํŠธ = memo((props)=>{
	ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ
}) // ์ปดํฌ๋„ŒํŠธ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋ฐ›์€ props ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค

 

 

 

์˜ˆ์‹œ

์œ„์˜ 2-3์ฝ”๋“œ์—์„œ count๊ฐ’์„ ํ‘œ์‹œํ•ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ countDisplay๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

function App() {
// ์ƒ๋žต.... 
  return (
    <>
      <CountDisplay count={count} />
      <div>countPlus1 : {countPlus1}</div>
      <button onClick={() => {
          setCount(count + 1);
        }}>count + 1</button>
      <button onClick={() => {
          setRerender(!rerender);
        }}>Rerender</button>
    </>
  );
}

const CountDisplay = ({ count }) => {
  return <div>count : {count}</div>;
};

 


์ด ๋•Œ Rerender ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด count (props๋กœ ๋“ค์–ด๊ฐ€์žˆ๋Š”) ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋”๋ผ๋„ ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‹ค.

์ด๋Ÿด ๋•Œ memo๋ฅผ ์“ฐ๋ฉด ๋˜๋Š”๋ฐ, ์œ„์˜ CountDisplay ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

 

const CountDisplay = memo(({ count }) => {
  return <div>count : {count}</div>;
});