πŸ˜† My name is Ez : 쉽닀 μ‰¬μ›Œ 개발life

[Performance] : Debouncing(λ””λ°”μš΄μ‹±),Throttling(μ“°λ‘œν‹€λ§) λ³Έλ¬Έ

⌨️ Web Front-End/ETC

[Performance] : Debouncing(λ””λ°”μš΄μ‹±),Throttling(μ“°λ‘œν‹€λ§)

μ΄μ§€ν‚˜ 2023. 7. 21. 22:57

🀦🏻‍♂️ λͺ¨λ₯΄λŠ” 게 λ„ˆλ¬΄λ‚˜λ„ λ§Žλ‹€...

μ˜€λŠ˜μ€ μ•„μΉ¨ Front개발자 회의λ₯Ό ν•˜λ‹€.  λ°±μ•€λ“œ μ‹œλ‹ˆμ–΄λΆ„κ»˜μ„œ input에 νƒ€μ΄ν•‘λ§Œ 해도 λͺ¨λ“  ν™”λ©΄μ—μ„œ λžœλ”λ§μ΄ λœλ‹€κ³  ν•΄μ„œ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λ©΄ 쒋을지 ν”„λ‘ νŠΈ μ‹œλ‹ˆμ–΄λΆ„κ»˜ μ§ˆλ¬Έμ„ ν•˜μ…¨λ‹€.

κ·Έλ•Œ ν•˜μ‹  말씀이 lodash - Debouncing을 μ‚¬μš©ν•˜λ©΄ μ’€ 쀄어듀 거라고 ν•˜μ…¨λŠ”λ° λ‚œ 무슨 말인지 λͺ°λΌμ„œ γ…Žγ…Ž λ©”λͺ¨μž₯에 κ°œλ…λ§Œ μ¨λ‘μ—ˆλ‹€. 

 

정말 λͺ¨λ₯΄λŠ” 게 λ„ˆλ¬΄λ‚˜λ„ λ§Žλ‹€...  (κ°œλ…μ€ κ°€λ³κ²Œ 읡히고 μ‹€μ œλ‘œ μ μš©ν•˜λŠ” 방법정도 μž‘μ„±ν•΄λ³ΌκΉŒ ν•œλ‹€.) - lodash μ‚¬μš© μ˜ˆμ •


 

1. Debouncing(λ””λ°”μš΄μ‹±)

 λ””λ°”μš΄μ‹±μ΄λž€?
μœ μ €κ°€ μš”μ²­μ„ 보낼 λ•Œ μΌμ •ν•œ μ‹œκ°„κ²©μ°¨λ₯Ό 두고, μ—°μ†μ—μ„œ λ°œμƒν•œ 이벀트λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ, μ²˜μŒμ΄λ‚˜ λ§ˆμ§€λ§‰ ν•œ λ²ˆμ— ν•΄λ‹Ή μš”μ²­(이벀트)을 μ‹€ν–‰ν•˜λŠ” 방식을 λ§ν•œλ‹€.

 

μ—¬λŸ¬ λΈ”λ‘œκ·Έμ˜ 글듀을 읽어본 κ²°κ³Ό

 λŒ€λΆ€λΆ„ 검색할 λ•Œ λ°œμƒν•˜λŠ” μ΄λ²€νŠΈμ— λŒ€ν•œ μ„€λͺ…μœΌλ‘œ μ•Œλ €μ£Όμ…¨λ‹€.

 

γ„·, λ””, λ”₯,λ””λ°”,λ””λ°©,λ””λ°”μš°,λ””λ°”μš΄,λ””λ°”μš΄γ……,λ””λ°”μš΄μ‹œ,λ””λ°”μš΄μ‹± => μš”λ ‡κ²Œ μ΄λ²€νŠΈκ°€ μ—°μ†μ μœΌλ‘œ λ°œμƒν•  λ•Œ κ³„μ†ν•΄μ„œ ajaxμš”μ²­μ„ ν•˜λŠ” 것을 λ§ν•œλ‹€.

이런 μ“Έλ°μ—†λŠ” μš”μ²­μ„ 막기 μœ„ν•΄μ„œ 일정 간격을 두고 ν•œ λ²ˆμ— λ¬Άμ–΄μ„œ μš”μ²­ν•˜λŠ” 것이라고 ν•œλ‹€.

 

ꡬ글 검색창에 λ””λ°”μš΄μ‹± κ²€μƒ‰ν–ˆμ„ λ•Œ λ„€νŠΈμ›Œν¬ μš”μ²­νƒ­λ§Œ 봐도 보인닀.

ꡬ글 검색창

 

 

lodashμ—μ„œ debounce μ‚¬μš©ν•˜λŠ” 법을 κ°„λ‹¨ν•˜κ²Œ μ‚΄νŽ΄λ³΄λ©΄

 

lodash μ„€μΉ˜

npm install lodash
npm install @types/lodash

 

import _, { debounce } from "lodash"
 
const handleDebouce = _.debounce((text: string) => {console.log(text)}, 500);
 
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const text = e.currentTarget.value;
  handleDebouce(text);
};

 

lodashλ₯Ό import ν•˜κ³  handleDebouceμ—μ„œ debouceν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μ›ν•˜λŠ” μ‹œκ°„κ°„κ²©(ms λ‹¨μœ„)λ₯Ό μž…λ ₯ν•˜λ©΄ μ™„λ£Œ! 

μ½˜μ†”μ— μ°νžˆλŠ” μš”μ†Œκ°€ ν•˜λ‚˜λ‘œ λ¬Άμ—¬μ„œ ν‘œμΆœλœλ‹€.


2. Throttling(μ“°λ‘œν‹€λ§)

μ“°λ‘œν‹€λ§?
μœ μ €κ°€ μ—°μ΄μ–΄μ„œ 이벀트 μš”μ²­μ„ ν•˜λ©΄ μΌμ •ν•œ μ‹œκ°„ 간격을 두고, 연속적인 이벀트λ₯Ό λ¬΄μ‹œν•˜λŠ” 방법을 λ§ν•œλ‹€. κ²°κ΅­, μΌμ •μ‹œκ°„μ˜ κ°„κ²©λ™μ•ˆ μš”μ²­λœ μ΄λ²€νŠΈλŠ” λ¬΄μ‹œν•˜λŠ” 것이닀. (λ”œλ ˆμ΄ 된 μ‹œκ°„ λ™μ•ˆμ˜ μ΄λ²€νŠΈλŠ” λ¬΄μ‹œ)

μ“°λ‘œν‹€λ§ μŠ€ν¬λ‘€ μ΄λ²€νŠΈμ— λŒ€ν•΄μ„œ 많이 글을 μ“°μ…¨λŠ”λ°

μ‹€μ œλ‘œ scroll μ΄λ²€νŠΈμ— μ½˜μ†”λ‘œκ·Έλ₯Ό μ°μ–΄μ„œ 보면 마우슀 νœ μ„ 돌릴 λ•Œλ§ˆλ‹€ μ—„μ²­λ‚˜κ²Œ μ½˜μ†”μ΄ μ°νžˆλŠ” 것 λ³Ό 수 μžˆλ‹€.

 

μ“°λ‘œν‹€λ§μ„ μ²˜λ¦¬ν•˜λ©΄ 일정 μ‹œκ°„ λ™μ•ˆμ€ μ½˜μ†”μ΄ μ°νžˆμ§€ μ•ŠλŠ”λ‹€. (λ„ˆλ¬΄ μ‹ κΈ°..)

 

const scrollEvent = () => {
    console.log("μŠ€λ‘œν‹€λ§ ν…ŒμŠ€νŠΈ!!");
}

window.addEventListener('scroll', scrollEvent);

 

 

import _, { throttle } from "lodash"
 
const handleScrollDebouce = _.throttle((evnt:any) => { ... }, 500);

 

λ””λ°”μš΄μ‹±κ³Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ throttle만 λ³€κ²½ν•΄μ„œ μ μš©μ‹œν‚€λ©΄ λœλ‹€. 

 


3. κ²°λ‘ 

아직은 두 κ°€μ§€ κ°œλ…μ„ λ“£κ³  였늘 μ΄ν•΄ν•œ λ°”λ₯Ό μ •λ¦¬ν•œ μ •λ„λΌμ„œ 이후에 μ‹€μ œλ‘œ ν”„λ‘œμ νŠΈμ— μ μš©ν•΄μ„œ μ΅œμ ν™”λ₯Ό 해보고 μ‹Άλ‹€.

이벀트 μ΅œμ ν™” 이외에도 λ‹€λ₯Έ λ‹€μ–‘ν•œ 방면의 방법도 λ§Žμ„ ν…Œλ‹ˆ... ν‹ˆν‹ˆμ΄ κ³΅λΆ€ν•΄μ„œ μ•Œμ•„λ‘¬μ•Όκ² λ‹€.

 

( loadshλŠ” 처음 μ½”λ”© 배울 λ•Œ, μ •λ ¬ν•  λ•Œ ν•œλ²ˆ 써보고 λ”°λ‘œ 써본 적이 μ—†μ—ˆλŠ”λ° μ—­μ‹œ λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ°€μ§„ λΌμ΄λΈŒλŸ¬λ¦¬μ˜€λ‹€. 

λ‚΄κ°€ λͺ¨λ₯΄λ©΄ μ—†λŠ” κΈ°λŠ₯μ΄λΌλŠ” 생각이 μ”μ“Έν•˜λ‹€ γ…Žγ…Ž.. )