[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ฐ์ด์ค Debounce, ์ค๋กํ Throttle ๊ตฌํํ๊ธฐ
๋๋ฐ์ด์ค๋ input ์ด๋ฒคํธ์(๋ฆฌ์กํธ์์ onChange), ์ค๋กํ์ scroll ์ด๋ฒคํธ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
๋๋ฐ์ด์ค๋ ์๋ฌด๋ฆฌ ๋ง์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด๋ ๋ง์ง๋ง ์ด๋ฒคํธ๋ง ์คํํ๋ ๋ฐ๋ฉด, ์ค๋กํ์ ์ ์ด๋ `n` ๋ฐ๋ฆฌ์ด ๋ง๋ค ์ ๊ธฐ์ ์ผ๋ก ๊ธฐ๋ฅ ์คํ์ ๋ณด์ฅํ๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด์ . ์ฐธ๊ณ ๋ก Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ฐ์ด์ค์ ์ค๋กํ ๋ฉ์๋๊ฐ ํฌํจ๋์ด ์๋ค.
_.debounce(func, wait, [options])
_.throttle(func, wait, [options])
๋๋ฐ์ด์ค | Debounce
์ด๋ฒคํธ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํด๋ ํญ์ ๋ง์ง๋ง ์ด๋ฒคํธ๋ง ์ฒ๋ฆฌ
์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ํน์ ์๊ฐ์ด ์ง๋ ํ ํ๋์ ์ด๋ฒคํธ๋ง ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์
๋๋ฐ์ด์ค ์์ ์ฝ๋ โผ
function debounce(callback, ms) {
let timeout;
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => {
callback(...args);
}, ms);
};
}
// input์ ํ์ดํ์ ๋ฉ์ถ๊ณ ms์ด ํ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ. ํ์ดํ(์ด๋ฒคํธ ๋ฐ์) ๋์ค์ ์๋ฌด์ผ๋ ์ผ์ด๋์ง ์์
input.addEventListener(
'input',
debounce((e) => console.log(e.target.value), 1000),
);
// addEventListener ์ฝ๋๋ฅผ ์คํํ ์๊ฐ debounce ํจ์๊ฐ ์คํ๋๊ณ ๋ด๋ถ ํจ์๋ฅผ ๋ฐํํจ
// ์ฆ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ debounce ํจ์๊ฐ ๋ฐํํ ๋ด๋ถ ํจ์๊ฐ ํ ๋น๋จ
// ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ด๋ถ ํจ์ ์ธ์ (...args)์ event ๊ฐ์ฒด๊ฐ ์ ๋ฌ๋จ
- ์ด๋ฒคํธ(์ด ์์ ์์ ํ์ดํ)๊ฐ ๊ณ์ ๋ฐ์ํ๋ฉด `clearTimeout`์ ํตํด ์ด์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ก์ง์ ์ทจ์ํ๋ค.
- ์ด๋ฒคํธ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํด๋ ํญ์ ๋ง์ง๋ง ์ด๋ฒคํธ ๋ฐ์ ํ `ms`์ด(์ ์์์์ 1์ด)๊ฐ ์ง๋ฌ์ ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ(callback ์คํ)๊ฐ ์์๋๋ค.
- ์์ฃผ ์ฌ์ฉ๋๋ ๊ณณ:
- ๋ฆฌ์ฌ์ด์ฆ
- `<input>` ํ๊ทธ์ ์ ๋ ฅํ API ์์ฒญ ์ ํ
์ค๋กํ | Throttle
์ค๋กํ : ์ผ์ (์๊ฐ)๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ
์ด๋ฒคํธ๋ฅผ ์ผ์ ํ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์
์ค๋กํ ์์ ์ฝ๋ โผ
function throttle(callback, ms) {
let timeout;
return function (...args) {
if (!timeout) {
timeout = setTimeout(() => {
callback(...args);
timeout = null;
}, ms);
}
};
}
// input์ฐฝ์ ํ์ดํ(์ด๋ฒคํธ)์ ๊ณ์ ํ๋๋ผ๋ ํญ์ ms์ด ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ
input.addEventListener(
'input',
throttle((e) => console.log(e.target.value), 1000),
);
// addEventListener ์ฝ๋๋ฅผ ์คํํ ์๊ฐ throttle ํจ์๊ฐ ์คํ๋๊ณ ๋ด๋ถ ํจ์๋ฅผ ๋ฐํํจ
// ์ฆ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ throttle ํจ์๊ฐ ๋ฐํํ ๋ด๋ถ ํจ์๊ฐ ํ ๋น๋จ
// ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ด๋ถ ํจ์ ์ธ์ (...args)์ event๊ฐ์ฒด๊ฐ ์ ๋ฌ๋จ
- ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ ์ดํ ๋ค๋ฅธ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ํด๋น ์ด๋ฒคํธ๋ ํ์์์ ID๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ฒ๋ฆฌ๋๋ค.
- `ms`์ด๊ฐ ์ง๋ ํ ์ด์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ๋ฉด, ํ์์์ ID๊ฐ `null`๋ก ๋ณ๊ฒฝ๋๊ณ ์ด ์์ ๋ถํฐ ์๋ก์ด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ํ๊ฐ ๋๋ค.
- ์ด๋ฒคํธ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ๊ฐ ์ด๋ฒคํธ๋ `ms`์ด ๊ฐ๊ฒฉ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- ์์ฃผ ์ฌ์ฉ๋๋ ๊ณณ:
- ๋ฌดํ ์คํฌ๋กค
- ์ ๋๋ฉ์ด์ ํ๋ ์
์ฝ๋ํ
์ฝ๋ํ ํ๋จ ์ฝ์ ์ฐฝ์์ ์ด๋ป๊ฒ ์ถ๋ ฅ๋๋์ง ์ง์ ํ์ธํด๋ณผ ์ ์๋ค.
See the Pen debounce & throttle by ColorFilter (@colorfilter) on CodePen.
๋ ํผ๋ฐ์ค
- ๋๋ฐ์ด์ค(Debounce)์ ์ค๋กํ(Throttle ) ๊ทธ๋ฆฌ๊ณ ์ฐจ์ด์
- (JavaScript) ์ฐ๋กํ๋ง๊ณผ ๋๋ฐ์ด์ฑ
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ Proxy ๊ฐ์ฒด / Reflect (0) | 2024.04.29 |
---|---|
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํ๋กํผํฐ ์ค๋ช ์ / ํ๋๊ทธ / ์ต์๋ฒ ํจํด (0) | 2024.04.29 |
[Git] Github ๋งํฌ๋ค์ด์ ๊ฐ์ฃผ ๋ฌ๊ธฐ (0) | 2024.04.29 |
[React] ๋ฆฌ์กํธ ์์ ๋๋๊ทธ์ค๋๋กญ ๊ตฌํ (0) | 2024.04.28 |
[Algorithm] ํน์ ์ ๊น์ง์ ํฉ ๊ตฌํ๊ธฐ / ๋ฑ์ฐจ์์ด (๊ฐ์ฐ์ค ๊ณต์) (0) | 2024.04.28 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ Proxy ๊ฐ์ฒด / Reflect
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ Proxy ๊ฐ์ฒด / Reflect
2024.04.29 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํ๋กํผํฐ ์ค๋ช ์ / ํ๋๊ทธ / ์ต์๋ฒ ํจํด
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํ๋กํผํฐ ์ค๋ช ์ / ํ๋๊ทธ / ์ต์๋ฒ ํจํด
2024.04.29 -
[Git] Github ๋งํฌ๋ค์ด์ ๊ฐ์ฃผ ๋ฌ๊ธฐ
[Git] Github ๋งํฌ๋ค์ด์ ๊ฐ์ฃผ ๋ฌ๊ธฐ
2024.04.29 -
[React] ๋ฆฌ์กํธ ์์ ๋๋๊ทธ์ค๋๋กญ ๊ตฌํ
[React] ๋ฆฌ์กํธ ์์ ๋๋๊ทธ์ค๋๋กญ ๊ตฌํ
2024.04.28