์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ์น๊ฐ๋ฐ
- css
- node.js ์ด๊ธฐ์ค์
- ์๊ณ ๋ฆฌ์ฆ
- react_useeffect
- props {}
- JavaScript
- html
- map()ํจ์
- ์ ๋ก์ท-์์ท-ํจ์ท
- react_usecallback
- C++
- ๋ฏธ๋์ด์ฟผ๋ฆฌ
- vercel
- branch ํฉ์น๊ธฐ
- server๋น๊ต
- react_usememo
- ์ปค๋ฐ๋ฉ์์ง ๋ณ๊ฒฝํ๊ธฐ
- ์น๊ฐ๋ฐ๊ณต๋ถ
- ์ฐจ๋ฑํ๋ผ์ด๋ฒ์
- ๋ด๋๋ด์ฐ
- react_usereducer
- js
- java
- React
- ์์์ปค๋ฐ ์๋ฐฉํฅ ์ฌ๋ฐฐ์น ์ค๋ฅ
- DB
- ์์คํธ๋ฆฌ
- ์๋ฐ
- ์ฝ๋ฆฐ์ด
- Today
- Total
Soony's House
[React] useMemo (ft. ์ฌ์ฐ์ฐ ์ต์ ํ) ๋ณธ๋ฌธ
๐ก์ต์ ํ
์ฝํ ๋ฅผ ์ค๋นํ๋ฉด์๋, ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ๋ฉด์๋ ํญ์ ์ ๊ฒฝ์จ์ผํ๋ค๊ณ ๋๋ํ ๋ค์ ์ฝ๋ ์ต์ ํ.. ! ๋๋ฅ..
๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ์ญ์ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
๋ฆฌ์กํธ์์๋ '๋ ๋๋ง๊ณผ ์ฐ์ฐ'์ด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค.
ํนํ, ์ํ( state) ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ถํ์ํ ์ฐ์ฐ์ด๋ ๋ ๋๋ง์ด ๋ฐ๋ณต๋๋ฉด ์ ์ฒด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
๋ฆฌ์กํธ ์ต์ ํ๋ฅผ ์ํด ์ง์ํด์ผํ ์์๋ค์ ์๋์ ๊ฐ๋ค.
1. ๋ถํ์ํ ๋ ๋๋ง
2. ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ถํ์ํ ์ฐ์ฐ
3. ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ถํ์ํ ํจ์ ์ฌ์์ฑ
์ด์ค useMemo ํ ์ React์ ๋ถํ์ํ ์ฐ์ฐ์ ๋ง์ ์ต์ ํํ๋ค.
๐กuseMemo
: ํน์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ (memoization) ํ์ฌ ๋ถํ์ํ ์ฐ์ฐ(์ฌ์ฐ์ฐ)์ ๋ฐฉ์งํ๋ React Hook.
-> ์์กด์ฑ ๋ฐฐ์ด์ ๋ช ์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋์๋ง ์ฝ๋ฐฑ ํจ์์ ํด๋น ์ฐ์ฐ์ ๋ค์ ์ํํ๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด, ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํจ.
*์๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํจ์ ๋ด๋ถ์ ์ฐ์ฐ์ด ํญ์ ์ฌ์คํ๋๋๋ฐ,
์ด ๊ณผ์ ์์ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ด ๋ฐ๋ณต๋๊ฑฐ๋ ๋ถํ์ํ ๋ฐฐ์ด ํ์์ด ์ง์์ ์ผ๋ก ๋ฐ์ํ๋ฉด ์ฑ๋ฅ์ ๋ถ๋ด์ด๋จ.
useMemo๋ ์๋์ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ง๋ค.
const memoizedValue = useMemo(() => {
// ์ฐ์ฐํ ๋ด์ฉ
return ๊ณ์ฐ๋๊ฐ;
}, [์์กด์ฑ๊ฐ1, ์์กด์ฑ๊ฐ2]);
- ์ฒซ ๋ฒ์งธ ์ธ์๋ ์ฐ์ฐ์ ์ํํ๋ ํจ์์ด๋ค.
- ๋ ๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด์, ํด๋น ๊ฐ๋ค ์ค ํ๋๋ผ๋ ๋ณ๊ฒฝ๋์์ ๋๋ง ์ฒซ ๋ฒ์งธ ํจ์๊ฐ ๋ค์ ์คํ๋๋๋ก ํ๋ค.
- useMemo๋ ๊ณ์ฐ๋ ๊ฐ์ memoizedValue์ ์ ์ฅํ๊ณ , ํ์ ์ ์ด๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
์ฐ ์์๋ก ์ฝ๋ ๋์์ ํ์ ํด๋ณด์!
ex.
Todo List ์ฑ์์ ์๋ฃํ ์ผ, ์๋ฃํ์ง ์์ ์ผ, ์ ์ฒด ํ ์ผ์ ๊ฐ์๋ฅผ ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ฝ๋์์ useMemo๋ฅผ ์ ์ฉ์ํฌ ๊ฒ์.
const { totalCount, doneCount, notDoneCount } = useMemo(() => {
console.log("getAnalyzedData ํธ์ถ!");
const totalCount = todos.length;
const doneCount = todos.filter((todo) => todo.isDone).length;
const notDoneCount = totalCount - doneCount;
return {
totalCount,
doneCount,
notDoneCount
};
}, [todos]);
- todos ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋์๋ง ์ฐ์ฐ์ ๋ค์ ์ํํจ. -> ์์กด์ฑ ๋ฐฐ์ด
- ์๋ฃ๋ ํญ๋ชฉ๊ณผ ๋ฏธ์๋ฃ ํญ๋ชฉ์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ ๋ก์ง์ filter()๋ฅผ ํตํด ๋ฐ๋ณต ์ฐ์ฐ์ ํฌํจํ๋ฏ๋ก, ์ํ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์๋ค. (๋ฐฐ์ด์ ๊ณ์ํด์ ์ ์ฒด ํ์ํ๊ธฐ ๋๋ฌธ..;)
- ์ด๋ฅผ useMemo๋ก ๊ฐ์ธ๋ฉด, todos๊ฐ ๋ฐ๋์ง ์๋ ํ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ์ฌ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
๊ทผ๋ฐ ์๊ฐํด๋ณด๋ ์ ์ ์ ์ filter()๋ก ๊ฒ์ ๊ธฐ๋ฅ ๋ง๋ค์ด ๋์๋๊ฒ ์๊ฐ๋ฌ๋ค.
๐ก๊ฒ์ ๊ธฐ๋ฅ๊ณผ useMemo๋ ํจ๊ป ์จ์ผ ํ ๊น?
const getFilteredData = () => {
if (search === "") return todos;
return todos.filter((todo) =>
todo.content.toLowerCase().includes(search.toLowerCase())
);
};
const FilteredTodos = getFilteredData();
๊ฒ์ ๊ธฐ๋ฅ์ filter() ์ญ์ useMemo๋ ํจ๊ป ์ฐ๋๊ฒ ์ข์๊น? ๊ถ๊ธํด์ ์ฐพ์๋ณด์์.
๊ฒฐ๋ก :
ํํฐ๋ง ๋ก์ง ์์ฒด์, ์ ๋ ฅ๊ฐ( ๊ฒ์์ฐฝ์ ์ ๋ ฅ๋๋ ๊ฐ) ์ด ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ๋์ํ๋ ๊ฒ๊น์ง๋ ์์ฐ์ค๋ฌ์ด UX ํ๋ฆ์ผ๋ก ๋ณผ ์ ์๋ค๊ณ ํ๋ค.
BUT ,
๋ง์ฝ Todo ํญ๋ชฉ์ด ์ ๋ฐฑ๊ฐ ์ด์์ผ๋ก ๋์ด๋๋ ์ํฉ์ด๋ผ๋ฉด, ์ด๊ฑด ๋์ด์ ๋จ์ ๊ฒ์ ๊ธฐ๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ useMemo๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํด์ง!
search ๋๋ todos๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ํํฐ๋ง ์ฐ์ฐ์ ์ํํ๋๋ก u
seMemo๋ก ๊ฒ์๊ธฐ๋ฅ์ ๊ฐ์ธ ๋ณด์๋ค.
const filteredTodos = useMemo(() => {
if (search === "") return todos;
return todos.filter((todo) =>
todo.content.toLowerCase().includes(search.toLowerCase())
);
}, [search, todos]);
์์ฒ๋ผ useMemo๋ก ๊ฐ์ธ๋ ๊ฒฝ์ฐ,
์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ๋ search์ todos๋ ๋ ์ค ํ๋๋ง ๋ณ๊ฒฝ๋์ด๋ ์ฐ์ฐ์ด ๋ค์ ์ํ๋จ.
search ๊ฐ ๋ฐ๋๋ฉด → ํํฐ๋ง ๊ธฐ์ค(๊ฒ์์ด)์ด ๋ฌ๋ผ์ง, ์ฐ์ฐ ๋ค์ ์ํ
todos๊ฐ ๋ฐ๋๋ฉด → ํํฐ๋ง ๋์ ๋ชฉ๋ก์ด ๋ฐ๋, ์ฐ์ฐ ๋ค์ ์ํ
ํ์ง๋ง ๊ธฐ์ตํ ๊ฑด ๋ฌด์กฐ๊ฑด useMemo๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋,
์ฝ๋ ํ๋ฆ , ์ฑ๋ฅ์ ๋ฐ์ ธ๊ฐ๋ฉฐ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ โบ๏ธ
๐ก์ ๋ฆฌ
React์ useMemo ํ ์ ๋จ์ํ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋๊ตฌ๊ฐ ์๋๋ผ,
์ปดํฌ๋ํธ์ ๋์์ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ์ค์ํ ์๋จ.
Q. ์ธ์ ์๋๊น?
- ๋ฐ๋ณต์ ์ธ ์ฐ์ฐ์ด ์๋ ๊ฒฝ์ฐ
- ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ณํ์ง ์์๋ ์์ฃผ ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ
- ๋ฆฌ์คํธ๋ ํ ์ด๋ธ์ฒ๋ผ ํญ๋ชฉ์ด ๋ง์์ง ์ ์๋ ๊ตฌ์กฐ
์ด๋ฐ ์ํฉ์์๋ useMemo์ ๋์ ์ด ํ์์ ์ด๋ค.
๋จ, ๋ชจ๋ ๊ณ์ฐ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์คํ๋ ค ์ฝ๋ ๋ณต์ก๋๋ง ๋์ผ ์ ์์ผ๋ฏ๋ก, ์ฐ์ฐ ๋น์ฉ๊ณผ ๋น๋๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
*Ref
https://ko.react.dev/reference/react/useMemo
useMemo – React
The library for web and native user interfaces
ko.react.dev
์ค๋ช ์ด ๋ถ์กฑํ ๋ถ๋ถ์ด๋ ํผ๋๋ฐฑ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์!
๊ฐ์ฌํฉ๋๋ค โบ๏ธ
'โ๏ธFrontend > REACT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] React.memo์ useCallback (ft. ๋ฆฌ๋ ๋๋ง ์ต์ ํ) (0) | 2025.05.27 |
---|---|
[React] useReducer (0) | 2025.05.26 |
[React] useEffect (๋ผ์ดํ์ฌ์ดํด, Dependency array) (2) | 2025.05.22 |
[React] Props ์ ๋ฌ ์ {} ์ฌ์ฉํ๋ ์ด์ / map() ํจ์ (5) | 2025.05.19 |
[React] React Hook๊ณผ Custom Hook (4) | 2025.05.14 |