6.1 useMemo ๊ฐ์
useMemo๋ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ์ฌ ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ํ
์
๋๋ค. useMemo์์ Memo๋ memoization์ ๋ปํ๋ฉฐ ์ด์ด์ง๋ ์ฑํฐ์์ ๋ฉ๋ชจ์ด์ ์ด์
๊ณผ useMemo๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
6.1.2 ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)์ด๋?
๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด ๋๊ณ ์ด์ ๋ ๋๋ง์์ ๊ณ์ฐํ ๊ฐ๊ณผ ํ์ฌ ๋ ๋๋ง์์์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์ค๋ณต ์ฐ์ฐ์ ํ ํ์ ์์ด ์ ์ฅํด๋ ๊ฐ์ ์ฌ์ฌ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด A๋ผ๋ ํจ์์ ์ ์ฒด ์คํ์๊ฐ์ด 10์ด๋ผ๊ณ ๊ฐ์ ํด๋ณธ๋ค๋ฉด A ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค 10์ด๋ผ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฉ๋ชจ์ด์ ์ด์
์ ํตํด ๊ฐ์ ์ ์ฅํ๊ณ ํจ์๊ฐ ์คํ๋ ๋ ๊ฒฐ๊ด๊ฐ๋ง ์ฌ์ฌ์ฉํ๋ค๋ฉด ๊ทธ๋งํผ ์ฐ์ฐ์ ์ค์ผ ์ ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ์คํ ์๋๋ฅผ ์ฌ๋ฆด ์ ์๊ฒ ๋ฉ๋๋ค.
6.1.3 ํจ์ํ ์ปดํฌ๋ํธ
์๋์ ์์ ์์ ํจ์ํ ์ปดํฌ๋ํธ๋ 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์ด๊ฐ๋์ ์ฐ์ฐ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด ์ด๋จ๊น์?
๋ฆฌ๋ ๋๋ง์ด ์ธ ๋ฒ๋ง ์ผ์ด๋๋ ๊ฐ์ ๊ฐ์ ๋ฐ๋ณต ๊ณ์ฐํ์ฌ result์ ํ ๋น ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ๋นํจ์จ์ ์ผ ๊ฒ์
๋๋ค. ์ด๋ฌํ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ 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๋ ์์กด์ฑ ๋ฐฐ์ด์์ ์ ๋ฌํ๋ ๊ฐ์ ๋ณ๊ฒฝ ์ฌ๋ถ์ ๋ฐ๋ผ ์ค๋ณต ์ฐ์ฐ์ ์ต์ํ ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด ๋๊ณ ์ด์ ๋ ๋๋ง์์ ๊ณ์ฐํ ๊ฐ๊ณผ ํ์ฌ ๋ ๋๋ง์์์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์ค๋ณต ์ฐ์ฐ์ ํ ํ์ ์์ด ์ ์ฅํด๋ ๊ฐ์ ์ฌ์ฌ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ์ธ์์๋ ์์ ๊ฐ์ด ๋น ๋ฐฐ์ด ๋๋ ์์๊ฐ ๋ค์ด๊ฐ ์ ์๋๋ฐ, ๋น ๋ฐฐ์ด์ด ๋ค์ด๊ฐ๋ฉด ์ต์ด๋ก ์ปดํฌ๋ํธ๊ฐ ์คํ๋์์ ๋๋ง ๊ฐ์ ๊ณ์ฐํ๊ณ ์ดํ์๋ ๊ณ์ํด์ ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ์ ๊ฐ์ ธ์์ ์ฌ์ฌ์ฉ ํฉ๋๋ค.
๋ ๋ฒ์งธ ์ธ์์ ์์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค๋ฉด ํด๋น ์์๊ฐ ์
๋ฐ์ดํธ๋ ๋๋ง ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ค์ ํธ์ถํ์ฌ ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ ๋ค์ ๋ฉ๋ชจ์ด์ ์ด์
์ ํด์ค๋๋ค. ๋ฐ๋ผ์ useMemo๋ฅผ ์ฌ์ฉํ๋ ๊ถ๊ทน์ ์ธ ์ด์ ๋ ๋ฐ๋ณต๋๋ ์ฐ์ฐ์ ํผํ์ฌ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ์ ์์ต๋๋ค.
๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์๋ useMemo์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์์ ๊ฐ์ด ๋ํ๋ด๊ณ ์์ผ๋ฉฐ, useMemo๋ก ์ ๋ฌ๋ ํจ์๋ ๋ ๋๋ง ์ค์๋ง ์คํ๋๋ฉฐ, useMemo๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ์ ๋ฐํํ๋ค๊ณ ์ค๋ช
ํ๊ณ ์์ต๋๋ค. ์ด์ ๋ํด useMemo์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค.
useMemo๋ ์์ ๊ฐ์ด ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฉ๋ชจ์ด์ ์ด์
ํ ๊ฐ์ ๊ณ์ฐํด ์ค ์ฝ๋ฐฑํจ์๋ฅผ, ๋ ๋ฒ์งธ ์ธ์๋ ์์กด์ฑ ๋ฐฐ์ด(Array dependencies)์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฐ์ด์ด ์ ๋ฌ๋ฉ๋๋ค. useMemo๋ ์์กด์ฑ ๋ฐฐ์ด์ ์ ๋ฌ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋๋ง ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋๋ฐ, ์ด๋ ๋ ๋๋ง ๊ณผ์ ์์ ๋ฐฐ์ด ์์ ์์ item1๊ณผ item2์ ๊ฐ์ด ๋ณ๊ฒฝ๋์๋์ง๋ฅผ ํ์ธํ๊ณ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ์ฝ๋ฐฑ ํจ์๋ฅผ ๋์ ์์ผ์ ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)๋ ๊ฐ๋ง ๋ค์ ๊ณ์ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ฝ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ์๋ ๋ ๋๋ง ์ ์ ์ ์ฅ๋ ๋ง์ง๋ง ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ ํฉ๋๋ค. ์ฆ, useMemo๋ ์์กด์ฑ ๋ฐฐ์ด์์ ์ ๋ฌํ๋ ๊ฐ์ ๋ณ๊ฒฝ ์ฌ๋ถ์ ๋ฐ๋ผ ์ค๋ณต ์ฐ์ฐ์ ์ต์ํ ์ํฌ ์ ์์ต๋๋ค.
์ ๋ฆฌํ๋ฉด, ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด ๋๊ณ ์ด์ ๋ ๋๋ง์์ ๊ณ์ฐํ ๊ฐ๊ณผ ํ์ฌ ๋ ๋๋ง์์์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์ค๋ณต ์ฐ์ฐ์ ํ ํ์ ์์ด ์ ์ฅํด๋ ๊ฐ์ ์ฌ์ฌ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
6.2.1 useEffect ์ useMemo์ ์ฐจ์ด
useMemo๋ ์ด์ ์ฑํฐ 3์์ ๋ค๋ค๋ useEffect์ ๋น์ทํ๊ฒ ์์กด์ฑ ๋ฐฐ์ด(Array dependencies)์ ์ ๋ฌ๋ ๊ฐ์ ๋ณ๊ฒฝ ์ฌ๋ถ์ ๋ฐ๋ผ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ฉ๋๋ค. ์ด ๋ ๊ฐ์ง Hook์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ ๋๋ง ๊ณผ์ ์ค์ ๋์ ์ฌ๋ถ์
๋๋ค.
useEffect๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋ ๋๋ง์ด ์๋ฃ๋ ์ดํ์ ์คํ๋๋ฉฐ, ๋ ๋๋ง ํ ์ํ๊ฐ ์
๋ฐ์ดํธ ๋์์ ๋๋ฅผ ๊ฐ์งํ์ฌ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ง ๋ชปํฉ๋๋ค.
์ด์ ๋ฌ๋ฆฌ useMemo๋ ๋ ๋๋ง ๊ณผ์ ์ค์ ์คํ๋ฉ๋๋ค. ๋ ๋๋ง ๊ณผ์ ์ค์ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ ๋์๋์ง ํ์ธํ ํ, ๊ฐ์ด ๋ณ๊ฒฝ ๋์๋ค๋ฉด ์ด์ ์ ์ ์ฅํ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๊ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง ํด์ค๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ useMemo๋ ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ์ ํตํด ๋ถํ์ํ ๊ณ์ฐ์ ์ต์ํ ์ํค๊ณ , ๋ฆฌ๋ ๋๋ง์ ๋ง์ ์ ์์ผ๋ฏ๋ก ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ ๋ useMemo Hook์ ์ฌ์ฉํฉ๋๋ค.