React.memo & useMemo & useCallback

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์€ ํ•จ์ˆ˜๊ฐ€ ์žฌ์ƒ์„ฑ ๋˜๋Š”๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋‹ค.

JP
์ด์ค‘ํ‘œFrontend Engineer

3๋…„์ฐจ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž. Next.js, React, TypeScript ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ „๋ฌธ. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ SSRยทISR ๋ Œ๋”๋ง ์ „๋žต ์„ค๊ณ„ ๊ฒฝํ—˜.

์ด๋ ฅ์„œ ๋ณด๊ธฐโ†’