๐ฉโ๐ useMemo๋ ๋ญ๊น?
์ปดํฌ๋ํธ๊ฐ ์ฌ ๋ ๋๋ง ๋ ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ฒ์ ๋ ๋๋ง ๊ฐ์ ๋ถ๋ฌ์ค๋ ๊ฒ
๐ฉโ๐ ์ผ๋จ useMemo๋ฅผ ์ดํดํ๊ธฐ ์ํด์ ๋ฆฌ์กํธ์ ๋ ๋๋ง ๊ตฌ์กฐ๋ฅผ ์์์ผํ๋ค
ํจ์ํ ์ปดํฌ๋ํธ ๊ธฐ์ค์ผ๋ก ๋ ๋๋ง ๊ตฌ์กฐ๋ฅผ ์์๋ณด์
๐ฉโ๐ ๋ฆฌ์กํธ์ ๋ ๋๋ง ๊ตฌ์กฐ
์ปดํฌ๋ํธ ๋๋๋ง โ ๊ฐ ๋ณ๊ฒฝ โ ๋ณ๊ฒฝ๊ฐ์ ๋ค๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ฌ ํธ์ถ
โ ์ปดํฌ๋ํธ ๋ด๋ถ ๋ฐ์ดํฐ&๋ณ์ ์ด๊ธฐํ โ ๊ฐ ์ ๋ฐ์ดํธ ์๋ฃ
์ด๋ ๊ฐ์ ์ ๋ฐ์ดํธ ํ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฐ ๊น์ง ๋ค์ ์ด๊ธฐํ ํ๋ ๊ฒ์ด ๋น ํจ์จ์ ์ด๋ผ๋ ํ๋จ์ด ๋ฌ
๐ก ๊ทธ๋์ ๋์จ๊ฒ useMemo ์ด๋ค
๐ฉโ๐ useMemo์ ๊ธฐ๋ณธ์ฝ๋
const ๋ฉ๋ชจ = useMemo(()=>{
return ๊ฐ
},[component]) //useEffect์ ๊ฐ์ ๋
ผ๋ฆฌ
์ค์ ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋ ๋ง๋ค ๋ฉ๋ชจ์ useMemo๊ฐ ์คํ
useMemo ์ค์ ์์ ์จ๋ณด๊ธฐ
๐ฉโ๐ ์์ )
const [number,setNumber] = useState(0);
const [isboolean,setIsboolean] = usestate(true)
const showBoolean = {
return isboolean ? "์ฑ๊ณต" : "์คํจ"
}
useEffect(()=>{
console.log("์ฝ์์ฐฝ ๋น๋๋ค")
},[showBoolean])
<input type="number" value={number} onChange={(e)=> setNumber(e.target.value)}/>
<p>ํ์ฌ์ซ์๋? : {number}</p>
<button onClick={() => setIsboolean(!isboolean)}>boolean๋ณ๊ฒฝ</button>
<div>{showBoolean}</div>
๐ฉโ๐ ์ด๋ ๊ฒ ์๋ค๋ ๊ฐ์ , number์ ๊ฐ์ ์ฆ๊ฐ ์ํฌ๋ ค๊ณ ํ๋ค.
number์ state๋ฅผ ์ฆ๊ฐ ์์ผฐ์ ๋, ๊ฑด๋ค์ด์ง ์์ showBoolean(์ด)๊ฐ
์์กด๋์ด ์๋ useEffect๊ฐ ์คํ์ด ๋๋ ์ํ์ด๋ค, ์ด๊ฑธ ํด๊ฒฐํด์ผํ๋ ๋ฌธ์
๐ฉโ๐ ๋ฌธ์ ๋ถ์
number์ ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉด state๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ ์ฌ ๋ ๋๋ง์ด ๋ฐ์ ํ๋๋ฐ ์ฌ ๋ ๋๋ง ์
์ปดํฌ๋ํธ์์ ์ ์ธ๋ [number,isboolean,showBlooean] ์ด๋ฐ ๋ฐ์ดํฐ๋ค์ด ๋ค ์ด๊ธฐํ ๋๊ธฐ
๋๋ฌธ์ ๋น ํจ์จ์ ์ฌ ๋ ๋๋ง์ด ๋ฐ์
์ด๋ ๊ฐ์ฒด๋ ์ด๊ธฐํ ๋ ๋ ๋ฐ๋ก showBoolean์ ์ ์ฅ ๋์ง์๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์
(์บ์ฑ-showBoolean) ์ ์ฅ ํ๋ค๊ฐ ๋ณ์์ ๋ด๊ฒจ showBoolean.name ์ด๋ ๊ฒ ์ฌ์ฉ ํ๋๋ฐ
์ปดํฌ๋ํธ๊ฐ ์ฌ ๋ ๋๋ง ์ ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ ๋์๋ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํด์
๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ (์บ์ฑ2-showBoolean)๋ก ์๋ก ๋ฎ์ด์ฐ๊ณ ๋ณ์์ ์ ์ฅ ํจ
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ useEffect๋ก showBoolean์ ์์กด์ฑ ์ค์ ํ์ ๊ฒฝ์ฐ showBoolean์ ๊ฐ์ด ๋ฐ๋์ง ์์๋ ์บ์ฑ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ธฐ ๋๋ฌธ์ useEffect๊ฐ ์คํ์ด ๋๋ ๊ฒ์ด๋ค
๐ฉโ๐ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น?
๐ก useEffect์ ์์กด๋์ด ์๋ showBoolean์ useMemo๋ก ๋ฉ๋ชจ๋ผ์ด์ฆ ์ํค๋ฉด ๋๋ค
import React, { useCallback, useEffect, useState, useMemo } from "react";
export default function App() {
const [numbers, setNumber] = useState(0);
const [isboolean, setIsboolean] = useState(true);
const showBoolean = useMemo(() => {
return isboolean ? "์ฑ๊ณต" : "์คํจ";
}, [isboolean]);
useEffect(() => {
console.log("์ฝ์์ฐฝ ๋น๋๋ค");
}, [showBoolean]);
//์ด๋ ๊ฒ showBoolean์ useMemo๋ก ๋ง๋ค์ด ๋ฒ๋ฆฌ๋ฉด input์์ onChange ํ ๋ state๊ฐ ๋ฐ๋์ด๋
console์ด ์ฐํ์ง ์๋๋ค. ์๋ํ๋ฉด showBoolean์ ๊ฑธ๋ ค์๋ isboolean์ด ์๋ฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
return (
<div>
<input
type="number"
value={numbers}
onChange={(e) => setNumber(e.target.value)}
/>
<p>ํ์ฌ์ซ์๋? : {numbers}</p>
<button onClick={() => setIsboolean(!isboolean)}>boolean๋ณ๊ฒฝ</button>
<div>{showBoolean}</div>
</div>
);
}
์ด๋ ๊ฒ ๋ฐ๊ฟ์ฃผ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฌ ๋ ๋๋ง ๋๋ useMemo๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ด ๋ฐ๋์ง ์์
useEffect๊ฐ ์คํ๋์ง ์๋๋ค.
๐ก๊ฒฐ๋ก : useMemo๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ๊ทธ ์์ useMemo๋ก ๊ฐ์ธ๋ฉด ๋๊ณ , ์ฝคํฌ๋ํธ๊ฐ ์ฌ๋๋๋ง ๋ ๋ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฑธ๋ ค์๋ state๊ฐ ๋ฐ๋์ง ์๋๋ค๋ฉด useMemo๋ ์คํ๋์ง ์๋๋ค
usecallback๊ณผ์ ์ฐจ์ด
useMemo๋ return ์ผ๋ก ๊ฐ์ ๋ฐํ ํ์ง๋ง usecallback์ ํจ์์์ฒด๋ฅผ ๋ฐํํ๋ค.
์์)
import React, { useState, useCallback, useMemo } from "react";
export default function App() {
const [ex, setEx] = useState(0);
const [why, setWhy] = useState(0);
// useCallback ์ด () => {console.log(why)} ๋ผ๋ ํจ์๋ฅผ ๋ฐํํ๋ค.
const useCallbackReturn = useCallback(() => {
console.log(why);
}, [ex]);
// useCallback ์ด ๋ด๊ฒจ์๋ ํจ์๋ฅผ ์คํ
useCallbackReturn();
return (
<>
<button onClick={() => setEx((curr) => curr + 1)}>X</button>
<button onClick={() => setWhy((curr2) => curr2 + 1)}>Y</button>
</>
);
}
ex๊ฐ ๋ณ๊ฒฝ ๋์ ๋ useCallbackReturn์ด ์คํ๋์ด console์ why๊ฐ ์ฐํ๋ค๋ ๊ฐ์
๊ทธ ๋ป์ ๋๋ฒ์งธ ๋ฒํผ setWhy๋ฅผ ๋ด๋นํ๋ ๋ฒํผ์ ์๋ฌด๋ฆฌ ๋๋ฌ๋
usecallbackReturn ํจ์์ ๋ด๊ธด console.log(why) ์ ๊ฐ์ ์ด๊ธฐ๊ฐ์์ ๋ณํ์ง ์๋๋ค (0)
ํ์ง๋ง setEx๋ฅผ ๋ด๋นํ๋ ๋ฒํผ์ ๋๋ฅด๋ ์ฆ์ ์ ๋ฐ์ดํธ ๋ why์ ๊ฐ์ ๋ฐํํ๋ค.