Hook Series 5 : useMemo์™€ memoization๐Ÿ“

๋ฐ๊ฐฑยท2025๋…„ 2์›” 20์ผ
0

REACT

๋ชฉ๋ก ๋ณด๊ธฐ
9/9

1. memoization๐Ÿ—ƒ๏ธ

01. memoization์ด๋ž€?

memoization์€ React ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ๋กœ, ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ(์บ์‹ฑ caching)ํ•˜์—ฌ ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ์š”๊ตฌํ•  ๋•Œ, ๊ณ„์‚ฐ์„ ๋‹ค์‹œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ค.

*์บ์‹œ Cache๋ž€? : ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด ๋†“๋Š” ์ž„์‹œ ์žฅ์†Œ. ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋‚˜ ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ์ €์žฅ ๊ณต๊ฐ„์œผ๋กœ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ž„์‹œ๋กœ ์ €์žฅํ•ด๋‘๋Š” ๊ฒƒ์„ "์บ์‹ฑ caching"์ด๋ผ๊ณ  ํ•œ๋‹ค.

02. memoization์„ ์ ์šฉํ•  ๋•Œ

  • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”
  • ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹œ๋ณด๋“œ
  • ๋‹ค์ˆ˜์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ

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

2. useMemo : React์˜ memoization API๐Ÿ”–

01. React.memo

React.memo๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ง•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, props์˜ ๋ณ€๊ฒฝ์ด ์—†๋‹ค๋ฉด ์ด์ „ ๋ Œ๋”๋ง์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” ๋‹ค์ˆ˜์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์ง€๋งŒ, ๋‚ด๋ถ€ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ• : React.๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค!
const App = (props) => {
    // ๋ Œ๋”๋ง ๋กœ์ง...
};

export default React.memo(App);
    

const App = memo((props) => {
	//๋ Œ๋”๋ง ๋กœ์ง...
});

02. useMemo

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

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
const ์ด๋ฆ„ = useMemo(์ฝœ๋ฐฑํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด)

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

03. useCallback

useCallback์€ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ง•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ ๋งˆ๋‹ค ์ˆœ์ฐจ์ ์œผ๋กœ ๋ Œ๋”๋ง์„ ํ•˜๋Š”๋ฐ, ์ด๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋ฉฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊นŒ์ง€ ์•ผ๊ธฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, useCallback์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ง•ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
useCallback๋„ ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์œผ๋ฉฐ, ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•œ๋‹ค.

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
const ์ด๋ฆ„ = useCallback(์ฝœ๋ฐฑํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด)

const [name, setName] = useState('');
const [age, setAge] = useState(0);
const onSave = useCallback(() => saveUserInfo(name, age), [name, age]);

04. ์ •๋ฆฌ

API๋ฉ”๋ชจ์ด์ง• ๋Œ€์ƒ์ธ์ž
React.memo์ปดํฌ๋„ŒํŠธํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ
useMemo๊ณ„์‚ฐ ๊ฐ’(ํ•จ์ˆ˜ return ๊ฐ’)์ฝœ๋ฐฑํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด
useCallbackํ•จ์ˆ˜์ฝœ๋ฐฑํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด

memoization ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 1
memoization ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 2
memoization ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 3
์บ์‹œ/์บ์‹ฑ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

profile
๋ฏธ์ˆ  ์ „๊ณต์—์„œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ๊นŒ์ง€

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