memo
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค.
const MemoizedComponent = memo(SomeComponent, arePropsEqual?)
๋ ํผ๋ฐ์ค
memo(Component, arePropsEqual?)
์ปดํฌ๋ํธ๋ฅผ memo
๋ก ๊ฐ์ธ๋ฉด ํด๋น ์ปดํฌ๋ํธ์ memoized ๋ฒ์ ์ ์ป์ ์ ์์ต๋๋ค. memoized ๋ฒ์ ์ ์ปดํฌ๋ํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋์ด๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ๋ฆฌ๋ ๋๋ง ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ memoization๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฒ์ด์ง ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ React๋ ์ฌ์ ํ ๋ฆฌ๋ ๋๋ง ๋ ์๋ ์์ต๋๋ค.
import { memo } from 'react';
const SomeComponent = memo(function SomeComponent(props) {
// ...
});
์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์
-
Component
: memoize ํ๋ ค๋ ์ปดํฌ๋ํธ์ ๋๋ค.memo
๋ ์ด ์ปดํฌ๋ํธ๋ฅผ ์์ ํ์ง ์๊ณ ๋์ ์๋ก์ด memoized ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํฉ๋๋ค. ํจ์์forwardRef
์ปดํฌ๋ํธ๋ฅผ ํฌํจํ ๋ชจ๋ ์ ํจํ React ์ปดํฌ๋ํธ๊ฐ ํ์ฉ๋ฉ๋๋ค. -
optional
arePropsEqual
: ์ปดํฌ๋ํธ์ ์ด์ props์ ์๋ก์ด props์ ๋ ๊ฐ์ง ์ธ์๋ฅผ ๋ฐ๋ ํจ์์ ๋๋ค. ์ด์ props์ ์๋ก์ด props๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์ฆ ์ปดํฌ๋ํธ๊ฐ ์ด์ props์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋งํ๊ณ ์๋ก์ด props์์๋ ์ด์ props์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๊ฒฝ์ฐtrue
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉดfalse
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ํจ์๋ฅผ ์ง์ ํ์ง ์์ต๋๋ค. React๋ ๊ธฐ๋ณธ์ ์ผ๋กObject.is
๋ก ๊ฐ props๋ฅผ ๋น๊ตํฉ๋๋ค.
๋ฐํ
memo
๋ ์๋ก์ด React ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํฉ๋๋ค. memo
์ ์ ๊ณตํ ์ปดํฌ๋ํธ์ ๋์ผํ๊ฒ ๋์ํ์ง๋ง, ๋ถ๋ชจ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋๋ผ๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ React๋ ์ด๋ฅผ ๋ฆฌ๋ ๋๋งํ์ง ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
props๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ๋ ๋ฆฌ๋ ๋๋ง ๊ฑด๋๋ฐ๊ธฐ
React๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค. memo
๋ฅผ ์ฌ์ฉํ๋ฉด, ์๋ก์ด props๊ฐ ์ด์ props์ ๋์ผํ๋ค๋ฉด ๋ถ๋ชจ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋ ์๋ก์ด props๊ฐ ์ด์ props์ ๋์ผํ๋ฉด ๋ฆฌ๋ ๋๋ง ๋์ง ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ memoized ์ํ๋ผ๊ณ ํฉ๋๋ค.
์ปดํฌ๋ํธ๋ฅผ memoize ํ๋ ค๋ฉด memo
๋ก ๊ฐ์ธ๊ณ ๊ธฐ์กด ์ปดํฌ๋ํธ ๋์ ์ ๋ฐํ๋ ๊ฐ์ ์ฌ์ฉํ์ธ์.
const Greeting = memo(function Greeting({ name }) {
return <h1>Hello, {name}!</h1>;
});
export default Greeting;
React ์ปดํฌ๋ํธ๋ ํญ์ ์์ํ ๋ ๋๋ง ๋ก์ง์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ด๋ props, state ๊ทธ๋ฆฌ๊ณ context๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. memo
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ด ์๊ตฌ ์ฌํญ์ ์ค์ํ๋ค๊ณ ์๋ฆฌ๋ฏ๋ก, props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ React๋ ๋ฆฌ๋ ๋๋ง ๋ ํ์๊ฐ ์์ต๋๋ค. memo
๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ปดํฌ๋ํธ์ state๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ฌ์ฉ ์ค์ธ context๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค.
์๋ ์์ ์์ Greeting
์ปดํฌ๋ํธ๋ name
์ด props ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ name
์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค. ํ์ง๋ง address
๋ Greeting
์ props๊ฐ ์๋๊ธฐ ๋๋ฌธ์ address
๊ฐ ๋ณ๊ฒฝ๋ ๋๋ ๋ฆฌ๋ ๋๋ง ๋์ง ์์ต๋๋ค.
import { memo, useState } from 'react'; export default function MyApp() { const [name, setName] = useState(''); const [address, setAddress] = useState(''); return ( <> <label> Name{': '} <input value={name} onChange={e => setName(e.target.value)} /> </label> <label> Address{': '} <input value={address} onChange={e => setAddress(e.target.value)} /> </label> <Greeting name={name} /> </> ); } const Greeting = memo(function Greeting({ name }) { console.log("Greeting was rendered at", new Date().toLocaleTimeString()); return <h3>Hello{name && ', '}{name}!</h3>; });
Deep Dive
์ด ์ฌ์ดํธ์ ๊ฐ์ด ๋๋ถ๋ถ์ ์ธํฐ๋์ ์ด ํฌ๋ฐํ ์ฑ์ ๊ฒฝ์ฐ(ํ์ด์ง ๋๋ ์ ์ฒด ์น์ ๊ต์ฒด ๋ฑ) ์ผ๋ฐ์ ์ผ๋ก memoization๋ ๋ถํ์ํฉ๋๋ค. ๋ฐ๋ฉด ์ฑ์ด ๊ทธ๋ฆผ ํธ์ง๊ธฐ์ด๊ณ ๋ํ ์ด๋๊ณผ ๊ฐ์ด ๋๋ถ๋ถ์ ์ธํฐ๋์ ์ด ์ธ๋ถ๋์ด ์๋ค๋ฉด, memoization๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
memo
๋ก ์ต์ ํํ๋ ๊ฒ์ ์ปดํฌ๋ํธ๊ฐ ์ ํํ ๋์ผํ props๋ก ์์ฃผ ๋ฆฌ๋ ๋๋ง ๋๊ณ , ๋ฆฌ๋ ๋๋ง ๋ก์ง์ด ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋ ์ธ์งํ ์ ์์ ๋งํผ์ ์ง์ฐ์ด ์๋ค๋ฉด memo
๊ฐ ํ์ํ์ง ์์ต๋๋ค. memo
๋ ๊ฐ์ฒด ๋๋ ๋ ๋๋ง ์ค์ ์ ์๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ํญ์ ๋ค๋ฅธ props๊ฐ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ์ ์์ ํ ๋ฌด์ฉ์ง๋ฌผ์
๋๋ค. ๋ฐ๋ผ์ memo
์ ํจ๊ป useMemo
์ useCallback
์ด ์ข
์ข
ํ์ํฉ๋๋ค.
๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์ปดํฌ๋ํธ๋ฅผ memo
๋ก ๊ฐ์ธ๋ ์ด์ ์ด ์์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ํฌ๊ฒ ํด๊ฐ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ํ์์๋ ๊ฐ๋ณ ์ฌ๋ก์ ๋ํด ๊ณ ๋ คํ์ง ์๊ณ ๊ฐ๋ฅํ ํ ๋ง์ด memoize ํ๋ ๋ฐฉ์์ ์ ํํ๊ธฐ๋ ํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ํ ๋ชจ๋ memoization๊ฐ ํจ๊ณผ์ ์ด์ง๋ ์์ต๋๋ค. ํญ์ ๋ณ๊ฒฝ๋๋ ๊ฐ์ด ํ๋๋ผ๋ ์๋ค๋ฉด, ์ปดํฌ๋ํธ ์ ์ฒด์ memoization๋ฅผ ์ค๋จํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
์ค์ ๋ก ๋ช๊ฐ์ง ์์น์ ๋ฐ๋ฅด๋ฉด memoization๊ฐ ๋ถํ์ํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐ์ ์ผ๋ก ๊ฐ์ ๋ JSX๋ฅผ ์์์ผ๋ก ๋ฐ์๋ค์ด๋๋ก ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด wrapper ์ปดํฌ๋ํธ๊ฐ ์์ ์ state๋ฅผ ์ ๋ฐ์ดํธํ ๋ React๋ ๊ทธ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
- ์ง์ญ state๋ฅผ ์ ํธํ๊ณ ํ์ ์ด์์ผ๋ก state๋ฅผ ๋์ด์ฌ๋ฆฌ๊ธฐ๋ฅผ ํ์ง ๋ง์ธ์. ์๋ฅผ ๋ค์ด, ์ต์์ ํธ๋ฆฌ๋ ์ ์ญ state ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํผ์ด๋ ์์ดํ ์ด ํธ๋ฒ๋์๋์ง์ ๊ฐ์ ์ผ์์ ์ธ state๋ฅผ ๋์ง ๋ง์ธ์.
- ๋ ๋๋ง ๋ก์ง์ ์์ํ๊ฒ ์ ์งํ์ธ์. ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋์ ๋๋ ์๊ฐ์ ์ํฐํฉํธ๊ฐ ์์ฑ๋๋ค๋ฉด ์ปดํฌ๋ํธ์ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒ์ ๋๋ค! memoization ํ๋ ๋์ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ธ์.
- state๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ถํ์ํ Effect๋ฅผ ํผํ์ธ์. React ์ฑ์์ ๋๋ถ๋ถ์ ์ฑ๋ฅ ๋ฌธ์ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ณตํด์ ๋ ๋๋งํ๊ฒ ๋ง๋๋ Effect์์ ๋ฐ์ํ๋ ์ผ๋ จ์ ์ ๋ฐ์ดํธ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค.
- Effect์์ ๋ถํ์ํ ์์กด์ฑ์ ์ ๊ฑฐํ์ธ์. ์๋ฅผ ๋ค์ด, memoization ๋์ ์ ์ผ๋ถ ๊ฐ์ฒด๋ ํจ์๋ฅผ Effect ๋ด๋ถ๋ ์ปดํฌ๋ํธ ์ธ๋ถ๋ก ์ด๋ํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ ๋๊ฐ ๋ง์ต๋๋ค.
ํน์ ์ธํฐ๋์ ์ด ์ฌ์ ํ ๋๋ฆฌ๊ฒ ๋๊ปด์ง๋ค๋ฉด React ๊ฐ๋ฐ์ ๋๊ตฌ profiler๋ฅผ ์ฌ์ฉํด ์ด๋ค ์ปดํฌ๋ํธ๊ฐ memoization๋ฅผ ํตํด ๊ฐ์ฅ ํฐ ์ด์ ์ ์ป์ ์ ์๋์ง ํ์ธํ๊ณ ํ์ํ ๊ฒฝ์ฐ์ memoization ํ์ธ์. ์ด๋ฌํ ์์น์ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ฝ๊ฒ ๋๋ฒ๊น ํ๊ณ ์ดํดํ ์ ์๊ฒ ํด์ฃผ๋ฏ๋ก ์ด๋ค ๊ฒฝ์ฐ๋ ์ด ์์น์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก๋ ์ด ๋ฌธ์ ๋ฅผ ์์ ํ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋ถ๋ memoization๋ฅผ ์๋์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฐ๊ตฌํ๊ณ ์์ต๋๋ค.
state๋ฅผ ์ฌ์ฉํ์ฌ memoization ๋ ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธํ๊ธฐ
์ปดํฌ๋ํธ๊ฐ memoization ๋ ๊ฒฝ์ฐ์๋, ์ปดํฌ๋ํธ์ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค. ๋ฉ๋ชจํ๋ ๋ถ๋ชจ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋๋ props์๋ง ์ ์ฉ๋ฉ๋๋ค.
import { memo, useState } from 'react'; export default function MyApp() { const [name, setName] = useState(''); const [address, setAddress] = useState(''); return ( <> <label> Name{': '} <input value={name} onChange={e => setName(e.target.value)} /> </label> <label> Address{': '} <input value={address} onChange={e => setAddress(e.target.value)} /> </label> <Greeting name={name} /> </> ); } const Greeting = memo(function Greeting({ name }) { console.log('Greeting was rendered at', new Date().toLocaleTimeString()); const [greeting, setGreeting] = useState('Hello'); return ( <> <h3>{greeting}{name && ', '}{name}!</h3> <GreetingSelector value={greeting} onChange={setGreeting} /> </> ); }); function GreetingSelector({ value, onChange }) { return ( <> <label> <input type="radio" checked={value === 'Hello'} onChange={e => onChange('Hello')} /> Regular greeting </label> <label> <input type="radio" checked={value === 'Hello and welcome'} onChange={e => onChange('Hello and welcome')} /> Enthusiastic greeting </label> </> ); }
state ๋ณ์๋ฅผ ํ์ฌ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด React๋ memo
์์ด๋ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋๋๋ค. ์ปดํฌ๋ํธ๊ฐ ํ ๋ฒ ๋ ํธ์ถ๋ ์ ์์ง๋ง, ๊ฒฐ๊ณผ๋ ๋ฌด์๋ฉ๋๋ค.
context๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจํ๋ ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธํ๊ธฐ
์ปดํฌ๋ํธ๊ฐ ๋ฉ๋ชจํ ๋์๋๋ผ๋, ์ฌ์ฉ ์ค์ธ context๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ด ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค. ๋ฉ๋ชจํ๋ ๋ถ๋ชจ๋ก๋ถํฐ ์ ๋ฌ๋๋ props์๋ง ์ ์ฉ๋ฉ๋๋ค.
import { createContext, memo, useContext, useState } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { const [theme, setTheme] = useState('dark'); function handleClick() { setTheme(theme === 'dark' ? 'light' : 'dark'); } return ( <ThemeContext.Provider value={theme}> <button onClick={handleClick}> Switch theme </button> <Greeting name="Taylor" /> </ThemeContext.Provider> ); } const Greeting = memo(function Greeting({ name }) { console.log("Greeting was rendered at", new Date().toLocaleTimeString()); const theme = useContext(ThemeContext); return ( <h3 className={theme}>Hello, {name}!</h3> ); });
์ผ๋ถ context์ ์ผ์ ๋ถ๋ถ ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋๋ก ํ๋ ค๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ ๊ฐ๋ก ๋๋ ์ผ ํฉ๋๋ค. ์ธ๋ถ ์ปดํฌ๋ํธ์ context์์ ํ์ํ ๋ด์ฉ์ ์ฝ๊ณ , ๋ฉ๋ชจํ๋ ์์์๊ฒ prop์ผ๋ก ์ ๋ฌํ์ธ์.
props ๋ณ๊ฒฝ ์ต์ํํ๊ธฐ
memo
๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ค prop๋ ์ด์ ์ prop๊ณผ ์์ ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ง ์์ ๋๋ง๋ค ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค. ์ฆ React๋ Object.is
๋น๊ต๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ๋ชจ๋ prop์ ์ด์ ๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค. Object.is(3, 3)
๋ true
์ด์ง๋ง Object.is({}, {})
๋ false
์
๋๋ค.
memo
๋ฅผ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด, props๊ฐ ๋ณ๊ฒฝ๋๋ ํ์๋ฅผ ์ต์ํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด prop์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, useMemo
:๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ๋ค์ ๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ์ธ์.
function Page() {
const [name, setName] = useState('Taylor');
const [age, setAge] = useState(42);
const person = useMemo(
() => ({ name, age }),
[name, age]
);
return <Profile person={person} />;
}
const Profile = memo(function Profile({ person }) {
// ...
});
props์ ๋ณ๊ฒฝ์ ์ต์ํํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ปดํฌ๋ํธ๊ฐ props์ ํ์ํ ์ต์ํ์ ์ ๋ณด๋ง ๋ฐ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฒด ๊ฐ์ฒด ๋์ ๊ฐ๋ณ ๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค.
function Page() {
const [name, setName] = useState('Taylor');
const [age, setAge] = useState(42);
return <Profile name={name} age={age} />;
}
const Profile = memo(function Profile({ name, age }) {
// ...
});
๋๋ก๋ ๊ฐ๋ณ ๊ฐ๋ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ปดํฌ๋ํธ๋ ๊ฐ ์์ฒด๊ฐ ์๋๋ผ ๊ฐ์ ์กด์ฌ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐ์ต๋๋ค.
function GroupsLanding({ person }) {
const hasGroups = person.groups !== null;
return <CallToAction hasGroups={hasGroups} />;
}
const CallToAction = memo(function CallToAction({ hasGroups }) {
// ...
});
๋ฉ๋ชจํ๋ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ ์ธ๋ถ์ ํจ์๋ฅผ ์ ์ธํ์ฌ ๋ณ๊ฒฝ๋์ง ์๋๋ก ํ๊ฑฐ๋, useCallback
์ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ๋๋ง ์ฌ์ด์ ํจ์์ ์ ์ธ์ ์บ์ ํฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ๋น๊ต ํจ์ ์ง์ ํ๊ธฐ
๋๋ฌผ์ง๋ง ๋ฉ๋ชจํ๋ ์ปดํฌ๋ํธ์ props ๋ณ๊ฒฝ์ ์ต์ํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ์ ๋น๊ต ํจ์๋ฅผ ์ ๊ณตํ์ฌ React๊ฐ ์์ ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ ์ด์ props์ ์๋ก์ด props๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค. ์ด ํจ์๋ memo
์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค. ์๋ก์ด props๊ฐ ์ด์ props์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ง true
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด false
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
const Chart = memo(function Chart({ dataPoints }) {
// ...
}, arePropsEqual);
function arePropsEqual(oldProps, newProps) {
return (
oldProps.dataPoints.length === newProps.dataPoints.length &&
oldProps.dataPoints.every((oldPoint, index) => {
const newPoint = newProps.dataPoints[index];
return oldPoint.x === newPoint.x && oldPoint.y === newPoint.y;
})
);
}
์ด ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ฑ๋ฅ ํจ๋์ ์ฌ์ฉํ์ฌ ๋น๊ต ๊ธฐ๋ฅ์ด ์ค์ ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅธ์ง ํ์ธํ์ธ์. ๋๋ ์๋ ์์ต๋๋ค.
์ฑ๋ฅ ์ธก์ ์ ํ ๋, React๊ฐ ํ๋ก๋์ ํ๊ฒฝ์์ ์คํ๋๊ณ ์๋์ง ํ์ธํ์ธ์.
๋ฌธ์ ํด๊ฒฐ
prop๊ฐ ๊ฐ์ฒด, ๋ฐฐ์ด ๋๋ ํจ์์ธ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
React๋ ์์ ๋น๊ต๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ props์ ์๋ก์ด props๋ฅผ ๋น๊ตํฉ๋๋ค. ์ฆ, ๊ฐ๊ฐ์ ์๋ก์ด prop๊ฐ ์ด์ prop์ ์ฐธ์กฐ๊ฐ ๋์ผํ์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ๋ถ๋ชจ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์์ฑํ๋ฉด, ๊ฐ๋ณ ์์๋ค์ด ๋ชจ๋ ๋์ผํ๋๋ผ๋ React๋ ์ฌ์ ํ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค๋ฉด React๋ ํจ์์ ์ ์๊ฐ ๋์ผํ๋๋ผ๋ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ props๋ฅผ ๋จ์ํํ๊ฑฐ๋ ๋ฉ๋ชจํ ํ์ธ์.