๐Ÿ“

14. Hook - useMemo

ย 
useMemo๋„ useEffect์™€ ๋น„์Šทํ•œ ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค. state๊ฐ€ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์— state ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์žฌํ‰๊ฐ€ ํ›„ ์ƒˆ๋กœ ๋žœ๋”๋ง์„ ํ•˜๊ธฐ๋•Œ๋ฌธ์ด์ฃ . ์–ด๋–ค๋ถ€๋ถ„์ด ๋‹ค๋ฅธ์ง€ ์™œ ์ด ๋‘๊ฐ€์ง€๋กœ ๋ถ„๋ฆฌํ–ˆ๋Š”์ง€๋Š” ๋’ค์—์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค. ํ˜„์žฌ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ณณ์€ ์ด 3๊ตฐ๋ฐ์ž…๋‹ˆ๋‹ค.
  1. ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ๋•Œ โ†’ setName
  1. ์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•  ๋•Œ โ†’ setId
  1. ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ โ†’ 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;
src / App.js
์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋ฌ์„ ๋•Œ ์ „์ฒด ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ ํ›„์—, ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š” input์ฐฝ์— 3๋ฒˆ ์ž…๋ ฅ์„ ํ–ˆ์„ ๋•Œ ๋ Œ๋”๋ง-1, ๋ Œ๋”๋ง์ด ์ถœ๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ย 
notion imagenotion image
notion imagenotion image
ย 
๋‹ค์‹œ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ณ  ํ™•์ธํ•ด๋ณผ๊นŒ์š”? ์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋ฌ์„ ๋•Œ ์ „์ฒด ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ ํ›„์—, ์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•˜๋Š” input์ฐฝ์— 3๋ฒˆ ์ž…๋ ฅ์„ ํ–ˆ์„ ๋•Œ ๋ Œ๋”๋ง-2, ๋ Œ๋”๋ง์ด ์ถœ๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ย 
notion imagenotion image
notion imagenotion image
ย 
์ž…๋ ฅํ•  ๋•Œ๋Š” ์ž…๋ ฅ ๋ Œ๋”๋ง์ด, ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋Š” ๋ฒ„ํŠผ ๋ Œ๋”๋ง๊ณผ 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]);
ย 
๋‹ค์‹œ ๊ฐ’์„ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”!
notion imagenotion image
notion imagenotion image
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;
src / App.js

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
ย