20221102 React Hooks - useMemo, useCallback
Hook์ ๊ท์น
- React ํจ์ ๊ตฌ์ฑ ์์ ๋ด์์๋ง ํธ์ถํ ์ ์์(๋ฐ๋์ Functional Component ์์์ ์ฌ์ฉํด์ผ ํจ)
- ๊ตฌ์ฑ ์์์ ์ต์์์์๋ง ํธ์ถํ ์ ์์
- ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ ์์์ ๋ชป ์
useMemo, useCallback
์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ
useMemo๋ ํน์ ๊ฒฐ๊ณผ๊ฐ์ ์ฌ์ฌ์ฉํ ๋ ์ฌ์ฉ
useCallback์ ํน์ ํจ์๋ฅผ ์๋ก ๋ง๋ค์ง ์๊ณ ์ฌ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
memoization (๋ฉ๋ชจ์ด์ ์ด์ )
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค. ๋์ ๊ณํ๋ฒ์ ํต์ฌ์ด ๋๋ ๊ธฐ์ ์ด๋ค.
- ์์ฃผ ํ์ํ ๊ฐ์ ์บ์ฑํด ๋์ด์ ๊ทธ ๊ฐ์ ๋ค์ ๊ณ์ฐํ๋๊ฒ ์๋๋ผ ์บ์๋ฅผ ๊บผ๋ด ์ฐ๋ ๊ฒ
useMemo
- ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง์ด ๋ ๋ > Component ํจ์ ํธ์ถ > ๋ชจ๋ ๋ด๋ถ ๋ณ์ ์ด๊ธฐํ
- memoization์ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ํ ๋ ์ฌ์ฌ์ฉํจ > ์ต์ ํ๋ ๋ชจ๋ ๋ ๋๋ง ์์ ๊ณ ๋น์ฉ ๊ณ์ฐ์ ๋ฐฉ์ง
- useMemo๋ก ์ ๋ฌ๋ ํจ์๋ ๋ ๋๋ง ์ค์ ์คํ
- ์ฝ๋ฐฑํจ์์, ์์กด์ฑ๋ฐฐ์ด[]์ ๊ฐ์ง
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ '๊ฐ'์ ๋ฐํ
import { useState, useMemo } from "react";
import ReactDOM from "react-dom/client";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
//useMemo ์ฒซ๋ฒ์งธ ์ธ์ ์ฝ๋ฐฑํจ์, ๋๋ฒ์งธ์ธ์ ์์กด์ฑ๋ฐฐ์ด []
const calculation = useMemo(() => expensiveCalculation(count), [count]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
<h2>Expensive Calculation</h2>
{calculation}
</div>
</div>
);
};
const expensiveCalculation = (num) => {
console.log("Calculating...");
for (let i = 0; i < 1000000000; i++) {
num += 1;
}
return num;
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
useCallback
- useMemo์ ์ ์ฌํจ ๋์ ์ธ์๋ก ์ ๋ฌํ ์ฝ๋ฐฑํจ์ ๊ทธ ์์ฒด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํจ
- ์ฝ๋ฐฑํจ์์, ์์กด์ฑ๋ฐฐ์ด[]์ ๊ฐ์ง
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ 'ํจ์'๋ฅผ ๋ฐํ
ํจ์๋ฅผ ๋งค๋ฒ ์๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๋ํ๋์ ๋ฆฌ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ํจ์๋ฅผ ์์ฑ
const handleLoad = useCallback((option) => {
// ...
}, [dep1, dep2, dep3, ...]);
์ฐธ๊ณ ๋ฐ ์ถ์ฒ
https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98
๋ฉ๋ชจ์ด์ ์ด์ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ๋ฉ๋ชจ์ด์ ์ด์ (memoization)์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ
ko.wikipedia.org
https://ko.reactjs.org/docs/hooks-reference.html#usememo
https://www.w3schools.com/react/react_usememo.asp
https://ko.reactjs.org/docs/hooks-reference.html#usecallback
https://www.w3schools.com/react/react_usecallback.asp