
React.memo & useMemo & useCallback
๐ React.memo & useMemo & useCallback
๐ง React.memo, useMemo์ useCallback์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์์์ผ ํ๋ ๊ฒ
ํจ์ํ ์ปดํฌ๋ํธ๋ ๊ทธ๋ฅ ํจ์๋ค. ๋ค์ ํ ๋ฒ ๊ฐ์กฐํ์๋ฉด ํจ์ํ ์ปดํฌ๋ํธ๋ ๋จ์ง jsx๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ค๋ ๊ฒ์ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ํจ์(์ปดํฌ๋ํธ)๋ฅผ ํธ์ถํ์ฌ์ ์คํ๋๋ ๊ฒ์ ๋งํ๋ค. ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ๋ด๋ถ์ ์ ์ธ๋์ด ์๋ ํํ์(๋ณ์, ๋๋ค๋ฅธ ํจ์ ๋ฑ)๋ ๋งค๋ฒ ๋ค์ ์ ์ธ๋์ด ์ฌ์ฉ๋๋ค.
์ปดํฌ๋ํธ๋ ์์ ์ state๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ๋ถ๋ชจ์๊ฒ์ ๋ฐ๋ props๊ฐ ๋ณ๊ฒฝ๋์์ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง ๋๋ค. (์ฌ์ง์ด ํ์ ์ปดํฌ๋ํธ์ ์ต์ ํ ์ค์ ์ ํด์ฃผ์ง ์์ผ๋ฉด ๋ถ๋ชจ์๊ฒ์ ๋ฐ๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋๋ผ๋ ๋ฆฌ๋ ๋๋ง ๋๋๊ฒ ๊ธฐ๋ณธ์ด๋ค. )
useCallback ๊ณผ useMemo ๋ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ๋ฐํํ๋ค. ์ฐจ์ด์ ์ useCallback์ ํจ์๋ฅผ ๋ฉ๋ชจ์ ์ด์ ํ๊ณ useMemo๋ ๊ฐ์ ๋ฉ๋ชจ์ ์ด์ ํ๋ค.
์ฌ๊ธฐ ๊ฐ๋จํ ์ฑ์ด ์๋ค.

์ซ์๋ฅผ ํด๋ฆญํ๋ฉด ์ซ์๊ฐ 1์ฉ ์ฆ๊ฐํ๋ ์ฑ์ด๋ฉฐ ์๋์๋ ๋ฒํผ์ ๋ง๋ค์ด ์ฃผ์๋ค.

์คํํ ๋ชจ์ต์ ์์ ๊ฐ๋ค.
Button ์ปดํฌ๋ํธ๋ props๊ฐ ์๋ ์์ UI ์ปดํฌ๋ํธ์ด๋ค.

์ด ์ปดํฌ๋ํธ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ return ํ์ง๋ง '๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋ ์์ ์ปดํฌ๋ํธ๋ก ๋ฆฌ๋ ๋๋ง ๋๋ค'๋ผ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ถ๋ชจ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋ ํญ์ ๋ฆฌ๋ ๋๋ง ๋๋ค.

๋ฌผ๋ก ์ง๊ธ๊ณผ ๊ฐ์ด ๋งค์ฐ ๊ฐ๋จํ ์ฑ์์๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๋ช๋ฒ์ด๊ณ ์ผ์ด๋๋ ์ฑ๋ฅ์ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค. ํ์ง๋ง ๋ง์ฝ Button์ด๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์์ฒญ ๋ณต์กํ๊ณ ๊ฐ๋น์ผ ์ฝ๋๋ฅผ ํฌํจํ๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ์ด๋จ๊น? ๋ฆฌ๋ ๋๋ง์ ์ต๋ํ ์ค์ฌ์ผํ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ง์ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
๋ฐ๋ก React memo๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ React.memo
React.memo๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํด์ค๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋๊ฒจ๋ฐ๋ props๊ฐ ๊ฐ๋ค๋ฉด ๋ฉ๋ชจ์ด์ ์ด์ ํด๋ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ํ ๋ด์ฉ์ ์ฌ์ฌ์ฉํ์ฌ ๋ ๋๋ง์ ๊ฐ์Dom์์ ๋ฌ๋ผ์ง ๋ถ๋ถ์ ํ์ธํ์ง ์์ ์ฑ๋ฅ์์ ์ด์ ์ด ์๊ธด๋ค.

์์ ๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
๊ทธ๋ผ Button ์ปดํฌ๋ํธ๋ฅผ React.memo๋ก ๊ฐ์ธ๋ณด์.

์ด์ ๋ฒํผ์ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.

์ด์ ๋ฒํผ์ด ์ ์ญํ ์ ํ๊ธฐ์ํด Reset ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ซ์๊ฐ 0์ผ๋ก ๋ฆฌ์ ๋๋๋ก ๊ตฌํํด๋ณด์.

onClick ํจ์๋ฅผ ๋ง๋ค๊ณ Button ์ปดํฌ๋ํธ์ Props๋ก ๋๊ฒจ์ฃผ์๋ค.

์ด์ ๋ค์ ์ฑ์ ์คํ์์ผ๋ณด๋ฉด ๋ฒํผ์ ์ ๋์ํ์ง๋ง ์ซ์๋ฅผ ํด๋ฆญํ๋ฉด ๋ฒํผ์ด ๋ค์ ๋ฆฌ๋ ๋๋ง ๋๋ ํ์์ด ์๊ฒผ๋ค.

๐ง ์ React.memo๋ ์ ๊ธฐ๋ฅ์ ๋ชปํ๊ฒ ๋์์๊น?
๋ฆฌ๋ ๋๋ง์ด ๋ฐ์๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๋ค์ ์์ฑํ๋ค.(ํจ์๋ ๊ฐ์ฒด์ด๋ค.) javascript์์ ๊ฐ์ฒด๋ ์ฐธ์กฐํ์ ์ผ๋ก ์์ ํ ๋์ผํ ๊ฐ์ ๊ฐ์ง๊ณ ์๋๋ผ๋ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ ๋ค๋ฅด๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋๋ค.

์ฆ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ํจ์๋ฅผ ๊ณ์ ์์ฑํ๋ฉฐ React.memo๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋ถํฐ ๋ฐ๋ Props๊ฐ ๋ณ๊ฒฝ ๋์๋ค๊ณ ํ๋จํ์ฌ ๊ณ์ ๋ฆฌ๋ ๋๋ง ๋๋๊ฒ์ด๋ค.
useCallbackrhk useMemo๋ ์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ ๋๋ง๊ณผ ๋ถํ์ํ ๊ณ์ฐ์ ๋ฐฉ์งํ๋ ๋ชฉ์ ์ ์ค๊ณ๋์๋ค.
๐ useCallback
useCallback ์ ์ธ์ ๋ ๋์ผํ ํจ์๋ฅผ returnํด์ค๋ค.
deps์์ ๋ฃ์ด์ค ๊ฐ์ด ๋ฐ๋๋์๋ง ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
React.memo๋ก ๊ฐ์ธ์ค ์์ ์ปดํฌ๋ํธ์๊ฒ ํจ์๋ฅผ props๋ก ๋๊ฒจ์ค๊ฒฝ์ฐ ๋๊ฒจ๋ฐ๋ ํจ์๋ฅผ useCallback์ผ๋ก ๊ฐ์ธ์ฃผ๋ฉด deps๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ํญ์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค์ผ๋ก ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ค.


๐ useMemo
useMemo๋ useCallback๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.

Button์ด ๊ณตํต ์ปดํฌ๋ํธ์ด๊ณ ์ํฉ์ ๋ฐ๋ผ style์ ์ปค์คํ ํ๊ฒ props๋ก style์ ๋๊ฒจ์ค๋ค๊ณ ๊ฐ์ ํ๋ค.

react์์ ์ธ๋ผ์ธ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฃ์ผ๋ฉด ์์์ ์ค๋ช ํ๊ฒ์ฒ๋ผ ๋ฆฌ๋ ๋๋ง์๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค ๋ฐ๋ผ์ Button์ ๊ณ์ ๋ฆฌ๋ ๋๋ง ๋๋ค.

์ด๋ useMemo๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํด์ค์ผ๋ก style props์ ๋ํด ๋์ผํ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ ์ ์๋ค.


deps(์์กด์ฑ๋ฐฐ์ด)์ด ๋น ๋ฐฐ์ด์ธ ์ด์ ๋ ์์ ์์์์๋ ํด๋น ํจ์๋ ๊ฐ์ด ์์กดํ๋ ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์์กดํ๋ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ ๋ฐ๋์ deps ๋ฐฐ์ด์์ ๋ช ์ํด์ค์ผ ํ๋ค.
๐ง ์ฐจ์ด์
-
React.memo๋ HOC์ด๊ณ , useMemo์ useCallback์ hook์ด๋ค.
-
React.memo๋ HOC์ด๊ธฐ ๋๋ฌธ์ ํด๋์คํ ์ปดํฌ๋ํธ, ํจ์ํ ์ปดํฌ๋ํธ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, useMemo๋ hook์ด๊ธฐ ๋๋ฌธ์ ํจ์ํ ์ปดํฌ๋ํธ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
-
useMemo๋ ํจ์์ ์ฐ์ฐ๋์ด ๋ง์๋ ์ด์ ๊ฒฐ๊ณผ๊ฐ์ ์ฌ์ฌ์ฉํ๋ ๋ชฉ์ ์ด๊ณ , useCallback์ ํจ์๊ฐ ์ฌ์์ฑ ๋๋๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ค.