JavaScript

[JavaScript] ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ๋Šช์— ๋น ์ง„ ๋‚ 

Dana10 2025. 1. 16. 11:41

๊ณ ์ฐจ ํ•จ์ˆ˜.

๋ญ์ง€ ์ด ๊ต‰์žฅํžˆ ์–ด๋ ค์šธ ๊ฒƒ๋งŒ ๊ฐ™์€ ์ด๋ฆ„์€..?

 

์ซ„์ง€ ๋ง์ž!

์‚ฌ์‹ค ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฅ ๋จน๋“ฏ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๋‹จ์ง€ ์ € ์šฉ์–ด๊ฐ€ ์ƒ์†Œํ•  ๋ฟ..(๋‚˜๋งŒ ๊ทธ๋Ÿด์ˆ˜๋„)

 

๊ทธ๋Ÿผ ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ํŒŒํ—ค์ณ๋ณด์ž.

 

๊ณ ์ฐจ ํ•จ์ˆ˜๋ž€?

  • ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜
  • ํ•จ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

 

ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค ..? 

๋„ˆ๋ฌด ์ต์ˆ™ํ•˜์ง€ ์•Š๋‚˜์š”?

 

const getUsersName = data.map(({name}) => name)

 

map ๋ฉ”์„œ๋“œ๋Š” ์ธ์ž๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

์–ด? ํ•จ์ˆ˜์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„ฃ์—ˆ๋„ค? ์•„! map๋„ ๊ณ ์ฐจ ํ•จ์ˆ˜๊ตฌ๋‚˜~

 

๋ญ์•ผ ๋ณ„๊ฑฐ ์•„๋‹ˆ๋„ค.

 

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์˜ค๋Š˜ ์ด ๊ธ€์„ ์“ด ์ด์œ ..

๋ฐ”๋กœ ํ•จ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ช‡ ์‹œ๊ฐ„์„ ํ—ค๋งธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.ใ…Ž

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./test.js" defer></script>
</head>
<body>
  <input type="text" />
  <div>
    <span>default : </span>
    <span id="default"></span>
  </div>
  <div>
    <span>throttle : </span>
    <span id="throttle"></span>
  </div>
</body>
</html>
document.querySelector('input').addEventListener('input',(e) => {
  const { value } = e.target;
  document.getElementById('default').innerText = value;
  throttle(value);
})

let isThrottling;
const throttleFunc = (cb, delay) => {
  if (isThrottling) return; 
  isThrottling = true; 
  return (...args) => {
    setTimeout(() => {
      cb(...args);
      isThrottling = false; 
    }, delay);
  };
};

const throttle = throttleFunc((value) => {
  document.getElementById('throttle').innerText = value;
},1000);

 

์“ฐ๋กœํ‹€๋ง ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ณ  ์žˆ์—ˆ๋‹ค.

 

<๋‚ด๊ฐ€ ์›ํ•˜๋˜ ๋™์ž‘> 

  • ๋งค๊ฐœ๋ณ€์ˆ˜ delay๋กœ ์„ค์ •ํ•œ ์‹œ๊ฐ„(์—ฌ๊ธฐ์„œ๋Š” 1์ดˆ)์ด ์ง€๋‚˜๋ฉด innerText๋ฅผ ์ฑ„์šด๋‹ค.
  • 1์ดˆ๊ฐ€ ์ง€๋‚˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฌด์‹œํ•œ๋‹ค.
  • 1์ดˆ๊ฐ€ ์ง€๋‚˜์•ผ๋งŒ innerText๋ฅผ ์ฑ„์šด๋‹ค.

์ด๊ฑด๋ฐ, ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด ๋ฌ˜ํ•˜๊ฒŒ ๊ทธ๊ฒŒ ์•„๋‹Œ ๊ฑฐ ๊ฐ™์€๋ฐ..

๊ทธ๋ƒฅ 1์ดˆ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฑฐ ๊ฐ™๋‹ค๋Š” ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค.

 

<๋‚˜์˜ ์ƒ๊ฐํšŒ๋กœ>

  • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด throttle(value)๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒ ์ง€.
  • ๊ทธ๋Ÿฌ๋ฉด throttle์— throttleFunc๊ฐ€ ํ• ๋‹น๋ผ ์žˆ์œผ๋‹ˆ๊นŒ ์–˜๊ฐ€ ๋งค๋ฒˆ ์‹คํ–‰์ด ๋˜๊ฒ ๊ตฌ๋‚˜.
  • ์ „์—ญ์— ์„ ์–ธ๋œ isThrottling์˜ ์ตœ์ดˆ์˜ ๊ฐ’์€ undefined๋‹ˆ๊นŒ ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ๊ฐ€๋ณ๊ฒŒ ๋ฌด์‹œํ•˜๊ณ  ~
  • ๋‹ค์Œ ์ค„์—์„œ isThrottling์ด true๋กœ ํ• ๋‹น๋˜๊ฒ ๊ณ 
  • ๊ทธ๋‹ค์Œ ์ด์ œ ํƒ€์ด๋จธ๊ฐ€ ์„ค์ •๋˜๊ฒ ๋„ค
  • 1์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๊ฐ’์„ ์ „๋‹ฌํ•ด ์ฃผ๊ณ  isThrottling์ด ๋‹ค์‹œ false๊ฐ€ ๋˜๋‹ˆ๊นŒ ๊ทธ๋‹ค์Œ ๋™์ž‘๋„ ์ž˜ ์ˆ˜ํ–‰ํ•˜๊ฒ ์ง€!
  • ๋งŒ์•ฝ 1์ดˆ๊ฐ€ ์ง€๋‚˜๊ธฐ ์ „์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ throttleFunc๊ฐ€ ๋˜ ์‹คํ–‰์ด ๋˜๋ฉด
  • ์•„๊นŒ isThrottling์ด true๋กœ ํ• ๋‹น๋์œผ๋‹ˆ๊นŒ ( ์•„์ง ์ด๋ฒคํŠธ ์ข…๋ฃŒ ์ „์ด๋ผ false๊ฐ€ ์•„๋‹ˆ๊ณ  )
  • ์ฒซ ๋ฒˆ์งธ ์ค„ if๋ฌธ์—์„œ return๋˜๋‹ˆ๊นŒ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ฒคํŠธ ์‹คํ–‰์ด ์•ˆ ๋  ๊ฑฐ์•ผ.
  • ๋๋‹ค. ์™„๋ฒฝํ•œ ๊ตฌํ˜„์ด์•ผ!

๋Š” ๋ฌด์Šจ..^^

 

๋ญ”๊ฐ€ ์ด์ƒํ•ด์„œ throttleFunc๋‚ด๋ถ€์— isThrottling์„ ์ฝ˜์†”๋กœ ์ฐ์–ด๋ณด์•˜๋‹ค.

 

 

๋ญ์ง€..? ์ƒˆ๋กœ๊ณ ์นจ ํ–ˆ์„ ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ฝ˜์†”์ด ์ถœ๋ ฅ๋˜๊ณ 

๊ทธ ์ดํ›„์—๋Š” ์•„๋ฌด๋ฆฌ input์„ ์ž…๋ ฅํ•ด์„œ event๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ๋„ ์ฝ˜์†”์ด ์•ˆ ์ฐํžŒ๋‹ค.

์ฆ‰ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ €์ชฝ์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑด๋ฐ..?

 

์ด ๋ถ€๋ถ„์—์„œ ์œ„์— ์–ธ๊ธ‰ํ•œ ์ € ๊ณผ์ •์ด ๋งž๋Š” ๊ฑฐ ๊ฐ™์€๋ฐ ๋ญ๊ฐ€ ๋ฌธ์ œ์ผ๊นŒ, ์™œ ์ € ํ•จ์ˆ˜๋ฅผ ์•ˆ ํƒˆ๊นŒ๋ฅผ ์ •๋ง ์˜ค๋žœ ์‹œ๊ฐ„ ๊ณ ๋ฏผํ–ˆ๋‹ค..

throttle์„ ์ฝ˜์†”์— ์ฐ์–ด๋ดค๋Š”๋ฐ ๋‚ด์šฉ์€ ์ œ๋Œ€๋กœ ์ฝ์–ด๋ณด์ง€๋„ ์•Š๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ธธ๋ž˜

๊ทธ์น˜ ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜ค์ง€ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ–ˆ์œผ๋‹ˆ๊นŒ.

ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ๋„ ํ–ˆ๊ณ ..^^(๋ฐ”๋ณด)


๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

 

์–ด?  throttle์ด throttleFunc์˜ return ๋ถ€๋ถ„๋งŒ ๋ฐ›๋„ค? 

์•„!! throttleFunc()์˜ ํ˜•ํƒœ์˜€๊ตฌ๋‚˜!!

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ throttle์— ํ• ๋‹นํ•œ ๊ฒƒ์ด์—ˆ๋‹ค!

 

๋”ฐ๋ผ์„œ throttleFunc๊ฐ€ returnํ•œ ๋ถ€๋ถ„๋งŒ throttle์— ํ• ๋‹น๋œ ๊ฒƒ์ด๊ณ 

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค return๋ถ€๋ถ„์ด ์žฌ์‹คํ–‰ ๋๋˜ ๊ฒƒ์ด๋‹ค.

 

์ฝ˜์†”์ด ์ตœ์ดˆ ์ดํ›„์— ์•ˆ ์ฐํ˜”๋˜ ์ด์œ ๋ฅผ ์ฐพ์•˜๋‹ค.

์ตœ์ดˆ์—๋Š” throttleFunc์˜ ๋ฐ˜ํ™˜๊ฐ’์ด throttle์— ํ• ๋‹น๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

throttleFunc๊ฐ€ ์‹คํ–‰์ด ๋  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ฝ˜์†”์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ ์ดํ›„์—๋Š” throttleFunc๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ   

throttle์— ํ• ๋‹น๋œ throttleFunc์˜ return๋ถ€๋งŒ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜์†”์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

๋ฌ˜ํ•˜๊ฒŒ ๋™์ž‘์ด ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„๋„ ์›์ธ์„ ์•Œ์•„๋ƒˆ๋‹ค.

  if (isThrottling) return; 
  isThrottling = true;

 throttleFunc ๋‚ด๋ถ€์˜ ์ด ๋‘ ์ค„์ด return๋ฌธ ๋ฐ–์— ์žˆ์–ด ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํƒ€์ด๋จธ๊ฐ€ ๋งž์ถฐ์ง„ ๊ฒƒ์ด๊ณ 

๊ฒฐ๊ตญ 1์ดˆ๊ฐ€ ์ง€๋‚˜์ง€ ์•Š์•˜์–ด๋„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ๊ณ„์† setTimeout์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

 

์ œ๋Œ€๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์˜€๋‹ค.

const throttleFunc = (cb, delay) => {
let isThrottling = false;
  return (...args) => {
    if (isThrottling) return; 
    isThrottling = true; 
    setTimeout(() => {
      cb(...args);
      isThrottling = false; 
    }, delay);
  };
};

 


 

์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ (๋‚˜์—๊ฒŒ๋Š”) ์ƒ์†Œํ•ด์„œ ํ—ค๋งธ๋Š”๋ฐ,

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋˜ ์ด๋Ÿฐ ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•˜๋ฉด ๋˜๋Š”์ง€๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค!