개발/React

μ»΄ν¬λ„ŒνŠΈ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•œ useMemo μ‚¬μš©λ²•

밍(Ming) 🐈‍⬛ 2024. 8. 13. 16:43
728x90
λ°˜μ‘ν˜•

ν˜„μž¬ μž‘μ—… 쀑인 ν”„λ‘œμ νŠΈμ—μ„œ 받은 μ½”λ“œ ν”Όλ“œλ°±μ„ μ •λ¦¬ν•˜λ‹€κ°€ useMemoλ₯Ό 처음으둜 μ‚¬μš©ν•΄λ΄€λ‹€. 

λ¦¬μ•‘νŠΈλ₯Ό 주둜 μ‚¬μš©ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œλ‘œ μΌν•˜λ©΄μ„œ λ©΄μ ‘λ•Œλ‚˜ λ§ˆμ£Όν•˜λ˜ useMemoλΌλŠ” λ¦¬μ•‘νŠΈ ν›….

 

useMemo ? 

λ¦¬μ•‘νŠΈμ—μ„œ μ»΄ν¬λ„ŒνŠΈμ˜ μ„±λŠ₯을 μ΅œμ ν™” ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” λ¦¬μ•‘νŠΈ 훅이닀. 

μ–΄λ–»κ²Œ μ»΄ν¬λ„ŒνŠΈμ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•΄μ£ΌλŠ”λƒν•˜λ©΄μ€ 보톡 μ˜ˆμ‹œλ‘œ μ—°μ‚°μž‘μ—…μ„ 많이 λ“ λ‹€. κ³„μ†ν•΄μ„œ λ™μΌν•œ 연산이 μΌμ–΄λ‚˜λŠ” μž‘μ—…μ—λŠ” μƒˆλ‘œ μ²˜μŒλΆ€ν„° μ—°μ‚°ν•  ν•„μš”μ—†μ΄ λ””νŽœλ˜μ‹œκ°€ 있으면 λ¨Όμ € ν˜„μž¬ μ˜μ‘΄κ°’κ³Ό μ΄μ „μ˜ 외쑴값을 λΉ„κ΅ν•˜μ—¬ λ³€κ²½λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. μƒˆλ‘œμš΄ λ™μž‘μ΄ 일어났을 λ•Œ 기쑴의 값을 κΈ°μ–΅ν•˜κ³  μžˆλ‹€κ°€ κ±°κΈ°μ„œ λΆ€ν„° 연산을 μ‹œμž‘ν•œλ‹€. λ©”λͺ¨λœ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨μ΄μ œμ΄μ…˜ μΊμ‹œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
μΊμ‹œλŠ” λ©”λͺ¨λœ 값을 λ‚˜νƒ€λ‚΄λŠ” 킀와 쒅속성을 λ‚˜νƒ€λ‚΄λŠ” 값이 μžˆλŠ” JavaScript 개체둜 κ΅¬ν˜„λœλ‹€.
ꡬ성 μš”μ†Œκ°€ λ Œλ”λ§ 될 λ•Œ μΊμ‹œλ₯Ό ν™•μΈν•˜μ—¬ λ©”λͺ¨λœ 값이 μ£Όμ–΄μ§„ 쒅속성에 λŒ€ν•΄ 이미 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ©”λͺ¨λœ 값이 있으면 ReactλŠ” ν•¨μˆ˜λ₯Ό λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•Šκ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

쑰금 더 μ‰½κ²Œ 이해λ₯Ό ν•˜μžλ©΄ λ¦¬μ•‘νŠΈ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ•Œλ©΄ 쒋을 것 κ°™λ‹€. λ¦¬μ•‘νŠΈμ˜ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” λ Œλ”λ§μ΄ 되고 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  λͺ¨λ“  λ‚΄λΆ€μ˜ λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” μˆœμ„œλ‘œ μž‘μ—…μ΄ μΌμ–΄λ‚œλ‹€. λ‚˜λŠ” datepickerλ₯Ό μœ„ν•΄μ„œ λ‚ μ§œλ₯Ό μ§€μ •ν•΄μ€˜μ•Όν–ˆλŠ”λ°. 이뢀뢄이 κ³„μ†ν•΄μ„œ μ΄ˆκΈ°ν™”λœλ‹€λŠ” 것이닀. 사싀 이 μ •λ„λŠ” 크게 λΆ€λ‹΄μŠ€λŸ½μ§€λŠ” μ•Šμ§€λ§Œ λ³΅μž‘ν•œ 연산이 λ“€μ–΄κ°€μ•Όν•˜λŠ” 거라면 ꡉμž₯히 뢀담이 될 것이닀. 

κ·Έλž˜μ„œ useMemoλ₯Ό μ“°λ©΄ ꡳ이 이 뢀뢄을 λ‹€μ‹œ ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ μ΄μ „μ˜ 값을 κΈ°μ–΅ν•΄λ’€λ‹€ λ‹€μ‹œ μ“΄λ‹€λŠ” 이야기닀. 

 

즉, useMemoλ₯Ό μ‚¬μš©ν•˜λ©΄ 데이터가 λ³€κ²½λ˜μ§€ μ•Šμ•˜μ„ λ•Œ μ—…λ°μ΄νŠΈλ₯Ό ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, λ¦¬λ Œλ”λ§μ„ λ§‰μ•„μ„œ μ“Έλ°μ—†λŠ” μ„±λŠ₯ μ €ν•˜λ₯Ό 막을 수 μžˆλ‹€.

 

 

 

 

 

 

 

 

 

 

 

λ°˜μ‘ν˜•

 

useMemo ν˜•νƒœ

const cachedValue = useMemo(calculateValue, dependencies)

 

μ•žλΆ€λΆ„μ— ν•¨μˆ˜κ°€ λ“€μ–΄κ°€κ³  , 뒀에 ν•¨μˆ˜μ—μ„œ μ°Έμ‘°ν•˜λŠ” 값이 μ˜μ‘΄κ°’μœΌλ‘œ λ“€μ–΄κ°„λ‹€. 

useMemoλŠ” ν•¨μˆ˜μ˜ 결과값을 λ©”λͺ¨ν•˜κΈ° λ•Œλ¬Έμ— 값을 returnν•΄μ•Όν•œλ‹€λŠ” 점을 μžŠμ§€λ§μž 

 


μ•„λž˜λŠ” 싀직적인 적용 μ˜ˆμ΄λ‹€. 
연산이 크게 λ“€μ–΄κ°€λŠ” 뢀뢄은 μ•„λ‹ˆμ§€λ§Œ useMemoλ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ 쒋을 것 κ°™λ‹€λŠ” ν”Όλ“œλ°±μ„ λ°›μ•„μ„œ μ•„λž˜μ²˜λŸΌ μˆ˜μ •ν–ˆλ‹€. 

// date picker에 μ“Έ date μ •μ˜ν•˜λŠ” λΆ€λΆ„ 

// datepicker date μ •μ˜ν•œ 뢀뢄이닀. λ³€μˆ˜λ‘œ λ°”λ‘œ μ •μ˜ν•¨.
const endDate = new Date(dateRange?.to || new Date());
endDate.setUTCHours(0, 0, 0, 0);


// useMemo μ μš©ν•˜κΈ° 
const endDate = useMemo(() => {
    const date = new Date(dateRange?.to || new Date());
    date.setUTCHours(0, 0, 0, 0);
    return date;
  }, [dateRange?.to]);
728x90