๐Ÿ—’๏ธ

6. useMemo

ย 

6.1 useMemo ๊ฐœ์š”

ย 
useMemo๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ›…์ž…๋‹ˆ๋‹ค. useMemo์—์„œ Memo๋Š” memoization์„ ๋œปํ•˜๋ฉฐ ์ด์–ด์ง€๋Š” ์ฑ•ํ„ฐ์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

6.1.1 ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)์ด๋ž€?

ย 
๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์€ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ด๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด ๋‘๊ณ  ์ด์ „ ๋ Œ๋”๋ง์—์„œ ๊ณ„์‚ฐํ•œ ๊ฐ’๊ณผ ํ˜„์žฌ ๋ Œ๋”๋ง์—์„œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ, ์ค‘๋ณต ์—ฐ์‚ฐ์„ ํ•  ํ•„์š” ์—†์ด ์ €์žฅํ•ด ๋‘” ๊ฐ’์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A๋ผ๋Š” ํ•จ์ˆ˜์˜ ์ „์ฒด ์‹คํ–‰์‹œ๊ฐ„์ด 10์ดˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณธ๋‹ค๋ฉด A ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค 10์ดˆ๋ผ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊ฒฐ๊ด๊ฐ’๋งŒ ์žฌ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ทธ๋งŒํผ ์—ฐ์‚ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์†๋„๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 

6.1.2 ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

ย 
์•„๋ž˜ ์˜ˆ์ œ์—์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” MyComponent๋ฅผ ๋งํ•˜๋ฉฐ, MyComponent๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
function calc(a, b) { return a + b } // ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ const MyComponent() { const result = calc(3,5) return <p>{result}</p> }
ย 
๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ย ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜, props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งˆ๋‹คย ๋ฆฌ๋ Œ๋”๋ง์ดย ๋˜๋Š”๋ฐ, ๋ฆฌ๋ Œ๋”๋ง์ดย ๋  ๋•Œ๋งˆ๋‹คย MyComponent๋ฅผย ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ  ๋ณ€์ˆ˜ result๋Š”ย ์ดˆ๊ธฐํ™”๋˜๋ฏ€๋กœย ๋งค๋ฒˆย calcย ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ๋งŒ ํ•˜๊ณ  ๋๋‚ด๋Š” ํ•จ์ˆ˜๋ผ๋ฉด ์ƒ๊ด€์—†๊ฒ ์ง€๋งŒ, ๋งŒ์•ฝย calcย ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์•ฝ 10์ดˆ ๊ฐ€๋Ÿ‰์˜ ์—ฐ์‚ฐ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?
๋ฆฌ๋ Œ๋”๋ง์ด ์„ธ ๋ฒˆ๋งŒ ์ผ์–ด๋‚˜๋„ 30์ดˆ ๊ฐ€๋Ÿ‰์˜ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š”ย useMemo๋ฅผย ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ด๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ๋’ค,ย ๋ฆฌ๋ Œ๋”๋ง์ดย ๋  ๋•Œ ๊ทธ ๊ฒฐ๊ด๊ฐ’๋งŒ ๊ฐ€์ ธ์™€์„œ ์žฌ์‚ฌ์šฉํ•ด ์คŒ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ย ์ตœ์ ํ™”ํ• ย ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

6.2 useMemo์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

ย 
// ๋นˆ ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ const result = useMemo(() => calc(a, b), []); // ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ const result = useMemo(() => calc(a, b), [item);
ย 
useMemo์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. useMemo๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด(Array dependencies)์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฐฐ์—ด์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž์— ๋“ค์–ด๊ฐ€๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ด๊ฐ’์€ useMemo์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒฐ๊ด๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.
ย 
๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์š”์†Œ๊ฐ€ย ๋“ค์–ด๊ฐˆ ๋•Œ์—๋Š”ย ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ์ „๋‹ฌ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋  ๋•Œ๋งŒย ์ฝœ๋ฐฑย ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ, ์ด๋•Œ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ฐฐ์—ด ์•ˆ์˜ ์š”์†Œ item์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒย ์ฝœ๋ฐฑย ํ•จ์ˆ˜๋ฅผย ๋™์ž‘์‹œ์ผœ์„œย ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)๋œ ๊ฐ’๋งŒ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œย useMemo๋Š”ย ์˜์กด์„ฑ ๋ฐฐ์—ด์—์„œ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ค‘๋ณต ์—ฐ์‚ฐ์„ย ์ตœ์†Œํ™”ํ• ย ์ˆ˜ย ์žˆ์œผ๋ฏ€๋กœย ์ปดํฌ๋„ŒํŠธ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6.2.1 useEffect ์™€ useMemo์˜ ์ฐจ์ด

ย 
useMemo๋Š” ์ด์ „ ์ฑ•ํ„ฐ 3์—์„œ ๋‹ค๋ค˜๋˜ useEffect์™€ ๋น„์Šทํ•˜๊ฒŒ ์˜์กด์„ฑ ๋ฐฐ์—ด(Array dependencies)์— ์ „๋‹ฌ๋œ ๊ฐ’์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
์ด ๋‘ ๊ฐ€์ง€ Hook์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ Œ๋”๋ง ๊ณผ์ • ์ค‘์˜ ๋™์ž‘ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.
useEffect๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋œ ์ดํ›„์— ์‹คํ–‰๋˜๋ฉฐ, ๋ Œ๋”๋ง ํ›„ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
์ด์™€ ๋‹ฌ๋ฆฌ useMemo๋Š” ๋ Œ๋”๋ง ๊ณผ์ • ์ค‘์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๊ณผ์ • ์ค‘์— ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„, ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ๋‹ค๋ฉด ์ด์ „์— ์ €์žฅํ•œ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋งŒ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— useMemo๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ๋•Œ useMemo Hook์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ย 

6.3 useMemo ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

ย 

6.3.1 (์‹ค์Šต1) useMemo ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

ย 
์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด useMemo๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ˆ์ œ๋Š” ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ˆซ์ž์™€ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. App.jsx์—์„œ๋Š” ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค heavyCalc ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ number์™€ text๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜ ํ•ธ๋“ค๋Ÿฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋€ number์™€ text๊ฐ’์„ ๋ณด์—ฌ์ฃผ๋Š” ShowState ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
import React, { useState,useMemo } from 'react'; import ShowState from './ShowState'; export default function App() { const [number, setNumber] = useState(0); const [text, setText] = useState(''); // ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ function heavyCalc() { let s = 0; for (let i = 0; i < 1000000000; i++) { s += i; } return s; } let calc = heavyCalc(); // number ๊ฐ’ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜ const increaseNum = () => { setNumber((prev) => prev + 1); }; const decreaseNum = () => { setNumber((prev) => prev - 1); }; // text๊ฐ’ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜ const handleText = (e) => { setText(e.target.value); }; return ( <> <h4> โœจ ์—„์ฒญ๋‚œ ์—ฐ์‚ฐ๊ฐ’</h4> <p>{calc}</p> <h4> โœจ ์ˆซ์ž๋ฐ”๊พธ๊ธฐ</h4> <button onClick={increaseNum}>+</button> <button onClick={decreaseNum}>-</button> <h4> โœจ ๊ธ€์ž๋ฐ”๊พธ๊ธฐ</h4> <input type="text" onChange={handleText} /> <ShowState number={number} text={text} /> </> ); }
ย 
ShowState ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” App.jsx์—์„œ ๋ฐ”๊พผ ๊ฐ’๋“ค์„ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค '์ˆซ์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' ์™€ '๊ธ€์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' ๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
ย 
import React, { useMemo } from 'react'; export default function ShowState({ number, text }) { const consoleNumber = (number) => { console.log('์ˆซ์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); return number; }; const consoleText = (text) => { console.log('๊ธ€์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); return text; }; const showNum = consoleNumber(number); const showText = consoleText(text); return ( <div> <p> ์ˆซ์ž : {showNum}</p> <p> ๊ธ€์ž : {showText}</p> </div> ); }
๊ทธ๋ฆผ 6-1๊ทธ๋ฆผ 6-1
๊ทธ๋ฆผ 6-1
ย 
์œ„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฐ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. + ์™€ - ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ˆซ์ž ๊ฐ’์ด ๋ฐ”๋€Œ๊ณ , input์ฐฝ์— ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž…๋ ฅํ•˜๋Š”๋Œ€๋กœ ๊ธ€์ž๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜๋Š”๋ฐ, ์ด๋Š” ์ˆซ์ž๋‚˜ ๊ธ€์ž๋ฅผ ๋ฐ”๊ฟˆ์œผ๋กœ์จ ํ™”๋ฉด์ด ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค heavyCalc ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒย heavyCalcย ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์ธ calc๋Š” ๊ณ„์† ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ์ƒˆ๋กœ ์—ฐ์‚ฐ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ด์ „์— ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ›…์ด ย useMemoย ์ž…๋‹ˆ๋‹ค.
ย 
App.jsx์˜ heavyCalc ํ•จ์ˆ˜ ์‹คํ–‰๋ฌธ์„ ์ด๋ ‡๊ฒŒ useMemo๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์‹ผ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
ย 
const calc = useMemo(() => { return heavyCalc(); }, []);
ย 
useMemo๋ฅผ ํ†ตํ•ด ์ด์ „์— ๊ณ„์‚ฐํ–ˆ๋˜ 499999999067109000 ๋ผ๋Š” ๊ฐ’์„ ๊ณ„์† ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๋ถ€ํ•˜๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ useMemo๋Š” ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด์ „ ๋ Œ๋”๋ง๊ณผ ํ˜„์žฌ ๋ Œ๋”๋ง ์‚ฌ์ด์— ๊ฐ’์ด ๋™์ผํ•˜๋‹ค๋ฉด ๋‹ค์‹œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ์„ ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•˜๋Š” ๋Œ€์‹ , ๊ธฐ์กด์— ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘์—ˆ๋˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.
์ด์ œ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ ๋‹ค์‹œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋ณผ๊นŒ์š”?
ย 
๊ทธ๋ฆผ 6-2๊ทธ๋ฆผ 6-2
๊ทธ๋ฆผ 6-2
ย 
increaseNum ํ•จ์ˆ˜๋ฅผ ๋‘๋ฒˆ ์‹คํ–‰ํ•˜์—ฌ ์ˆซ์ž๊ฐ€ 2๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ˜์†”์ฐฝ์„ ํ™•์ธํ•˜๋‹ˆ increaseNum ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค Text๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š์•˜์Œ์—๋„ '๊ธ€์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๊ฐ™์ด ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” state์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ํ•„์š”๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— useMemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆซ์ž๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ์™€ ๊ธ€์ž๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ์—๋งŒ ๊ฐ๊ฐ ๊ทธ์— ๋งž๋Š” console ์ถœ๋ ฅ์„ ํ•˜๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
const showNum = useMemo(() => consoleNumber(number), [number]); const showText = useMemo(() => consoleText(text), [text]);
ย 
showNum๊ณผ showText ๊ฐ’์„ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ number ๊ฐ’์ด ๋ณ€ํ–ˆ์„๋•Œ๋งŒ consoleNumber ํ•จ์ˆ˜๊ฐ€, text๊ฐ’์ด ๋ณ€ํ–ˆ์„๋•Œ๋งŒ consoleTextํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 6-3๊ทธ๋ฆผ 6-3
๊ทธ๋ฆผ 6-3
ย 
์ด์ „์ฒ˜๋Ÿผ increasNum ์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ text์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ consoleNumber ํ•จ์ˆ˜๋งŒ ๋‘ ๋ฒˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 6-4๊ทธ๋ฆผ 6-4
๊ทธ๋ฆผ 6-4
ย 
์ด ์ƒํƒœ์—์„œ text์˜ ๊ฐ’์„ ๋‹ค์„ฏ ๋ฒˆ ๋ณ€๊ฒฝํ•˜๋ฉด consoleTextํ•จ์ˆ˜๋„ ๋‹ค์„ฏ ๋ฒˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ์ˆซ์ž๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋Š” โ€˜์ˆซ์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.โ€™ ๋ผ๋Š” console๋งŒ ์ถœ๋ ฅ๋˜๊ณ , ๊ธ€์ž๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋Š” '๊ธ€์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' ๋ผ๋Š” console๋งŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ useMemo ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์ด์ „์— ์ €์žฅ๋˜์—ˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์™€ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ตœ์ ํ™”์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

6.3.2 (์‹ค์Šต2) useMemo ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

ย 
์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” useMemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๊ฐ์ฒด ํƒ€์ž…์ผ ๋•Œ ์ƒ๊ธฐ๋Š” ์ฐธ์กฐ ๋™์ผ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” number์™€ answer๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ์ค‘ answer๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ ์ฝ˜์†”์ด ์ฐํžˆ๋„๋ก ์ž‘์„ฑํ•ด๋†“์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
ย 
import React, { useEffect, useState, useMemo } from "react"; function App() { const [number, setNumber] = useState(0); const [isTrue, setIsTrue] = useState(true); const answer = isTrue ? "true" : "false"; // answer๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ ์ฝ˜์†”์ด ์ฐํžˆ๋„๋ก ์ž‘์„ฑ useEffect(() => { console.log("answer์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); }, [answer]); return ( <div> <p>โœจ number</p> <input type="number" value={number} onChange={(e) => setNumber(e.target.value)} /> <hr /> <p>โœจ answer</p> <p>T or F ? {answer}</p> <button onClick={() => setIsTrue(!isTrue)}>Click</button> </div> ); } export default App;
App.js
ย 
์•„๋ž˜์™€ ๊ฐ™์ด number๋ฅผ 10์œผ๋กœ, answer๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด answer๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ๋งŒ ์ฝ˜์†”์ด ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 6-5๊ทธ๋ฆผ 6-5
๊ทธ๋ฆผ 6-5
ย 
๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” ์›์‹œ ํƒ€์ž…์ธ answer๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  ์ด์ „๊ณผ ๊ฐ™์ด number๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
import React, { useEffect, useState, useMemo } from "react"; function App() { const [number, setNumber] = useState(0); const [isTrue, setIsTrue] = useState(true); const answer = { bool: isTrue ? "true" : "false" }; useEffect(() => { console.log("answer์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); }, [answer]); return ( <div> <p>โœจ number</p> <input type="number" value={number} onChange={(e) => setNumber(e.target.value)} /> <hr /> <p>โœจ answer</p> <p>T or F ? {answer.bool}</p> <button onClick={() => setIsTrue(!isTrue)}>Click</button> </div> ); } export default App;
App.js
ย 
์•„๋ž˜์— ์‹คํ–‰๋œ ๊ฒƒ์„ ๋ณด๋ฉด number๋งŒ ๋ณ€๊ฒฝํ–ˆ์Œ์—๋„ ์ฝ˜์†”์ด ์ถœ๋ ฅ๋˜์—ˆ๊ณ  ์ด๋Š” ๊ณง answer๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 6-6๊ทธ๋ฆผ 6-6
๊ทธ๋ฆผ 6-6
ย 
์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
number๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉด, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์ธ App ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์ด ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋˜์–ด ๋‹ค์‹œ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ํƒ€์ž…์ธ answer๊ฐ€ ๋‹ค์‹œ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด ํƒ€์ž…์€ ๊ทธ ๊ฐ’์ด ๋ณ€์ˆ˜์— ์ง์ ‘ ์ €์žฅ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Ÿ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜๊ณ , ๋ณ€์ˆ˜์—๋Š” ๊ทธ์— ๋งž๋Š” ๋‹ฌ๋ผ์ง„ ์ฃผ์†Ÿ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. useEffect๋Š” ๋ Œ๋”๋ง ์ „๊ณผ ํ›„์˜ answer์˜ ์ฃผ์†Ÿ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ฝ˜์†”์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
const answer = useMemo(() => { return { bool: isTrue ? "true" : "false" }; }, [isTrue]);
ย 
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ useMemo๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด useMemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ตœ์ดˆ๋กœ ๋ Œ๋”๋ง ๋  ๋•Œ ๊ฐ์ฒด์˜ ์ฃผ์†Ÿ๊ฐ’์„ answer๊ฐ€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋ฆฌ๋ Œ๋”๋ง๋ถ€ํ„ฐ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋œ ์ฃผ์†Ÿ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋”๋ผ๋„ ์ฝ˜์†”์€ ์ฐํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 6-7๊ทธ๋ฆผ 6-7
๊ทธ๋ฆผ 6-7
ย 
์ด์ฒ˜๋Ÿผ useMemo๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ด๊ฐ’์„ ๊ธฐ์–ตํ•จ์œผ๋กœ์จ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย