useMemo Hook์ด ๋ฐ˜ํ™˜๊ฐ’๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ useMemo ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ทœ์น™ ์„ธ๋ถ€ ์‚ฌํ•ญ

useMemo๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€ ๋ถ€์ˆ˜ ํšจ๊ณผSide Effect๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์œผ๋ฉด useMemo๋Š” undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•˜๋ฉฐ, ์ž˜๋ชป๋œ Hook์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ์˜ˆ์‹œ

์ด ๊ทœ์น™์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ฝ”๋“œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// โŒ ๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ
function Component({ data }) {
const processed = useMemo(() => {
data.forEach(item => console.log(item));
// return ๋ˆ„๋ฝ!
}, [data]);

return <div>{processed}</div>; // ํ•ญ์ƒ undefined
}

์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ

์ด ๊ทœ์น™์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// โœ… ๊ณ„์‚ฐ๋œ ๊ฐ’ ๋ฐ˜ํ™˜
function Component({ data }) {
const processed = useMemo(() => {
return data.map(item => item * 2);
}, [data]);

return <div>{processed}</div>;
}

๋ฌธ์ œ ํ•ด๊ฒฐ

์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๋ถ€์ˆ˜ ํšจ๊ณผSide Effect์— useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// โŒ ์ž˜๋ชป๋œ ์˜ˆ์‹œ: useMemo์—์„œ ๋ถ€์ˆ˜ ํšจ๊ณผ
function Component({user}) {
// ๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ, ๋ถ€์ˆ˜ ํšจ๊ณผ๋งŒ
useMemo(() => {
analytics.track('UserViewed', {userId: user.id});
}, [user.id]);

// ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜์ง€ ์•Š์Œ
useMemo(() => {
return analytics.track('UserViewed', {userId: user.id});
}, [user.id]);
}

๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

// โœ… ์ข‹์€ ์˜ˆ์‹œ: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ถ€์ˆ˜ ํšจ๊ณผ
function Component({user}) {
const handleClick = () => {
analytics.track('ButtonClicked', {userId: user.id});
// ๊ธฐํƒ€ ํด๋ฆญ ๋กœ์ง...
};

return <button onClick={handleClick}>Click me</button>;
}

๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ React state๋ฅผ ์™ธ๋ถ€ state์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒฝ์šฐ(๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€) useEffect๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ์‹œ: useEffect์—์„œ ๋™๊ธฐํ™”
function Component({theme}) {
useEffect(() => {
localStorage.setItem('preferredTheme', theme);
document.body.className = theme;
}, [theme]);

return <div>ํ˜„์žฌ ํ…Œ๋งˆ: {theme}</div>;
}