useMemo, React.memo

์ด์ง„๊ฒฝยท2023๋…„ 1์›” 30์ผ
0

๐Ÿ‘ฉโ€๐Ÿ’ป REACT

๋ชฉ๋ก ๋ณด๊ธฐ
7/10
post-thumbnail

โœ… useMemo

๐Ÿ‘‰ Memoization

Memoization์ด๋ž€ ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด๋‘๊ณ  ๋™์ผํ•œ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ์žฌํ™œ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.
์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์ค‘๋ณต์—ฐ์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ๏ธ useMemo๋ž€?

useMemo๋Š” ๋ฆฌ์•กํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ›…์ด๊ณ , ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

const value = useMemo(() => fn, [deps])

์—ฌ๊ธฐ์„œ ์˜์กด์„ฑ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

โ‡ useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๋ Œ๋”๋ง๋˜๋Š”๋ฐ, ์ด๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌํ˜ธ์ถœ๋œ๋‹ค๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.
๋•Œ๋ฌธ์— useMemo ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง -> ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ -> memoize๋œ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๊ฑฐ์นœ๋‹ค.

๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํŠน์ • ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ• ๋•Œ๋งŒ ussMemo์— ๋“ฑ๋กํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.


โœ… React.memo

React.memo๋Š” Highter-Oredr Component(HOC) = ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

๐Ÿ‘‰ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ

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

const NewComponent = higherOrderComponent(WrappedComponent);

์ผ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ธ์ž๋กœ ๋ฐ›์€ props๋ฅผ UI์— ํ™œ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด์— ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ์šด ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ ๋‹ค.

๋˜ React.memo๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ผญ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ props๋กœ ์ž์ฃผ ๋ Œ๋”๋ง ๋ ๋•Œ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค ๋ณต์žกํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์•ผ ๋ ๋•Œ

โœ๏ธ React.memo์˜ ์‚ฌ์šฉ๋ฒ•

1๏ธโƒฃ ์–•์€ ๋น„๊ต

const MyComponent = React.memo((props) => {
	return (/*์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ฝ”๋“œ*/)}
);
const TextView = React.memo( ({text}) =>{
    useEffect(()=>{
        console.log(`UpdateText :: Text : ${text}`)
    })
    return <div>{text}</div>
});

const CountView = React.memo( ({count}) =>{
    useEffect(()=>{
        console.log(`UpdateCount :: Count : ${count}`)
    })
    return <div>{count}</div>
});
  • React.memo๋Š” props์— ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚ ๋•Œ๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค.
  • React.memo(๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ)๋ฅผ ์ž…๋ ฅํ•˜๋ฉด props๊ฐ€ ๋ณ€ํ™”ํ•˜์ง€์•Š๊ณ , ๋ฐ˜ํ™”๋˜์ง€ ์•Š์€ ๊ณ ์ฐจ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋Œ๋ ค์ค€๋‹ค. ๋ฌผ๋ก  ์ž๊ธฐ ์ž์‹ ์˜ state๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ๋‹ค)
  • props ํ˜น์€ props์˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ• ๋•Œ ์–•์€๋น„๊ต๋ฅผ ํ•œ๋‹ค.

[React๊ณต์‹๋ฌธ์„œ]
props๊ฐ€ ๊ฐ–๋Š” ๋ณต์žกํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•˜์—ฌ ์–•์€ ๋น„๊ต๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋น„๊ต ๋™์ž‘์„ ์›ํ•œ๋‹ค๋ฉด, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ณ„๋„์˜ ๋น„๊ต ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊นŠ์€ ๋น„๊ต

const areEqual = (prevProps, nextProps) =>{
 return true;  // ์ด์ „ props์™€ ํ˜„์žฌ props๊ฐ€ ๊ฐ™๋‹ค = ๋ฆฌ๋ Œ๋”๋ง x
 return false; // ์ด์ „ props์™€ ํ˜„์žฌ Props๊ฐ€ ๋‹ค๋ฅด๋‹ค = ๋ฆฌ๋ Œ๋”๋ง o
}


์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ CountView๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด CountView์™€ TextView ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค. CountView๋งŒ ์—…๋ฐ์ดํŠธ์‹œํ‚ค๊ณ  TextView๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œํ‚ค์ง€ ์•Š๊ณ  ์‹ถ์„๋•Œ๋Š” useMemo ์™€ React.memo๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

profile
๋ฉ‹์ฐ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž!

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