์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- BFS
- git
- CS
- Javascript
- cpu
- ์ผ๋์
- KAKAO
- ์ปดํจํฐ๊ณผํ
- ๋ฐฑ์ค
- github
- ์๊ณ ๋ฆฌ์ฆ
- ์ฝ๋ฉํ ์คํธ
- computerscience
- CSS
- ๋ถํธ์บ ํ
- js
- html/css/js
- ๋๋น์ฐ์ ํ์
- ์ปดํจํฐ๊ณตํ
- nodejs
- ํ๋ก ํธ์๋๊ฐ๋ฐ์
- ํธ์ด์คํ
- ๊ตญ๋น์ง์
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊ทธ๋ฆฌ๋
- LinkSnap
- ๊ตญ๋น์ง์์ทจ์
- DFS
- ํจ์คํธ์บ ํผ์ค
- ์ฝํ
- Today
- Total
My Boundary As Much As I Experienced
๋ฆฌ์กํธ ๋ ๋๋ง์ ๋ํ ํด์ฆ์ผ. ์์ ์ฌ๋ ๋๊ฐ ์ ์ผ์ด๋๊ฒ ํ๋ ค๋ฉด?(useCallback, React.memo) ๋ณธ๋ฌธ
๋ฆฌ์กํธ ๋ ๋๋ง์ ๋ํ ํด์ฆ์ผ. ์์ ์ฌ๋ ๋๊ฐ ์ ์ผ์ด๋๊ฒ ํ๋ ค๋ฉด?(useCallback, React.memo)
Bumang 2024. 5. 15. 01:39๐งโ๏ธ ํน์ฌ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํด์ฆ. ๋ถ๋ชจ๊ฐ ์ฌ๋ ๋๋๋ฉด ์์๋ค์ ์ฌ๋ ๋๋ ๊น ์ ๋ ๊น?
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ ๋ ๋๋ค. ์ฌ๋ ๋๋ฅผ ๋ง๊ธฐ ์ํด 'useCallback' ํน์ 'React.memo'๋ฅผ ์ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ถ๋ชจ๊ฐ ์์ํํ prop์ ์๋ฌด๊ฒ๋ ์ ๋ด๋ ค์ฃผ๊ณ ์๊ณ ์์์ ๊ทธ์ ๋ถ๋ชจ์๊ฒ ๋ง์ดํธ๋ง ๋์ด์๋ค๊ณ ์น์.
๋ถ๋ชจ์ state๋ค์ ์ฌ์ค ์์์๊ฒ ํ๋ฑ ์๊ด์์ง๋ง ๋ถ๋ชจ์ state๊ฐ ๋ฐ๋์ด ์ฌ๋ ๋๋๋ฉด ์์๋ ์ฌ๋ ๋๋๋ค.
์ปดํฌ๋ํธ ์ฌ๋ ๋๋ฅผ ๋ง๊ธฐ์ํ ๋ํ์๋จ React.memo
์ด๊ฑธ ๋ง๊ธฐ ์ํด ์ฐ๋ ๊ฒ์ด React.memo์ด๋ค. ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํด๋๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
์ฝ๊ฒ ๋งํด ์บ์ฑํด๋๊ณ ๋ณํ์ง ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ ์์๋ ์ด์ ์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ์๋ฌด๋ฐ prop๋ ๋ฐ์ง ์๋ ์์์ปดํฌ๋ํธ์ ์์์ด๋ค.
React.memo๋ก ChildComponent์ ์ฌ๋ ๋๋ฅผ ๋ฐฉ์งํ๋ค. ์ ์ญ์ ํฌ์คํธ์ ๋ฉ๋ชจํด๋๋ ๋ฏ์ด.
// React.Memo
const ChildComponent = React.memo(() => {
console.log('ChildComponent rendered');
return <div>I am the child component.</div>;
});
const ParentComponent = () => {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
{/* ์ฌ์ค ์๋ฌด๋ฐ prop๋ ๋ฐ๊ณ ์์ง ์๋ค. */}
<ChildComponent />
</div>
);
};
React.memo๋ฅผ ํด๋์๋ ์ฌ๋ ๋๊ฐ ์ผ์ด๋๋ ์๊ฐ: ๋ฐ๋ Prop์ด ๋ฐ๋
// count๋ผ๋ prop์ ๋ฐ๋๋ค.
const ChildComponent = React.memo(({ count }) => {
console.log('ChildComponent rendered');
return <div>I am the child component.</div>;
});
const ParentComponent = () => {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
{/* ์ฌ์ค ์๋ฌด๋ฐ prop๋ ๋ฐ๊ณ ์์ง ์๋ค. */}
<ChildComponent count={count} />
</div>
);
};
์ ์์์์ ์ด์ ์์ ์ปดํฌ๋ํธ๋ count๋ฅผ ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ return๋ถ๋ฅผ ๋ณด๋ฉด ๋ฒํผ์ ๋๋ฌ count๋ผ๋ state๋ฅผ ๊ณ์ ์ฆ๊ฐ์ํฌ ์ ์๋ค.
์ด ๋ฒํผ์ ์ฐํํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์๋ฌด๋ฆฌ React.Memo๋ฅผ ํด๋์ด๋ ์์ ์ปดํฌ๋ํธ๋ ์ฌ๋ ๋ ๋๊ฒ ๋๋ค.
์ฌ์ค ์์ ์ปดํฌ๋ํธ๋ count๋ฅผ ๋ฐ์์ ์ค์ ํ์ฉํ์ง๋ ์๊ณ ๋ ๋ํ์ง๋ ์์๋ค.
๊ทธ๋ฐ๋ฐ๋? ๊ทธ๋ ๋ค. props์ ๋ณ๋์ด ์๊ธฐ๋ฉด props๋ฅผ ๋ฐ์ ์ปดํฌ๋ํธ๋ ์ฌ๋ ๋๋๊ฒ ๋๋ค.
์ฌ์ง์ด props๋ฅผ ๋ฐ์ ํ์ฉํ์ง ์๊ณ ๋ฐ๋ก ํ์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ๋ก ์ด์ฃผ๋ wrapper ์ปดํฌ๋ํธ๋ผ๋ ์์ธ์๋ค.
๋ฐ์ props๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฌ๋ ๋ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ชจ๊ฐ ์์์๊ฒ state๋ฅผ props๋ก ์ฃผ๊ณ ์๊ณ ์ด state๋ ๋ณ๋์ด ์๋ค.
๊ทธ๋ฐ๋ฐ ๋ถ๋ชจ์ ๋ค๋ฅธ state๊ฐ ๋ณ๊ฒฝ๋์๋ค. ์์์ ์ฌ๋ ๋๋๋?
๋ง์ด ์ข ํท๊ฐ๋ฆด ์ ์๋ค. ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค. ๋ถ๋ชจ๋ stateA์ stateB๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์์์๊ฒ stateA๋ฅผ ๋ด๋ ค์คฌ๋ค.
๊ทธ๋ฐ๋ฐ ๋ถ๋ชจ๋จ์์ stateB๋ฅผ ์กฐ์ํด์ ๋ถ๋ชจ๋ ์ฌ๋ ๋๊ฐ ๊ณ์ ์ผ์ด๋๋ค. ์ด๋ ์์์ด ๋ฐ๊ณ ์๋ stateA๋ ๋ณํจ ์๋ค๊ณ ํ ๋,
์ฌ๋ ๋ ๋๋๊ฐ?
๋ต์... ์์์ React.memo๋ก ์ ๊ฐ์๋ค๋ฉด ๋ ๋งํ ํ์์์ด ์ฌ๋ ๋ ๋๋คใ ใ (ํจ์ )
๊ทธ๋ฌ๋ React.memo๋ฅผ ์ผ๋ค๋ฉด ์ฌ๋ ๋๊ฐ ์ผ์ด๋์ง ์๋๋ค.
์ด๋ ์์๋ฌ์ผํ ๊ฒ, ์ฌ๋ ๋๊ฐ ์ผ์ด๋ ๋ ๊ทธ ์ปดํฌ๋ํธ ๋ด์ ํจ์, ํธ๋ค๋ฌ ๋ฑ์ ๋ชจ๋ ์ฌ๋ ๋๋์ง๋ง
state๋ค์ (์ง์ ์ ์ธ setํจ์๋ฅผ ํตํ ๋ณ๊ฒฝ์ด ์๋ค๋ฉด) ์ ์ง๋๋ค. (์ด๋ฏธ ์ง๊ด์ ์ผ๋ก ๋ง์ด ์ฒดํํด๋ด์ ์๋ ๋ถ๋ถ์ผ ๊ฒ์ด๋ค.)
์ฆ, ์์์ด ๋ฐ๊ณ ์๋ props๊ฐ ์ ๋ฐ๋๋ฉด์ ์ ๋๋ก React.memo๊ฐ ๋์ด์๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ์ฌ๋ ๋๊ฐ ์ผ์ด๋์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ชจ๊ฐ ์์์๊ฒ '์์ํ ๋ฐ์ดํฐ'๋ฅผ props๋ก ์ฃผ๊ณ ์๊ณ
์ด ๋ฐ์ดํฐ๋ ๋ณ๋์ด ์๋ค. ๊ทธ๋ฐ๋ฐ ๋ถ๋ชจ์ ๋ค๋ฅธ state๊ฐ ๋ณ๊ฒฝ๋์๋ค.
์ฌ๋ ๋๋๋? (์์์ React.memo๋ก ๊ฐ์ธ์ค)
const ChildComponent = React.memo(({ a }) => {
console.log('ChildComponent rendered');
return <div>I am the child component.</div>;
});
const ParentComponent = () => {
const [count, setCount] = useState(0);
const a = 100;
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
{/* ์ฟจํ๊ฒ number ์๋ฃํ์ธ a๋ฅผ ๋ฐ๊ณ ์๋ค. */}
<ChildComponent a={a} />
</div>
);
};
์ฌ๋ ๋ ์ ๋๋ค. ์ด๋ค ์ฌ๋๋ค์ ์์ํ ๊ฒ์ด๋ค.
์ฌ๋ ๋ ๋ ๋ state๋ก ๋ง๋ค์ด์ง์ง ์์ ๋ฐ์ดํฐ๋ ๋ชจ๋ ์๋ก ์ฌ์์ฑ๋๋๊ฒ ์๋๋๊ณ ์๊ฐํ ์ ์๋ค.
๊ทธ ๋ง์ด ๋ง๋ค. ์์ํ ๋ฐ์ดํฐ๋ ๋ถ๋ชจ๊ฐ ์ฌ๋ ๋ ๋ ๋๋ง๋ค ๋งจ๋ ์ฌ์์ฑ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ React.memo๋ ์์ ๋น๊ต๋ฅผ ์ํํ๋ค.
์์ํ ๊ฐ๋ค์ ์ฌ์ค ์์ ๋น๊ต๋ ๊น์ ๋น๊ต๋ ์๊ด์์ด '๊ฐ'์ด ๊ฐ๋ค๋ฉด
๋์ผํ ๊ฑธ๋ก ์ทจ๊ธ๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ํ ๋ฐ์ดํฐ๊ฐ ๊ณ์ ๋ถ๋ชจ ๋ด์์ ์ฌ์์ฑ๋๋๋ผ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์๋ ๊ฒ์ผ๋ก ์ทจ๊ธ๋๋ค.
์ด๋ classํ ์ปดํฌ๋ํธ์ shouldComponentUpdate์ ์๋ฆฌ๊ฐ ๋น์ทํ๋ค.
(React.memo๊ฐ ํจ์ํ ์ปดํฌ๋ํธ์ shouldComponentUpdate ๋ฉ์๋์ ๊ตฌํ์ฒด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.)
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ชจ๊ฐ ์์์๊ฒ handler๋ฅผ prop๋ก ์ฃผ๊ณ ์๊ณ
handler๋ฅผ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝํ์ง ์์์ง๋ง ๋ถ๋ชจ์ ๋ค๋ฅธ state๊ฐ ๋ณ๊ฒฝ๋์๋ค.
์ด๋ ์์์ ์ฌ๋ ๋ ๋๋? (์์์ React.memo๋ก ๊ฐ์ธ์ค)
const ChildComponent = React.memo(({ onClick }) => {
console.log('ChildComponent rendered');
return <div onClick={onClick}>I am the child component.</div>;
});
const ParentComponent = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prev => prev + 1)
}
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
{/* handleClick์ ๋ด๋ ค๋ฐ๊ณ ์๋ค. */}
<ChildComponent onClick={handleClick} />
</div>
);
};
์์ฒ๋ผ handler๋ฅผ useCallback์ผ๋ก ๊ณ ์ ํด๋์ง ์์๋ค๋ฉด ์ฌ๋ ๋ ๋๋ค.
์ฆ useCallback์ผ๋ก handler์ ์ฌ์์ฑ์ ๋ง์๋๋ค๋ฉด ์ฌ๋ ๋๊ฐ ์ผ์ด๋์ง ์๋๋ค.
์ง์ ์ ๋งํ๋ฏ์ด, React.memo๋ ์์ ๋น๊ต๋ฅผ ํ๋ค.
์์ ๋น๊ต์์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋,
์ค์ ๋ด๋ถ์ ๊ฐ๋ค์ด ๋์ผํ์ง๋ฅผ ๋น๊ตํ๋๊ฒ ์๋๋ผ
์ฐธ์กฐ ์ฃผ์๊ฐ ๋๊ฐ์์ง๋ฅผ ๋น๊ตํ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ ๊ฒ์ ํจ์, ๊ฐ์ฒด, ๋ฐฐ์ด (์ด ๋ชจ๋ ๊ฒ ์ฌ์ค ๋ค ๊ฐ์ฒด์ง๋ง..) ๋ฑ๋
๋ถ๋ชจ ์ฌ๋ ๋ ์ ๋ค์ ์์ฑ๋๋ฉฐ, ์ฃผ์๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, React.memo๊ฐ ์์ ๋น๊ต๋ฅผ ํ ๋ ๊ฐ์ ๊ฐ์ด ์๋๋ผ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์
ํธ๋ค๋ฌ ๊ฐ์ ๊ฒ์ ๋ด๋ ค์ค ๋ useCallback์ ์จ์ผํ๋ ๊ฒ์ด๋ค.
useCallback๋ ๋ฉ๋ชจ์ด์ ์ด์ (์ฝ๊ฒ ๋งํด ์บ์ฑ)์ ํ๋ ํ ์ค ํ๋์ด๋ฉฐ,
์ฝ๋ฐฑํจ์๊ฐ ์ฌ์์ฑ๋๋ ๊ฒ์ ๋ง๊ณ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ ์ง์์ผ์ค๋ค.
์์กด์ฑ ๋ฐฐ์ด์ ๋ค์ด๊ฐ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ ์์๋ง callback์ ์ฌ์์ฑ ํด์ค๋ค.
๋ง์ง๋ง ๋ฌธ์ ,
๋ถ๋ชจ๊ฐ ์์์๊ฒ useCallback์ ์จ์ ์ฌ์์ฑ์ ๋ง์ handler๋ฅผ ๋ด๋ ค์ค๋ค.
์ฌ๋ ๋๊ฐ ๋ ๊ฒ์ธ๊ฐ? (์์์๊ฒ React.memo๊ฐ ๋๋ฌ์ ธ ์์ง ์๋ค)
๋ต์ ์ฌ๋ ๋ ๋๋ค. React.memo๊ฐ ์๋ค๋ฉด
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์์, ํ์ ์ปดํฌ๋ํธ๋ ์ฌ๋ ๋๊ฐ ๋๋ค๋๊ฑธ ์ ์ ๋ก ์๊ฐํ๊ณ ์์ด์ผํ๋ค.
๋ฌผ๋ก useCallback์ ์จ์ ํธ๋ค๋ฌ์ ์ฐธ์กฐ๊ฐ ๋ณํ์ง ์๊ฒ ํ๊ณ ์ ์ง์์ผฐ๊ณ
์ด๋ฅผ ํตํด ์ฑ๊ณต์ ์ผ๋ก ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ prop์ด ๋ณ๊ฒฝ๋์ง ์๊ฒ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ React.memo๋ก ๊ฐ์ธ์ง ์์ ์์์ด๋ผ๋ฉด ์ฌ๋ ๋๊ฐ ์ผ์ด๋ ์ ๋ฐ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์์ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ ๋ ์ฌ๋ ๋ ๋๋ค.
์ฆ, useCallback์ ์ผ๋ค๊ณ ๋์ด ์๋๋ค.
์ฐธ์กฐ๋ฅผ ์ ์ง์ํค๋ ์ด์ ๋ React.memo๊ฐ ์์ ๋น๊ต๋ฅผ ์ ํ๊ฒ ํ๊ธฐ ์ํด์๋๊ฑธ ๊น๋จน์ผ๋ฉด ์ ๋๋ค.
์ฆ, React.memo๋ฅผ ์ ์ฐ๋ฉด ๋ฌด์ฉ์ง๋ฌผ์ด๋ค.
(React.memo์ ์ํด์๊ฐ ์๋๋๋ผ๋ useCallback์ ์จ์ผํ๋ ์๊ฐ์ด ๊ทธ๋ ๊ฒ ๋ง์ง ์๋ค.)
๋์ค์ ๊ณต๋ถํ ๊ฒ
- ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ ํ ๋ฒ ๋ฅํ๊ฒ ์ ๋ฆฌ
- class ์ปดํฌ๋ํธ์ shouldComponentUpdate
- useMemo
- ๋ฆฌ์กํธ ๋ถ๋ณ์ฑ
๋๋ง์น๋ฉฐ
chatGPT์ ํ ๋ฃจ์๋ค์ด์ ๋๋ฌธ์ ์ฝ๊ฐ ํ์๋ฆฌ๋ฅผ ๋ง์ด ์ฐ๋ ๋ฐ๋์ ๊ต์ฐจ๊ฒ์ฆํ๋๋ผ ์์ฑ ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ๋ค.
useCallback๊ณผ React.memo๋ฅผ ๋์ฅ๋๊ฒ ์์๋ณด๋ ์๊ฐ์ด ๋์ด ์ฑ์ฅ์ ์ข์ ์์๋ถ์ด ๋ ๊ฒ ๊ฐ๋ค.