๐Ÿ’ป React - ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)

waterglassesยท2022๋…„ 5์›” 27์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
30/50
post-thumbnail

โš ๏ธ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์€ ์˜คํƒ€๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ƒ ์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ ๊ฒƒ

  1. useMemo
  2. React.memo
  3. useCallback

0. ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)

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

React์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•
1. useMemo
2. React.memo
3. useCallback

1. useMemo

useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ „ ๊ฐ’์„ ๊ธฐ์–ตํ•ด๋‘์—ˆ๋‹ค๊ณ  ์กฐ๊ฑด์— ๋”ฐ๋ผ ์žฌํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฉ”๋ชจ์ด์ฆˆ ๋œ ๊ฐ’์„ returnํ•˜๋Š” Hook์ด๋‹ค.

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

2์ „์จฐ ์ธ์ž๋กœ ๋„˜์–ด์˜จ ์˜์กด ์ธ์ž ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด 1๋ฒˆ์งธ ์ธ์ž์˜ ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•œ๋‹ค. ๋งŒ์•ฝ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋งค๋ฒˆ ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐํ•˜์—ฌ returnํ•œ๋‹ค.

2. React.memo

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

const Component = React.memo((props) => {
	return (/*์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ฝ”๋“œ*/)}
);

์ด์ „๊ณผ ๊ฐ™์€ props๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์„ ์Šคํ‚ตํ•˜๊ณ  ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
๋‹ค๋งŒ, ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ useState๊ฐ™์€ ํ›…์„ ์‚ฌ์šฉํ•  ๋•Œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.

3. useCallback

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

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

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ name๊ณผ age๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

useMemo๋Š” ํ•จ์ˆ˜์˜ ์—ฐ์‚ฐ๋Ÿ‰์ด ๋งŽ์„ ๋•Œ ์ด์ „ ๊ฒฐ๊ณผ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์ด๊ณ  useCallback์€ ํ•จ์ˆ˜๊ฐ€ ์žฌ์ƒ์„ฑ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋‹ค.

๐Ÿ”ฅ ๋Š๋‚€์ 

๋ฆฌ์•กํŠธ ํ›…์„ ์‚ฌ์šฉํ•  ๋•Œ useState, useEffect ๋งŒ ๋งŽ์ด ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋‚˜๋จธ์ง€๋Š” ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋Š”๋ฐ ์ƒˆ๋กญ๊ฒŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋˜์–ด ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ์—๋Š” ์ตœ์ ํ™”์— ์กฐ๊ธˆ ๋” ์‹ ๊ฒฝ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋งํ•˜๋ฉด์„œ ๋ฐฐ์›Œ์š” ์Šคํ„ฐ๋””์—์„œ ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๊ธฐ๋กœ ํ•˜์˜€๋Š”๋ฐ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜์—ฌ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์˜ค๋Š˜๋„ ์ˆ˜๊ณ ํ–ˆ๋‹ค~

Refer

profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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