userMemo ์ฌ์ฉํด๋ณด๊ธฐMini Question! useMemo์ useEffect์ ์ฐจ์ดuseMemouseEffect์ฐจ์ด์ ์์ฝ
ย
useMemo๋ useEffect์ ๋น์ทํ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. state๊ฐ ์๋ ์ปดํฌ๋ํธ์ state ๋ณํ๊ฐ ์๊ธฐ๋ฉด ์ฌํ๊ฐ ํ ์๋ก ๋๋๋ง์ ํ๊ธฐ๋๋ฌธ์ด์ฃ . ์ด๋ค๋ถ๋ถ์ด ๋ค๋ฅธ์ง ์ ์ด ๋๊ฐ์ง๋ก ๋ถ๋ฆฌํ๋์ง๋ ๋ค์์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ย
์๋ ์ฝ๋๋ฅผ ์ดํด๋ด
์๋ค. ํ์ฌ ๊ฐ์ด ๋ณํ๋ ๊ณณ์ ์ด 3๊ตฐ๋ฐ์
๋๋ค.
- ์ด๋ฆ์ ์ ๋ ฅํ ๋ โ setName
- ์์ด๋๋ฅผ ์ ๋ ฅํ ๋ โ setId
- ๋ฒํผ์ ๋๋ ์ ๋ โ setUserInfo + getNum
๋ฆฌ์กํธ๋ ์ํ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ 3๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋ ๋ ๋๋ง๋ฉ๋๋ค. ๋ ๋๋ง์ด ๋๋ ๊ณณ๋ง๋ค console.log()๋ฅผ ์คํํด ๋ณผ๊น์?
import { useState, useRef } from "react"; const App = () => { const inputName = useRef(null); const inputId = useRef(null); const [userInfo, setUserInfo] = useState([]); const [name, setName] = useState(""); const [id, setId] = useState(""); const getNum = (li) => { console.log("๋ ๋๋ง"); return li.length; }; const handleSubmit = (e) => { e.preventDefault(); // userInfo.push({}); const newInfo = [...userInfo, { name: name, id: id }]; inputName.current.value = ""; inputId.current.value = ""; inputName.current.focus(); setUserInfo(newInfo); // onChange ์ด๋ฒค๋๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ console.log("๋ ๋๋ง-3"); }; const handleInputName = (e) => { setName(e.target.value); // onChange ์ด๋ฒค๋๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ console.log("๋ ๋๋ง-1"); }; const handleInputId = (e) => { setId(e.target.value); // onChange ์ด๋ฒค๋๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ console.log("๋ ๋๋ง-2"); }; return ( <> <form> <input type="text" placeholder="์ด๋ฆ์ ์ ๋ ฅํ์ธ์" onChange={handleInputName} ref={inputName} /> <input type="text" placeholder="์์ด๋๋ฅผ ์ ๋ ฅํ์ธ์" onChange={handleInputId} ref={inputId} /> <button type="submit" onClick={handleSubmit}> ๋ฒํผ </button> </form> <ul> {userInfo.map((value, index) => ( <li key={index}> <h3>{value.name}</h3> <strong>@{value.id}</strong> </li> ))} </ul> <span>{getNum(userInfo)}</span> </> ); }; export default App;
์ฒ์ ์ปดํฌ๋ํธ๊ฐ ์คํ๋ฌ์ ๋ ์ ์ฒด ๋ ๋๋ง์ด ์ผ์ด๋ ํ์, ์ด๋ฆ์ ์
๋ ฅํ๋ input์ฐฝ์ 3๋ฒ ์
๋ ฅ์ ํ์ ๋ ๋ ๋๋ง-1, ๋ ๋๋ง์ด ์ถ๋ ฅ๋์์ต๋๋ค.
ย


ย
๋ค์ ์๋ก๊ณ ์นจํ๊ณ ํ์ธํด๋ณผ๊น์? ์ฒ์ ์ปดํฌ๋ํธ๊ฐ ์คํ๋ฌ์ ๋ ์ ์ฒด ๋ ๋๋ง์ด ์ผ์ด๋ ํ์, ์์ด๋๋ฅผ ์
๋ ฅํ๋ input์ฐฝ์ 3๋ฒ ์
๋ ฅ์ ํ์ ๋ ๋ ๋๋ง-2, ๋ ๋๋ง์ด ์ถ๋ ฅ๋์์ต๋๋ค.
ย


ย
์
๋ ฅํ ๋๋ ์
๋ ฅ ๋ ๋๋ง์ด, ๋ฒํผ์ ๋๋ฅผ ๋๋ ๋ฒํผ ๋ ๋๋ง๊ณผ getNum ๋ ๋๋ง์ด, ์์ด๋๋ฅผ ์
๋ ฅํ ๋๋ ์์ด๋ ๋ ๋๋ง์ด ์ถ๋ ฅ๋์ด์ผ ํฉ๋๋ค.
ย
ํ์ง๋ง ์คํํด๋ณด๋ฉด ๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์! ์์ด๋๋ฅผ ์
๋ ฅํ๋๋ฐ๋, getNum์ ์๋ ๋ ๋๋ง์ด ํจ๊ป ์ถ๋ ฅ๋๊ณ ์์ต๋๋ค.
ย
ํ์ฌ ๋ฐ๋๋ ๋ถ๋ถ์ input ์ฐฝ์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด React๋ ๋ฐ๋๋ ๋ถ๋ถ๋ง ๋ ๋๋ง์ ํด์ผํ๋๋ฐ ์ฝ๋ ์ ์ฒด๋ ๋ ๋๋ง๋๊ณ ์์ต๋๋ค.
๋ฆฌ์กํธ์์๋ ๊ฐ์๋์ด๋ผ๋๊ฒ์ ์ฌ์ฉํ๋๋ฐ์ ์ด๊ฒ์ ๊ธฐ์กด ๋๊ณผ๋ ๋ค๋ฅด๊ฒ ์์ฒญ ๊ฐ๋ฒผ์ด ์ ๋ณด๋ง ๊ฐ์ง๊ณ ์์ด์ ๋น ๋ฅด๊ฒ ๋น๊ต๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ฟผ๋ฆฌ์
๋ ํฐ๋ฑ์ ์ด์ฉํ์ฌ ๋์ ํ์ํ๋ฉด ๋งค์ฐ๋ง์ ์ ๋ณด๋ค์ด ๋ค์ด์๋๋ฐ ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ๊ฐ์ง๊ณ ๋น๊ตํ๊ธฐ์๋ ๋๋ฌด ๋ฌด๊ฒ๊ณ ๋๋ฆฝ๋๋ค!
๊ทธ๋์ ๋น๊ต์ ํ์์๋ ๋ถ๋ถ๋ค์ ๋นผ๋ฒ๋ฆฐ ๊ฐ์๋์ ์ด์ฉํด ์ค์ ๋น๊ต์ ํ์ํ ๋ถ๋ถ๋ค๋ง ๋น๊ตํฉ๋๋ค.
์ต์ด๋ ๋๋ง -> ์ด์ ๋ ๋๋ง๋ถ๋ถ์ ๊ฐ์๋ ์ ์ฅ -> ์ํ์
๋ฐ์ดํธ -> ์ํ์
๋ฐ์ดํธ๋ก์ธํ ๊ฐ์๋๋ ๋๋ง -> ์
๋ฐ์ดํธ๋ก์ธํด ๋ ๋๋ง๋ ๊ฐ์๋๊ณผ ์ด์ ์ ๋ง๋ค์ด์ง ๊ฐ์๋์ ๋น๊ต -> ๋ฐ๋๋ถ๋ถ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง
์์๊ฐ์ ๊ณผ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ฐ์.
์๋์์ getNum์ด ์คํ๋๋ ์ด์ ๋
1. return ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ธ๋ค ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง์ ์ ๊ฐ์๋์ผ๋ก ๋ ๋๋ง(์์ฑ)<< ์ด๋ getNum์ด ์คํ๋จ
2. ์ด์ ์ ๋ ๋๋งํ๋ ๊ฐ์๋๊ณผ ์
๋ฐ์ดํธ๋ ์์ ์ธ ๊ฐ์๋์ ๋น๊ต(์ํ๋ณํ๊ฐ ์ผ์ด๋ฌ์ผ๋ ์ด๋ค๋ถ๋ถ์ด ๋ฐ๋๊ฑด์ง ํ์ธํด์ผํจ)
3. (2) ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ํ ๋ถ๋ถ ๊ฒ์
4, ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง
์ด๋ฐ ๊ณผ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์
๋๋ค!
userMemo ์ฌ์ฉํด๋ณด๊ธฐ
useMemo๋ฅผ ์ฌ์ฉํด์ ์ปดํฌ๋ํธ ๋ด๋ถ ์ฐ์ฐ์ ์ต์ ํํด๋ด
์๋ค.
const memoizedValue = useMemo(() => ์ต์ ํํ ํจ์(a, b), [a, b]);
ย
์ต์ ํ ํ ํจ์์ ํจ์๊ฐ ์์กดํ๊ฒ ๋ ๊ฐ์ useMemo์๊ฒ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค. useMemo๋ ๋ ๋๋ง ์ค์ ์คํ๋์ด์ ์์กดํ๋ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋์๋์ง๋ฅผ ์ฒดํฌํ๊ณ , ์์กด์ฑ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋์๋ง ๊ฐ์ ๋ค์ ๊ณ์ฐํฉ๋๋ค.
ย
๋ฉ๋ชจ์ด์ ์ด์
- ์ด์ ์ ๊ฐ์ ๊ธฐ์ตํฉ๋๋ค.
ย
์ฐ๋ฆฌ๋ input์ ๊ฐ์ ์
๋ ฅํ ๋ userInfo๋ ์์ง ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ userInfo์ ๊ฐ์ ๊ธฐ์ตํด์ค๊ฒ์. useMemo๋ฅผ ์ฌ์ฉํ์ค ๋๋ ์์ useMemo๋ฅผ ์ฐ์๊ณ ๊ทธ ์์ ํ์ดํ ํจ์๋ก ์ต์ ํํ ํจ์๋ฅผ ๋ฃ์ด์ค๋๋ค. ๋๋ฒ์งธ ์ธ์๋ก๋ฅผ ์ต์ ํํ ํจ์๊ฐ ์์กดํ๋ ๊ฐ์ ๋ฐฐ์ดํํ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด useInfo ๊ฐ์ ์์กดํ๋ getNum()ํจ์๊ฐ useInfo์ ๊ฐ์ด ๋ฐ๋ ๋๋ง ์คํ๋ฉ๋๋ค.
const n = useMemo(() => getNum(userInfo), [userInfo]);
ย
๋ค์ ๊ฐ์ ์
๋ ฅํด๋ณด์ธ์!


import { useState, useRef, useMemo } from "react"; const App = () => { const inputName = useRef(null); const inputId = useRef(null); const [userInfo, setUserInfo] = useState([]); const [name, setName] = useState(""); const [id, setId] = useState(""); const getNum = (li) => { console.log("๋ ๋๋ง"); return li.length; }; const n = useMemo(() => getNum(userInfo), [userInfo]); const handleSubmit = (e) => { e.preventDefault(); const newInfo = [...userInfo, { name: name, id: id }]; inputName.current.value = ""; inputId.current.value = ""; inputName.current.focus(); setUserInfo(newInfo); // onSubmit ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ console.log("๋ ๋๋ง-3"); }; const handleInputName = (e) => { setName(e.target.value); // onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ console.log("๋ ๋๋ง-1"); }; const handleInputId = (e) => { setId(e.target.value); // onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ console.log("๋ ๋๋ง-2"); }; return ( <> <form> <input type="text" placeholder="์ด๋ฆ์ ์ ๋ ฅํ์ธ์" onChange={handleInputName} ref={inputName} /> <input type="text" placeholder="์์ด๋๋ฅผ ์ ๋ ฅํ์ธ์" onChange={handleInputId} ref={inputId} /> <button type="submit" onClick={handleSubmit}> ๋ฒํผ </button> </form> <ul> {userInfo.map((value, index) => ( <li key={index}> <h3>{value.name}</h3> <strong>@{value.id}</strong> </li> ))} </ul> <span>{n}</span> </> ); }; export default App;
Mini Question!
button์ ํด๋ฆญ ์ด๋ฒคํธ์์ ์๋ก์ด array๋ฅผ ๋ง๋ค์ด์ ์๋ก setUserInfo๋ฅผ ํด์ฃผ๋ ์ด์ ๊ฐ ๋ญ๊น์?
์๋์ ๊ฐ์ด pushํ๋ฉด ํ์ด์ง๊ฐ ์ ๋ ๋๋ง๋์ง ์์๊น์?
<button type="submit" onClick={(e) => { e.preventDefault(); userInfo.push({name:inputName.current.value, id: inputId.current.value}); setUserInfo(userInfo); inputName.current.value = ""; inputId.current.value = ""; inputName.current.focus(); console.log("๋ ๋๋ง์ค-3-"); }} > ๋ฒํผ </button>
์ ๋ต
userInfo์์ ์ฐธ์กฐํ๋๊ฒ์ ๋ฐฐ์ด์ ์ฃผ์์
๋๋ค.
๋ฐฐ์ด ์์ ๊ฐ์ ์๋ฌด๋ฆฌ ๋ฐ๊ฟ๋ ์ฐธ์กฐํ๊ณ ์๋๊ฒ์ ๋ฐฐ์ด์์ ๊ฐ์ด ์๋๋ผ ๊ฐ์ฒด์ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์
๋๋ค! push๋ฅผ ํ๊ฒ ๋๋ฉด ๊ธฐ์กด ๋ฐฐ์ด์ ๊ฐ์ ์ถ๊ฐํ์ง๋ง ์ฃผ์๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฆฌ์กํธ๊ฐ ๋ดค์ ๋ ์๋ก์ด ๊ฐ์ผ๋ก ๋ณํ๋ค๊ณ ์๊ฐํ์ง ์๊ธฐ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์ต๋๋ค!
ย
handleSubmit ํจ์์์๋ ํ์ธํ์
จ๋ฏ์ด userInfo ๋ฐฐ์ด์ ์ํ๊ฐ์ ๋ฐ๊ฟ์ค ๋๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ setUserInfo์ ์ ๋ฌํด์ฃผ์ด์ผ ํฉ๋๋ค.
const handleSubmit = (e) => { e.preventDefault(); const newInfo = [...userInfo, { name: name, id: id }]; inputName.current.value = ""; inputId.current.value = ""; inputName.current.focus(); setUserInfo(newInfo); // onSubmit ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋จ };
useMemo์ useEffect์ ์ฐจ์ด
useMemo์ useEffect๊ฐ ๋๋ค ์ค์ ๋ ๊ฐ์ ๋ณ๋์ ๋ฐ๋ผ ๋์ํ๋๊ฒ์ด๋ผ ์ด๋ค์ ์ด ๋ค๋ฅธ์ง ์ดํดํ๊ธฐ ํ๋ค๊ฒ ๊ฐ์ ์ ๋ฆฌํด๋์์ต๋๋ค.
useMemo
useMemo(์คํ๋ ๊ฒ, [๊ฐ])๋ผ๊ณ ํ ๋
useMemo๋ ๋ ๋๋ง ์ ์ ์คํ๋์ด ๋ฉ๋ชจ์ด์ ์ด์
ํ ๊ฒ์ ๋ฐํํด์ค๋๋ค. ๊ฐ์ด ๋ฐ๋์๋์ง ํ์ธํ๊ณ ๋ ๋๋ง์ ์ ์ ์ฅ๋ ๊ฒ์ ๋ณด๋ด์ฃผ๋๊ฒ์ด์ฃ .
useEffect
๋ฐ๋ฉด useEffect๋ ๋ ๋๋ง ํ์ ์ผ์ด๋ฉ๋๋ค.
๋ ๋๋งํ์ ์ํ๊ฐ ์
๋ฐ์ดํธ ๋์์๋ ๋ฅผ ๊ฐ์งํ์ฌ ๋์ํฉ๋๋ค.
์ฐจ์ด์
useMemo๋ ๋ ๋๋ง์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค, ์๋ฅผ๋ค๋ฉด ํจ์์์ ์ปดํฌ๋ํธ๋ฑ ๋ฐํํ๊ฒ ํ์๋ ๋ ๋๋งํ๊ธฐ ์ด์ ์ ์ ์ฅ๋๊ฐ์ ๋ฐํํ์ฌ ๋ฆฌ๋ ๋๋ง์ ํ์ง ์๋๋ก๋ ํ ์ ์๊ธฐ๋๋ฌธ์ด์ฃ ,
๋ฐ๋ฉด useEffect๋ ๋ ๋๋งํ ์ดํ์ ๋์๋๊ธฐ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ง ๋ชปํฉ๋๋ค.
์ฆ useMemo๋ ๋ฆฌ๋ ๋๋ง์ด๋ ๋ถํ์ํ ์ฌ์คํ ๊ณผ์ ์ ๋ง๋ ๋ฐฉ๋ฒ(์ต์ ํ)์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ๊ณ ,
useEffect๋ ์ํ๋ฅผ ์ด์ฉํ ๊ด๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
์์ฝ
- ๋ ๋๋ง์ : useMemo, ๋ ๋๋งํ : useEffect
- ์ํ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ effcet๋ฅผ ๋์ํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด useEffect
- ๊ฐ์ ์ ์ฅํ์ฌ ๋ถํ์ํ ๋์ ๋๋ ๋ ๋๋ง์ ๋ง์ ์ต์ ํ ํ๊ณ ์ถ๋ค๋ฉด useMemo
ย