์ํ๊ฐ ๋ณํ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋๋ ๊ฒ์ React์ ๊ธฐ๋ณธ ํน์ง์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ด ํ์์๋ ์ปดํฌ๋ํธ๋ค๋ ํจ๊ป ๋ฆฌ๋ ๋๋ง์ด ๋๊ณค ํ๋ค.
๋, ํ์ด์ง ์ฒซ ๋ก๋ฉ ์ csr๋ฐฉ์ ๋๋ฌธ์ ๋น๊ต์ ์ค๋ ๊ฑธ๋ฆฌ๋๋ฐ, ์ด๋ฌํ ์ด์ ๋๋ฌธ์ ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง ์๋ก ์ต์ ํ๊ฐ ํ์ํด์ง๋ค.
๊ธฐ์กด ์ปดํฌ๋ํธ์ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค. ์์ธํ ๋ด์ฉ์ ์๋ช ์ฃผ๊ธฐ ๊ธ ์ฐธ๊ณ
ํด๋์ค ์ปดํฌ๋ํธ
- ์ปดํฌ๋ํธ๋ฅผ ํด๋์ค๋ก ์ ์ -> ์ปดํฌ๋ํธ์ ์ธ์คํด์ค๊ฐ ํ๋ฉด์ ํ์๋จ
- ์ํ ๋ณ๊ฒฝ ์ -> ์ธ์คํด์ค์ ๋ด๋ถ ๊ฐ์ด ๋ณ๊ฒฝ -> ๋ฐ๋ ๊ฐ์ ๋ง์ถฐ ํ๋ฉด์ด ๋ฆฌ๋ ๋๋ง
=> ํ๋ฒ ๋ง๋ค์ด์ง ์ธ์คํด์ค๋ ์ ๊ฑฐ๋๊ธฐ ์ ๊น์ง ๊ณ์ํด์ ์ฌ์ฌ์ฉ๋จ
ํจ์ํ ์ปดํฌ๋ํธ
- ์ปดํฌ๋ํธ๋ฅผ ํจ์๋ก ์ ์ -> ํจ์ ํธ์ถ
- ์ํ ๋ณ๊ฒฝ -> ๊ธฐ์กด์ ํธ์ถ๋ ํจ์ ์ ๊ฑฐ -> ์๋ก์ด ์ํ ๊ฐ์ผ๋ก ํจ์ ํธ์ถ -> ํ๋ฉด์ ๋ ๋๋ง
=> ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ํจ์๋ฅผ ์๋ก ํธ์ถํ๋ฏ๋ก ๋งค๋ฒ ํจ์ ๋ด๋ถ ๋ณ์, ํจ์๋ค๋ ์ ๋ถ ์๋ก ์ ์ธ ๋ฐ ํ ๋น๋จ
=> ์ฌ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ ์๋ก ๋ง๋ค์ด ์ฌ์ฉ๋จ => ๋นํจ์จ ๋ฐ์
์ต์ ํ ํจ์
์ฌ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์ ์ฅํ๋ค๊ฐ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด์ก๋ค.
React์์ ์ ๊ณตํ๋ ์ต์ ํ ํจ์ ์ค ๋ํ์ ์ผ๋ก๋ useMemo(), useCallback(), memo() ๋ฑ์ด ์๋ค.
useMemo()
ํจ์ ํธ์ถ ๊ฒฐ๊ณผ (๊ณ์ฐ ๊ฒฐ๊ณผ)๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ด useEffect์ ์ ์ฌํ ๊ฒ์ด ํน์ง...
const ์ ์ฅํ _ํธ์ถ ๊ฒฐ๊ณผ = useMemo(()=>{
return ํจ์ ์ฝ๋
},[๊ฐ]) // ์ปดํฌ๋ํธ ํธ์ถ์ [๊ฐ]์ด ๋ณํ์ง ์์๋ค๋ฉด ํจ์๋ฅผ ๋ค์ ํธ์ถํ์ง ์๋๋ค
useEffect์์ ์ฐจ์ด
useMemo | useEffect | |
์ญํ | ํจ์ ํธ์ถ ๊ฐ์ ๊ธฐ์ต + ์์กด์ฑ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋์ ๊ฒฝ์ฐ์๋ง ๋ค์ ๊ณ์ฐ |
ํธ์ถ ๊ณผ์ ์์ ๋ ๋๋ง์ ์ํฅ์ ๋ผ์น ์ ์๋ ๊ฒ์ ๋ชจ์ ๋ฐ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ฅ ((api ํธ์ถ, ํ์ด๋จธ, ์ด๋ฒคํธ ๋ฑ๋ก ๋ฑ) |
์คํ ์์ | ๋ ๋๋ง ์ค์ ์คํ (๋๊ธฐ์ ) | ๋ ๋๋ง ํ์ ์คํ (๋น๋๊ธฐ์ ) |
๋ ๋๋ง ์ํฅ | ๊ฐ์ ๋ฐํ ํ ๋ ๋๋ง์ ์ง์ ์ฌ์ฉ | effect๋ง ๋ฐ์ํ๋ฉฐ ๋ ๋๋ง์ ์ง์ ์ ์ธ ๊ด์ฌX |
์์ 1
์ซ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด counter ์ํ์ ๊ทธ๋ฅ ๋ ๋๋ง์ ์ํ render ์ํ๋ฅผ ์์ฑํ๋ค.
function App() {
const [count, setCount] = useState(0);
const [rerender, setRerender] = useState(false);
const plus1 = (count) => {
console.log('plus1 ์คํ');
return count + 1;
};
const countPlus1 = plus1(count);
return (
<>
<div>countPlus1 : {countPlus1}</div>
<button onClick={() => {
setCount(count + 1);
}}>
count + 1
</button>
<button onClick={() => {
setRerender(!rerender);
}}>
Rerender
</button>
</>
);
}
number๊ฐ ๋ณํํ ๋ ๋ฟ๋ง์ด ์๋ rerender์ ์ํ๊ฐ false, true๋ก๋ง ๋ฐ๋๊ณ ์๋๋ฐ
์ด์ ๊ด๋ จ์๋ plus1์ด ๊ณ์ํด์ ํธ์ถ์ด ๋๊ณ ์์์ ์ ์ ์๋ค.
์์ 1-1 : useMemo ์ฌ์ฉ
constPlus1์ ๋ค์๊ณผ ๊ฐ์ด useMemo()๋ฅผ ์ฌ์ฉํด ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ผ๋ก count๋ฅผ ๋ฃ์ด์คฌ๋ค.
const countPlus1 = useMemo(() => {
return plus1(count);
}, [count]);
count์ ๊ฐ์ด ๋ณํ์ง ์๋ ์ด์ plus1์ด ํธ์ถ๋์ง ์์์ ํ์ธํ ์ ์๋ค.
useCallback()
ํจ์ ์์ฒด๋ฅผ ์ ์ฅ
const ์ ์ฅํ _ํจ์ = useCallback(()=>{
return ํจ์ ์ฝ๋
},[๊ฐ]) // ์ปดํฌ๋ํธ ํธ์ถ์ [๊ฐ]์ด ๋ณํ์ง ์์๋ค๋ฉด ํจ์๋ฅผ ๋ค์ ๋ง๋ค์ง ์๋๋ค
์์ 2
์์ ์์ 1-1์์ ์ผ๋ ์ฝ๋์ useEffect๋ฅผ ์ถ๊ฐํด์ plus1 ํจ์๊ฐ ์ธ์ ์ฌ์์ฑ๋๋์ง๋ฅผ ํ์ธํด๋ดค๋ค.
useEffect(() => {
console.log('plus1 ์ฌ์์ฑ');
}, [plus1]);
rerender ์ํ์ ๋ณ๊ฒฝ ์์๋ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ๊ณ์ ์คํ๋๊ณ ์์์ ํ์ธํ ์ ์๋ค.
์์ 2-1 : ์์กด์ฑ ๋ฐฐ์ด []
const plus1 = useCallback(
(count) => {
console.log('plus1 ์คํ');
return count + 1;
}, [],
);
plus1์ ์์ฑ์ ์ฒ์ ๋ ๋๋ง๋ ๋ ํ๋ฒ๋ง ์ด๋ฃจ์ด์ง๋ฉฐ,
์ดํ๋ ์ํ๋ฅผ ์๋ฌด๋ฆฌ ๋ฐ๋์ด๋ plus1๋ง ์คํ๋๊ณ ์์์ ํ์ธํ ์ ์๋ค.
์์ 2-2 : ์์กด์ฑ ๋ฐฐ์ด [count]
const plus1 = useCallback(
(count) => {
console.log('plus1 ์คํ');
return count + 1;
}, [count],
);
count๊ฐ ๋ฐ๋๋๋ง ํจ์๋ฅผ ์์ฑํ๊ณ ์๋ค..
(์ง๊ธ์ useMemo์์ rerender ๊ฐ์ด ๋ฐ๋๋๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ์์ฑํ ์ํ๋ผ, rerender ๋ฒํผ์ ๋๋ฌ์ผ ๋ฐ๋ ๊ฐ์ด ๋ฆฌ๋ ๋๋๋ค.)
์์ 2-3 : ์์กด์ฑ ๋ฐฐ์ด [rerender]
const plus1 = useCallback(
(count) => {
console.log('plus1 ์คํ');
return count + 1;
}, [rerender],
);
count๊ฐ ๋ณ๊ฒฝ๋ ๋๋ ์๋ฌด์ผ๋ ์ผ์ด๋์ง ์์ง๋ง rerender๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋จ์ ํ์ธํ ์ ์๋ค.
memo()
์ปดํฌ๋ํธ๋ฅผ ์ ์ฅํ๋ฉฐ, props๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฌ์ฉ
const ์ ์ฅํ _์ปดํฌ๋ํธ = memo((props)=>{
ํจ์ ์ปดํฌ๋ํธ ์ฝ๋
}) // ์ปดํฌ๋ํธ ํธ์ถ ์ ์ ๋ฌ๋ฐ์ props ๊ฐ์ด ๋ณํ์ง ์์๋ค๋ฉด ํจ์๋ฅผ ํธ์ถํ์ง ์๋๋ค
์์
์์ 2-3์ฝ๋์์ count๊ฐ์ ํ์ํด์ฃผ๋ ์ปดํฌ๋ํธ countDisplay๋ฅผ ์์ฑํ๋ค.
function App() {
// ์๋ต....
return (
<>
<CountDisplay count={count} />
<div>countPlus1 : {countPlus1}</div>
<button onClick={() => {
setCount(count + 1);
}}>count + 1</button>
<button onClick={() => {
setRerender(!rerender);
}}>Rerender</button>
</>
);
}
const CountDisplay = ({ count }) => {
return <div>count : {count}</div>;
};
์ด ๋ Rerender ๋ฒํผ์ ๋๋ฅด๋ฉด count (props๋ก ๋ค์ด๊ฐ์๋) ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ผ๋ ๊ณ์ ๋ฆฌ๋ ๋๋ง ๋๊ณ ์๋ค.
์ด๋ด ๋ memo๋ฅผ ์ฐ๋ฉด ๋๋๋ฐ, ์์ CountDisplay ์ปดํฌ๋ํธ๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
const CountDisplay = memo(({ count }) => {
return <div>count : {count}</div>;
});
'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React / lazy, Suspense (1) | 2025.04.24 |
---|---|
React / React Developer Tools (0) | 2025.04.24 |
React / ์ ์ญ ์ํ ๊ด๋ฆฌ (2) - Redux, Redux Toolkit (0) | 2025.04.22 |
React / ์ ์ญ ์ํ ๊ด๋ฆฌ (1) - ๋ด๋ถ (0) | 2025.04.18 |
React / openweatherapi ์ฌ์ฉํ๊ธฐ (0) | 2025.04.17 |