useMemo ์ฌ์ฉ ๋ชฉ์
useMemo๋ React์์ ์ ๊ณตํ๋ ํ (Hook) ์ค ํ๋๋ก, ์ฃผ๋ก ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
- ๊ณ์ฐ ๋น์ฉ์ด ๋์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด - ๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฐ์ฐ์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฌ์ฉํด์ผ ํ๋ค๋ฉด useMemo๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํ์ํ ๋ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ฐธ์กฐ ๋์ผ์ฑ(Reference Equality)์ ์ ์งํ๊ธฐ ์ํด - React์์ ๊ฐ์ฒด๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ ์ props๋ก ๋๊ธธ ๋, ์ด ๋ฐ์ดํฐ๊ฐ ๋งค๋ฒ ์๋ก ์์ฑ๋๋ฉด ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ์ฌ๋ ๋๋ง๋ ์ ์๋ค. useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ฉด, ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํด๋ ๋์ผํ ์ฐธ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค.
useMemo ์ฌ์ฉ๋ฒ ์์ ์ฝ๋
import React, { useState, useMemo } from 'react';
function ExpensiveComponent() {
const [count, setCount] = useState(0);
// ๊ณ์ฐ ๋น์ฉ์ด ๋์ ํจ์
const expensiveCalculation = (num) => {
console.log('Calculating...');
return num * 2; // ๋ณต์กํ ๊ณ์ฐ์ ๊ฐ์
};
// useMemo๋ฅผ ์ฌ์ฉํ์ฌ expensiveCalculation์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ
const calculatedValue = useMemo(() => expensiveCalculation(count), [count]);
return (
<div>
<p>Count: {count}</p>
<p>Calculated Value: {calculatedValue}</p>
<button onClick={() => setCount(count + 1)}>Increase</button>
</div>
);
}
export default ExpensiveComponent;
์ด ์ฝ๋์์๋ useState๋ฅผ ์ฌ์ฉํ์ฌ count ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ค. expensiveCalculation ํจ์๋ ๊ณ์ฐ ๋น์ฉ์ด ๋์ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ฉฐ, ์ด ํจ์์ ๊ฒฐ๊ณผ๋ useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ๋๋ค. useMemo์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์คํํ ํจ์์ด๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ ์์กด์ฑ ๋ฐฐ์ด์ด๋ค. ์ด ๋ฐฐ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํจ์๊ฐ ๋ค์ ์คํ๋๋ค. ์ด ์์์์๋ count๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค expensiveCalculation ํจ์๊ฐ ๋ค์ ์คํ๋์ด ๊ฒฐ๊ณผ๊ฐ ๊ฐฑ์ ๋๋ค.
์ด์ ๊ฐ์ด useMemo๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํด๋ ๊ณ์ฐ ๋น์ฉ์ด ๋์ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด ์ฑ๋ฅ ์ต์ ํ์ ๋์์ด ๋๋ค.
๋น ์์กด์ฑ ๋ฐฐ์ด ์ฌ์ฉ : ์ด๊ธฐ ๋ง์ดํธ ์
useMemo์์ ๋น ์์กด์ฑ ๋ฐฐ์ด([])์ ์ฌ์ฉํ๋ฉด, ์ด ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ์ปดํฌ๋ํธ์ ๋ง์ดํธ ๋จ๊ณ์์๋ง ๊ณ์ฐ๋๊ณ ์์ฑ๋๋ค. ์ฆ, ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋ ํ ๋ฒ๋ง ์คํ๋๋ฉฐ, ๊ทธ ํ์๋ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋์ด๋ useMemo ๋ด๋ถ์ ํจ์๊ฐ ๋ค์ ์คํ๋์ง ์์์ ์๋ฏธํ๋ค.
import React, { useState, useMemo } from 'react';
function ExpensiveComputationComponent() {
const [count, setCount] = useState(0);
// ๊ณ์ฐ ๋น์ฉ์ด ๋์ ํจ์
const computeExpensiveValue = (value) => {
console.log('Computing expensive value...');
return value * 2; // ๋ณต์กํ ๊ณ์ฐ์ ๊ฐ์
};
// useMemo๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ
// ๋น ์์กด์ฑ ๋ฐฐ์ด([])์ ์ ๊ณตํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋๋ง ๊ณ์ฐ
const expensiveValue = useMemo(() => computeExpensiveValue(count), []);
return (
<div>
<p>Count: {count}</p>
<p>Expensive Value: {expensiveValue}</p>
<button onClick={() => setCount(count + 1)}>Increase Count</button>
</div>
);
}
export default ExpensiveComputationComponent;