ํ๋ก ํธ์๋ ๊ฐ๋ฐํ๋ฉด์ ๋๋ฐ์ด์ค ํจ์๋ฅผ ์ ํด๋ณด์ ์ ์๋์?
์คํฌ๋กค, ๊ฒ์์ฐฝ ์ ๋ ฅ, ์๋์ฐ ๋ฆฌ์ฌ์ด์ฆ์ฒ๋ผ ์งง์ ์๊ฐ์ ๋ฐ๋ณตํด์ ํธ์ถ๋๋ ์ด๋ฒคํธ๋ฅผ ์ผ์ ์๊ฐ ๋์ ๋ชจ์์ ํ ๋ฒ๋ง ์คํํ๋๋ก ํ๋ ๊ธฐ์ ์ ๋๋ค.
debounce()๋?
์ผ์ ์๊ฐ ๋์ ์ด๋ฒคํธ๊ฐ ๋ฐ๋ณต ๋ฐ์ํด๋, ๋ง์ง๋ง ํธ์ถ๋ง ์คํ๋๊ฒ ํ๋ ํจ์ ์ ์ด ๊ธฐ๋ฒ
์๋ฅผ ๋ค์ด, ๊ฒ์์ฐฝ์ ๊ธ์๋ฅผ ์
๋ ฅํ ๋๋ง๋ค API๋ฅผ ํธ์ถํ๋ฉด ์๋ฒ๊ฐ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆด ์ ์์ด์.
์ด๋ debounce()๋ฅผ ์ฌ์ฉํ๋ฉด ์
๋ ฅ์ด ๋ฉ์ถ ํ ํน์ ์๊ฐ(์: 300ms)์ด ์ง๋๋ฉด ๋ฑ ํ ๋ฒ API๋ฅผ ํธ์ถํ๊ฒ ๋ง๋ค ์ ์์ด์.
debounce()๊ฐ ํ์ํ ์ํฉ
๋ค์๊ณผ ๊ฐ์ด “๋๋ฌด ์์ฃผ ์คํ๋๋ ์ด๋ฒคํธ”์์ ํ์ํฉ๋๋ค. :
- ์ค์๊ฐ ๊ฒ์ API ํธ์ถ
- ์๋์ฐ ๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ
- ์คํฌ๋กค ์ด๋ฒคํธ(๋ฌดํ ์คํฌ๋กค, ์คํฌ๋กค ์์น ์ ์ฅ ๋ฑ)
- ์ ๋ ฅ ํผ ์๋ ์ ์ฅ
- ๋ฒํผ ์ค๋ณต ํด๋ฆญ ๋ฐฉ์ง
debounce() ๊ธฐ๋ณธ ๋์ ๋ฐฉ์ ์์ฝ
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํ์ด๋จธ๋ฅผ ์ด๊ธฐํ
- ์ผ์ ์๊ฐ ๋์ ์ถ๊ฐ ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๋ฉด ๊ธฐ์กด ํ์ด๋จธ ์ทจ์
- ๋ง์ง๋ง ์ด๋ฒคํธ๊ฐ ๋ค์ด์จ ํ ์ง์ ์๊ฐ ์ง๋ ๋ค ์คํ
์ฆ, "๋ณด๋ค๊ฐ ๋ฉ์ถ๋ฉด ์คํ" ๊ตฌ์กฐ!
๊ฐ์ฅ ๋ง์ด ์ฐ๋ debounce ์ฝ๋
function debounce(func, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
์ฌ์ฉ ์์ 1 — ๊ฒ์์ฐฝ API ํธ์ถ ์ ์ด
const search = debounce(function (keyword) {
console.log("API ํธ์ถ:", keyword);
}, 300);
document.querySelector("#search").addEventListener("input", (e) => {
search(e.target.value);
});
ํจ๊ณผ:
์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ฒ ํ์ดํํด๋ API๋ ์
๋ ฅ์ด ๋ฉ์ถ ํ ๋จ ํ ๋ฒ ์คํ๋จ.
์ฌ์ฉ ์์ 2 — ์คํฌ๋กค ์ด๋ฒคํธ ์ต์ ํ
function handleScroll() {
console.log("์คํฌ๋กค ์์น:", window.scrollY);
}
window.addEventListener("scroll", debounce(handleScroll, 200));
์คํฌ๋กค์ ์์ฒญ๋๊ฒ ๋ง์ด ์คํ๋๊ธฐ ๋๋ฌธ์ ๋๋ฐ์ด์ค๋ก CPU ๋ถ๋ด์ ์ค์ผ ์ ์์ต๋๋ค.
throttle๊ณผ debounce ์ฐจ์ด
| ๊ฐ๋ | ๋์ | ์๋ฆฌ |
| debounce | ์ ๋ ฅ์ด ๋ฉ์ถ ๋ค ํ ๋ฒ ์คํ | ๊ฒ์์ฐฝ ์ ๋ ฅ |
| throttle | ์ผ์ ๊ฐ๊ฒฉ๋ง๋ค ์คํ | ์คํฌ๋กค ์์น ๊ณ์ฐ |
๋ ๋ค ์ด๋ฒคํธ ์ ์ด์ง๋ง ๋ชฉ์ ๊ณผ ํ์ด๋ฐ์ด ๋ค๋ฆ ๋๋ค.
์ ๋ฆฌ
- debounce()๋ ์ฐ์๋ ํธ์ถ์ ๋ฌถ์ด์ ๋ง์ง๋ง ํธ์ถ๋ง ์คํํ๋ค.
- ํ์ดํ, ์คํฌ๋กค, ๋ฆฌ์ฌ์ด์ฆ ๋ฑ ์ด๋ฒคํธ ์ต์ ํ์ ํ์.
- setTimeout์ ์ด์ฉํด ๊ฐ๋จํ ๊ตฌํ ๊ฐ๋ฅ.
- throttle๊ณผ์ ์ฐจ์ด๊น์ง ์์๋๋ฉด ๋ ํ์ค!