Intro
๋ฆฌ์กํธ์์ useMemo์ React.memo์ ๋ํด ํ์ตํ๋ค.
๊ฐ์๋ ๊ธธ์ง ์์์ง๋ง ์กฐ๊ธ ํท๊ฐ๋ฆฌ๊ธฐ ์์ํ๋ฐ.. ๊ผผ๊ผผํ ๋ณต์ต์ ํด์ผ๊ฒ ๋ค.
์ค๋ ํ์ตํ ๋ด์ฉ
: API ํธ์ถํ๊ธฐ, Memoization(useMemo, React.memo)
React์์ API ํธ์ถํ๊ธฐ
์ธ๋ถ ๋ชฉํ
- useEffect๋ฅผ ์ด์ฉํ์ฌ ์ปดํฌ๋ํธ Mount ์์ ์ API๋ฅผ ํธ์ถํ๊ณ
- ํด๋น API ๊ฒฐ๊ณผ๊ฐ์ ์ผ๊ธฐ ๋ฐ์ดํฐ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ด์ฉํ๊ธฐ
JSONPlaceholder: APIํธ์ถ ํ ์คํธ๋ฅผ ์ํด ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ REST API ์๋น์ค
https://jsonplaceholder.typicode.com/
JSONPlaceholder - Free Fake REST API
{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. Serving ~2 billion requests each month.
jsonplaceholder.typicode.com
API ํธ์ถ ์์)
const getData = async () => {
const res = await fetch('https://jsonplaceholder.typicode.com/comments').then((res) => res.json());
console.log(res);
};
useEffect(() => {
getData();
}, []);
: fetchํจ์๋ก API๋ฅผ ํธ์ถํ๊ณ Mount ์์ ์ API๋ฅผ ํธ์ถํ๋ ํจ์์ธ getData๋ฅผ ํธ์ถํ๊ธฐ ์ํด useEffect๋ฅผ ์ด์ฉํ๋ค.
React Developer Tools: ๋ฆฌ์กํธ ๊ฐ๋ฐํ ๋ ์ ์ฉํ ํฌ๋กฌ ํ์ฅ ์ฑ
https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi
React Developer Tools
Adds React debugging tools to the Chrome Developer Tools. Created from revision 993c4d003 on 12/5/2023.
chrome.google.com
์ต์ ํ1 - ์ฐ์ฐ ๊ฒฐ๊ณผ ์ฌ์ฌ์ฉ (useMemo)
์ธ๋ถ ๋ชฉํ
- ํ์ฌ ์ผ๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ํจ์๋ฅผ ์ ์ํ๊ณ ํด๋น ํจ์๊ฐ ์ผ๊ธฐ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๋ณํํ์ง ์์ ๋ ๊ฐ์ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ๊ธฐ
โ Memoization ์ดํดํ๊ธฐ!
: ์ด๋ฏธ ๊ณ์ฐ ํด ๋ณธ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ต ํด ๋์๋ค๊ฐ ๋์ผํ ๊ณ์ฐ์ ์ํค๋ฉด, ๋ค์ ์ฐ์ฐํ์ง ์๊ณ ๊ธฐ์ต ํด ๋์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ ์ํค๊ฒ ํ๋ ๋ฐฉ๋ฒ
// data.length๊ฐ ๋ณํํ ๋๋ง ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋จ
const getDiaryAnalysis = useMemo(() => {
console.log('์ผ๊ธฐ ๋ถ์ ์์');
const goodCount = data.filter((item) => item.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return { goodCount, badCount, goodRatio };
}, [data.length]);
// getDiaryAnalysis๋ useMemo๋ฅผ ์ฌ์ฉํด ๊ฐ์ ๋ฆฌํดํจ
const { goodCount, badCount, goodRatio } = getDiaryAnalysis;
์ต์ ํ2 - ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ (React.memo)
state๊ฐ ๋ณ๊ฒฝ๋ผ ๋ฆฌ๋ ๋๋ ํ์ ์๋ TextView ์ปดํฌ๋ํธ๊น์ง ๋ ๋๋ง ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด React.memo๋ฅผ ์ฌ์ฉํจ
React.memo: ํจ์ํ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฐ์ดํธ ์กฐ๊ฑด์ ๊ฑธ์
https://ko.legacy.reactjs.org/docs/react-api.html#reactmemo
React ์ต์์ API – React
A JavaScript library for building user interfaces
ko.legacy.reactjs.org
import React, { useEffect, useState } from 'react';
const CounterA = React.memo(({ count }) => {
useEffect(() => {
console.log(`CounterA update - count: ${count}`);
});
return <div>{count}</div>;
});
const CounterB = React.memo(({ obj }) => {
useEffect(() => {
console.log(`CounterB update - count: ${obj.count}`);
});
return <div>{obj.count}</div>;
});
const OptimizeTest = () => {
const [count, setCount] = useState(1);
const [obj, setObj] = useState({
count: 1,
});
return (
<div style={{ padding: 50 }}>
<div>
<h2>Counter A</h2>
<CounterA count={count} />
<button onClick={() => setCount(count)}>A button</button>
</div>
<div>
<h2>Counter B</h2>
<CounterB obj={obj} />
<button
onClick={() =>
setObj({
count: obj.count,
})
}
>
B button
</button>
</div>
</div>
);
};
export default OptimizeTest;
CounterA ์ปดํฌ๋ํธ๋ ๋ฒํผ์ ๋๋ ์ ๋ count ๊ฐ์ด ๋ณํ์ง ์์์ผ๋ฏ๋ก ๋ ๋๋ง๋์ง ์์
CounterB ์ปดํฌ๋ํธ๋ ๋ฒํผ์ ๋๋ ์ ๋ CounterA์ ๋ฌ๋ฆฌ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๊ณ ๋ฆฌ๋ ๋๋ง ๋จ โก๏ธ ๊ฐ์ฒด ์์ ๋ณต์ฌ
props๊ฐ ๊ฐ๋ ๋ณต์กํ ๊ฐ์ฒด์ ๋ํด ์์ ๋น๊ต๋ง์ ์ํํ๋ ๊ฒ์ด React.memo์ ๊ธฐ๋ณธ ๋์์ด๋ค. ๋ค๋ฅธ ๋น๊ต ๋์์ ์ํ๋ค๋ฉด, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณ๋์ ๋น๊ต ํจ์๋ฅผ ์ ๊ณตํ๋ฉด ๋๋ค.
- areEqual
import React, { useEffect, useState } from 'react';
const CounterB = ({ obj }) => {
useEffect(() => {
console.log(`CounterB update - count: ${obj.count}`)
});
return <div>{obj.count}</div>;
}
const areEqual = (prevProps, nextProps) => {
return prevProps.obj.count === nextProps.obj.count;
}
const MemoizedCounterB = React.memo(CounterB, areEqual)
const OptimizeTest = () => {
const [obj, setObj] = useState({
count: 1,
});
return (
<div style={{ padding: 50 }}>
<div>
<h2>Counter B</h2>
<MemoizedCounterB obj={obj} />
<button onClick={() => setObj({ count: obj.count })}></button>
</div>
</div>
);
};
export default OptimizeTest;
๋ง๋ฌด๋ฆฌ
React ์ต์ ํ ๋ฐฉ๋ฒ์ผ๋ก useMemo์ React.memo์ ๋ํด ๋ฐฐ์ ๋ค.
๋ ๋๋ง์ ๋ง์ด ํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๋ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํญ์ ๋ ๋๋ง์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ฉฐ ์ฝ๋๋ฅผ ์ง์ผ๊ฒ ๋ค.
