๋ฆฌ์กํธ์์๋ state
ํน์ props
์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค.
๋ถ๋ชจ์ state๋ฅผ props์ผ๋ก ๋ฐ๋ ์ปดํฌ๋ํธA์, ๋จ์ํ onClick()ํจ์๋ฅผ props์ผ๋ก ๋ฐ๋ ์ปดํฌ๋ํธ B๊ฐ ์๋ค๊ณ ํ์.
๋ถ๋ชจ์ state๊ฐ ๋ฐ๋๋ฉด ๋ถ๋ชจ ๋ฟ๋ง ์๋๋ผ ์์ ์ปดํฌ๋ํธ๋ ํจ๊ป ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค. ๋ณํ์ง ์์ onClick()ํจ์๋ฅผ props์ผ๋ก ์ ๋ฌ ๋ฐ๋ ์ปดํฌ๋ํธ B๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค. ์ด๋ onClick()ํจ์์ ์ฐธ์กฐ ๊ฐ์ด ๋ฌ๋ผ์ ธ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค.
๐ ๋ฐ์ดํฐ ์๋ฃ ๊ตฌ์กฐ
- ์์ํ: String, Number, Boolean, undefine, null, ...
- ์์ ์๋ฃํ์ด ํ ๋น๋ ๋์๋ ๋ณ์์ ๊ฐ(value) ์์ฒด๊ฐ ๋ด๊ธด๋ค.
- ์ฐธ์กฐํ: Array, Object, Function
- ์ฐธ์กฐ ์๋ฃํ์ด ํ ๋น๋ ๋๋ ๋ณด๊ดํจ์ ์ฃผ์(reference)๊ฐ ๋ด๊ธด๋ค.
์ต์ ํ๋ฅผ ํตํด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ฌ๋ณด์.
useCallback()
์ memoization ๊ธฐ๋ฅ์ผ๋ก ๊ธฐ์กด์ ์ํํ ์ฐ์ฐ ๊ฐ์ ์ ์ฅํด ๋๊ณ ์ฌ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ค๋ค.
useCallback()
์ผ๋ก ํจ์๋ฅผ ๊ฐ์ธ๋ฉด, ์์กด์ฑ ๋ฐฐ์ด(dependency)์ด ๋ณํ์ง ์๋ ์ด์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ๋ณ์์ ๋์ผํ ํจ์๊ฐ ํ ๋น๋์ด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ค์ด๋ ๋ค.๋ฆฌ์กํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋ ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋๋ฐ, ์ฒซ ๋ฒ์งธ๋ก Render Phase(๋ ๋ ๋จ๊ณ)
๋ฅผ ๊ฑฐ์น๊ณ ๋ ๋ฒ์งธ๋ก Commit Phase(์ปค๋ฐ ๋จ๊ณ)
๋ฅผ ๊ฑฐ์น๋ค.
Render Phase
Commit Phase
๊ฒฐ๋ก ์ ์ผ๋ก, useCallback()์ ์ฌ์ฉํ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์งํ ์ ์๊ฒ ๋์ด ์ปดํฌ๋ํธB์ render phase๋ ์คํ๋์์ง๋ง, commit phase๋ ์คํ๋์ง ์๋ ์ ์๋ฏธํ ํจ๊ณผ๋ฅผ ๊ฐ์ง ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ์ ํ render phase๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๊ณ์ ๋ฐ์ํ๋ค. ์ ๊ทธ๋ด๊น?
๋ฆฌ์กํธ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ด๋ณด๋ฉด React.createElement๋ก ์ฌ์ ํ ์ปดํฌ๋ํธB๋ฅผ ๋ง๋ค๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
render phase ๋ ๋ง๊ธฐ ์ํด์๋ React.memo
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
React.memo
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ฌ๋ฐ์ props๋ฅผ ์ด์ props์ ๋น๊ตํ์ฌ ๊ฐ์ผ๋ฉด ๋ฆฌ๋ ๋๋ง์ ๋ง์์ฃผ๊ณ , ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
์์ ๋น๊ต
๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ตํ๋ค.์์ ๋น๊ต
- ์์ํ์ : ๊ฐ์ด ๋ค๋ฅธ์ง ๋น๊ต
- ์ฐธ์กฐํ์ : ์ฐธ์กฐ ๊ฐ์ด ๊ฐ์์ง ๋น๊ต
function ์ปดํฌ๋ํธB({์จํด๋ฆญํจ์}){
return <div>
{์จํด๋ฆญํจ์}
</div>
}
export default React.memo(์ปดํฌ๋ํธB);
props๋ก ํจ์๋ง๊ณ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ปดํฌ๋ํธB๋ฅผ ๋ฆฌ์กํธ ๋ฉ๋ชจ๋ก ๊ฐ์ผ ์ฑ, props์ ์จํด๋ฆญํจ์ ๋์ ๋ณํ์ง ์๋ item์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ณด์.
//App.js
const item = {
name: "outer",
number: 100,
}
//...
return (
<์ปดํฌ๋ํธB item={item} />
)
//์ปดํฌ๋ํธB.js
function ์ปดํฌ๋ํธB({item}){
return(
//...
)
}
export default React.memo(์ปดํฌ๋ํธB);
์ด ๊ฒฝ์ฐ, React.memo()๋ฅผ ์ฌ์ฉํ๊ณ ์์์๋ ์ปดํฌ๋ํธB๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ค.
์ปดํฌ๋ํธ ์
์ฅ์์๋ ๋ถ๋ชจ๋ก ๋ถํฐ ๋งค๋ฒ ๋ค๋ฅธ item์ ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
item ์ด๋ผ๋ ๊ฐ์ฒด๊ฐ ๋งค๋ฒ ์๋ก ์์ฑ๋จ ๐ ์ปดํฌ๋ํธ์๊ฒ ๋งค๋ฒ ๋ค๋ฅธ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง item์ props์ผ๋ก ์ ๋ฌ ๐ React.memo() ์๋ํ์ง ์์
์ด๋ด ๋๋ useMemo()
ํ
์ ์ฌ์ฉํ๋ฉด ๋๋ค.
useCallback()
ํจ์์ ๋ํ memoization ์ ๊ณตuseMemo()
๊ฐ์ ๋ํ memoization ์ ๊ณต
์์กด์ฑ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋์ง ์๋ ์ด์, ๋ฆฌ๋ ๋ฐ๋๋ง์ ๊ฐ์ ๊ฐ ๋ฐํํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ์์ฐconst memoizedItem = useMemo(() => item, []);
useMemo()ํ ์ ์ฌ์ฉํด memoized๋ item์ ๋ง๋ค์ด ์ปดํฌ๋ํธB์ props์ผ๋ก ๋ณด๋ด๋ฉด item๊ณผ ๋์ผํ ๊ฐ์ฒด๊ฐ ์ ๋ฌ๋๋ฏ๋ก ๋ฆฌ์กํธ๋ฉ๋ชจ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค.