๋ฆฌ์กํธ๋ฅผ ์ฐ๋ค ๋ณด๋ฉด ์ ์ด ์ปดํฌ๋ํธ๊ฐ ๋ ๋ ๋๋ง๋์ง?
๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋๋ค.
์ด๋ฒ ๊ธ์ React์ ๋ฆฌ๋ ๋๋ง ํ๋ฆ์ ๊ตฌ์กฐ์ ์ผ๋ก ์ดํดํ๊ณ ,
์ค์ ๋ก ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ด๋ค ์ ๋ต์ ์ฌ์ฉํ ์ ์๋์ง๊น์ง ์ ๋ฆฌํด๋ดค๋ค.
React๋ ์ํ(state)๋ props๊ฐ ๋ฐ๋๋ฉด
ํด๋น ์ปดํฌ๋ํธ์ ๊ทธ ์์ ์ปดํฌ๋ํธ ์ ์ฒด๊ฐ ๋ค์ ๋ ๋๋ง๋๋ค.
โ
๋จ, "๋ ๋๋ง(Render)" = ๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๊ฑด ์๋
โ ์ค์ DOM ์
๋ฐ์ดํธ๋ React๊ฐ Virtual DOM์ ํตํด ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํจ (diff ์๊ณ ๋ฆฌ์ฆ)
์ํฉ | ๋ฆฌ๋ ๋๋ง ๋ฐ์ ์ฌ๋ถ |
---|---|
useState ๋ก ์ํ ๋ณ๊ฒฝ | โ ๋ฐ์ |
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋จ | โ ์์๋ ๋ฐ์ |
props ๊ฐ ๋ณ๊ฒฝ๋จ | โ ๋ฐ์ |
context ๊ฐ ๋ณ๊ฒฝ๋จ | โ ๊ด๋ จ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง |
๋์ผํ ๊ฐ์ผ๋ก setState ํธ์ถ | โ (React๊ฐ ๋ฌด์ํจ) |
useRef ๊ฐ ๋ณ๊ฒฝ | โ (๋ ๋๋ง ์๋จ) |
function Parent() {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(count + 1)}>+1</button>
<Child />
</>
);
}
function Child() {
console.log('Child ๋ ๋๋ง');
return <div>์์ ์ปดํฌ๋ํธ</div>;
}
๐ ๋ฒํผ ํด๋ฆญํ ๋๋ง๋ค Child
๋ ํจ๊ป ๋ ๋๋ง๋จ
์๋ํ๋ฉด Parent
๊ฐ ๋ฆฌ๋ ๋๋ง โ ํ์ ์ปดํฌ๋ํธ๋ค๋ ํจ๊ป ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ
React.memo
์ฌ์ฉconst Child = React.memo(() => {
console.log('๋ ๋๋ง ๋ฐฉ์ง๋จ');
return <div>memoized</div>;
});
useCallback
์ผ๋ก ํจ์ ๋ฉ๋ชจ์ด์งconst handleClick = useCallback(() => {
// ๋ก์ง
}, []);
React.memo
๋ ์ปดํฌ๋ํธ์ props๋ก ํจ์๋ฅผ ๋๊ธธ ๋ ํ์useMemo
๋ก ์ฐ์ฐ ๋ฉ๋ชจ์ด์งconst value = useMemo(() => expensiveCalc(num), [num]);
[์ํ ๋ณ๊ฒฝ or props ๋ณ๊ฒฝ]
โ
์ปดํฌ๋ํธ ํจ์ ์คํ๋จ (๋ ๋๋ง)
โ
JSX ๋ฐํ โ Virtual DOM ์์ฑ
โ
์ด์ VDOM๊ณผ ๋น๊ต(diff)
โ
์ค์ ํ์ํ ๋ถ๋ถ๋ง DOM ์
๋ฐ์ดํธ
console.log('๋ ๋๋ง')
์ผ๋ก ์ง์ ํ์ธ React Developer Tools
โ ์ปดํฌ๋ํธ๋ณ ๋ ๋๋ง ํ์ธ ๊ฐ๋ฅ <React.StrictMode>
๋ฅผ ํ์ฉํด ๊ฐ๋ฐ ์ค ๋ฆฌ๋ ๋๋ง ํ์ง์ฒ์์ "setStateํ๋ฉด ๋ค์ ๊ทธ๋ ค์ง์ง" ์ ๋๋ก ์๊ฐํ๋๋ฐ,
์ค์ ๋ก๋ Virtual DOM diff, ๋ฆฌ๋ ๋๋ง๊ณผ DOM ์
๋ฐ์ดํธ๋ ๋ค๋ฅธ ๊ฐ๋
์ด๋ผ๋ ๊ฑธ ๊นจ๋ฌ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ ๊ฑด ๊ฒฐ๊ตญ,
๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ด๋ป๊ฒ ์ค์ผ ์ ์๋๋์ ๋ฌธ์ ๋ผ๋ ๊ฒ๋ ๋๊ผ๋ค.
์ง๊ธ์ React.memo
, useCallback
, useMemo
๋ฅผ
"์ต์ ํ์ฉ ๊ธฐ๋ณธ ์ธํธ"์ฒ๋ผ ์ฐ๊ฒ ๋๋ค!
๐ก "React๋ ๋๋ํ์ง๋ง, ๋ถํ์ํ ๋ ๋๋ง์ ๋ง๋ ๊ฑด ๊ฐ๋ฐ์์ ๋ชซ์ด๋ค."