Debounce, Throttle์ ์์์ผ ํ๋ ์ด์
์ฌ์ฉ์๊ฐ ์ฐฝ ํฌ๊ธฐ ์กฐ์ ์ ๋ฉ์ถ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ resizing event๋ฅผ ๋ฐ์ํ๊ณ ์ถ๋ค๋ฉด
์ฌ์ฉ์๊ฐ ํค๋ณด๋ ์
๋ ฅ์ ์ค์งํ ๋๊น์ง AJAX ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์ถ๋ค๋ฉด
๋ฑ๋กํด๋์ ์คํฌ๋กค ์ด๋ฒคํธ๋ฆฌ์ค๋๋ก ์ธํด ์ฑ๋ฅ ์ ํ๋ฅผ ๊ฒฝํํ๊ณ ์ถ์ง ์๋ค๋ฉด
์ด ๋ฌธ์๋ฅผ ๋ณด๊ณ ๋๋ฉด
Debounce๊ฐ๋
์ ์์ฉํด ๋ถํ์ํ ์ฆ์ ์์ฒญ์ ์ ์ดํ ์ ์๋ค.
Throttle ๊ฐ๋
์ ์์ฉํ์ฌ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์ํ๋ ๋์์ ์ ์ดํ ์ ์๋ค.
Debounce
๋ณดํต ๊ธฐ๊ณ์ ์ค์์น์ผ์๋, ํฐ์น์ผ์๊ฐ์๊ฑธ ๋ค๋ฃฐ ๋ ์๊ฐ์ ์ผ๋ก ์ค์์น์ ์ ์ ์์ on/off๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต๋๋ ํ์์ด ์๋๋ฐ ์ด๋ฅผ ๋ฐ์ด์ฑํ์์ด๋ผ๊ณ ํฉ๋๋ค. ์ค์์น์ ์ ์ ์์ ์ง๋ ํ๋ค๋ฆผ์ด๋ ์งง์ ์๊ฐ์ ๋ถ์๋ค ๋จ์ด์ก๋ค๊ฐ ๋ฐ์ํ๋๋ฐ ํ์ค์์ ์์ฃผ ๋ฐ์ํ๋ ์ผ์ด์ฃ . ์ด๋ฌํ ๋ฐ์ด์ค ํ์์ ์์ ๋ ๊ฒ์ ๋๋ฐ์ด์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
Debounce๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ํน์ ์๊ฐ์ด ์ง๋ ํ ํ๋์ ์ด๋ฒคํธ๋ง ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์ ์
๋๋ค. ์ฆ, ์์ฐจ์ ํธ์ถ์ ํ๋๋ก '๊ทธ๋ฃนํ' ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ์์ ์ผ๋ก ํธ์ถ๋๋ ํจ์ ์ค ๋ง์ง๋ง ํจ์(๋๋ ์ ์ผ ์ฒ์)๋ง ํธ์ถํ ์ ์์ต๋๋ค.
์ด Debounce๋ ์น์์ ์ฃผ๋ก AJAX ๊ฒ์์ ์์ฃผ ์ฐ์
๋๋ค.
์๋ฅผ ๋ค์ด ๊ฒ์์ฐฝ์ ๋ฉ์ด์ปค์ค์ ๊ฒ์ํ๋ค๊ณ ํด๋ด
์๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ํ ๊ธ์์ฉ ์น ๋๋ง๋ค API ์์ฒญ์ ํ๋ฉด์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๋์ ๋๊ตฌ๋ ์คํ๊ฐ ๋ ์ ์๊ณ , ๋งค๋ฒ ์์ฒญํ๋ ๊ฒ์ด ํจ์จ์ ์ด์ง ์์ ์๊ฐ๋ ๋ง์ต๋๋ค. ๋ฌด์๋ณด๋ค๋ ์ด์ ๊ฐ์ ๋ถ๋ถ์ ๊ตฌ๊ธ๋งต์ฒ๋ผ ์ ๋ฃ API๋ฅผ ์ฌ์ฉํ ๋ ํฐ ๋น์ฉ์ด ๋๋๋ฐ์. ๋๊ฐ์ ์์ฒญ์ 1๋ฒ๋ง ํด๋ ๋๋๊ฑธ 10๋ฒ ํ๋ค๊ณ ํ๋ค๋ฉด ๊ทธ๋งํผ 10๋ฐฐ ์ด์์ ๋น์ฉ ์์ค์ด ๋ฐ์ํ๋ ๊ฒ์ด์ฃ . ์ฐ๋ฆฌ๊ฐ ์ด๋ฒ ๋ฏธ์
์์ ํด๊ฒฐํด์ผ ํ๋ Youtube API์ ๊ฒฝ์ฐ์๋ ์์ฒญ ํ์๊ฐ ๋ฌดํ์ด์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ํํ ๋ถ๋ถ๋ค์ ๊ณ ๋ฏผํด์ผ ํฉ๋๋ค.
๋ณดํต ์ฌ๋๋ค์ ์ฐ๋ฌ์ ํ์๋ฅผ ์น๊ธฐ ๋๋ฌธ์, ์
๋ ฅ์ด ๋ค ๋๋ ํ์ ์์ฒญ์ ๋ณด๋ด๋ ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ฆ ํ์๋ฅผ ์น ๋๋ง๋ค ํ์ด๋จธ๋ฅผ ์ค์ ํ ํ, ํน์ ์๊ฐ ๋์ ์
๋ ฅ์ด ์์ผ๋ฉด ์
๋ ฅ์ด ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. (๋ฌผ๋ก ์ด์๊ฐ์ด ๋๋ฌด ๊ธธ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ์์ข๊ฒ ์ฃ ?) ์๋ฅผ ๋ค์ด 3000ms๋ก ์๊ฐ์ ์ค์ ํด๋ณผ๊ฒ์.
let debounce;
const $searchInput = document.querySelector("#input");
$searchInput.addEventListener("input", onSearchInputHandler);
const onSearchInputHandler = (e) => {
if (debounce) {
clearTimeout(debounce);
}
debounce = setTimeout(() => {
console.log("ajax ์์ฒญ ๋ถ๋ถ", e.target.value);
}, 3000);
};
Plain Text
๋ณต์ฌ
Debounce ์ด๊ฐ๋จ ๋ฏธ์
์๋์ฒ๋ผ debounce๋๋ ํํ๋ก ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ธ์. debounce๋๋ Input form์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ 2์ด ๋์ ์
๋ ฅ์ด ์๋ค๋ฉด ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ์์ฑํด์ฃผ์ธ์.
Throttle
Throttle์ ์ฌ์ ์ ์๋ฏธ๋ ๋ชฉ์ ์กฐ๋ฅด๋ ํ์์ธ๋ฐ์. ์ด ์ ์์ ์ ๋ํ์ฌ ๋ฌด์ธ๊ฐ์ ์ถ๋ ฅ์ ์กฐ์ ํ๋ ๋ป๋ ๊ฐ์ง๊ณ ์์ด, ๊ธฐ๊ณ์ฅ์น์ ์ฐ๊ฒฐ๋ ์ก์ฒด๋ ๊ธฐ์ฒด๊ฐ ํ๋ฅด๋ ๊ด์ ๋ฌ๋ฆฐ ๋ฐธ๋ธ๋ฅผ ์กฐ์ ํ๋ ๊ณผ์ ์์๋ ์ด ๋จ์ด๊ฐ ์ฐ์
๋๋ค. ์ต์์น ์์ ์ดํ์ด์ง๋ง, ์ถ๋ ฅ์ ์กฐ์ ํ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ณด๋ค ์ฌ์ธ ๊ฒ ๊ฐ์์. ์ถ๋ ฅ์ ์กฐ์ ํ๋ Throttle์ ์ด๋ฒคํธ๋ฅผ ์ผ์ ํ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด Throttle์ ์ค์ ์๊ฐ์ผ๋ก 1ms๋ฅผ ์ฃผ๊ฒ ๋๋ค๋ฉด, ํด๋น ์ด๋ฒคํธ๋ 1ms ๋์ ์ต๋ ํ ๋ฒ๋ง ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ฆ ๋ง์ง๋ง ํจ์๊ฐ ํธ์ถ๋ ํ ์ผ์ ์๊ฐ์ด ์ง๋๊ธฐ ์ ์ ๋ค์ ํธ์ถ๋์ง ์๋๋ก ํฉ๋๋ค.
์ด Throttle์ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ธํด ์คํฌ๋กค ์ด๋ฒคํธ์์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ์คํฌ๋กค์ ์ฌ๋ฆฌ๊ฑฐ๋ ๋ด๋ฆด ๋ ์ด๋ฒคํธ๊ฐ ๋งค์ฐ ๋ง์ด ๋ฐ์ํ๋๋ฐ์. ๋ง์ฝ ์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๋ง์ ๊ธฐ๋ฅ์ ํ๋ ํจ์๊ฐ ์ฝ๋ฐฑ์ผ๋ก ํ ๋น๋์ด์๋ค๋ฉด ๊ต์ฅํ ์์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ ์ ์์ต๋๋ค. ๊ทธ๋ด ๋ Throttle์ ์ฌ์ฉํด์ฃผ๋ฉด ๋ฉ๋๋ค.
let throttle;
const $searchInput = document.querySelector("#input");
$searchInput.addEventListener("input", onSearchInputHandler);
const onSearchInputHandler = (e) => {
if (!throttle) {
throttle = setTimeout(() => {
throttle = null;
console.log("ajax ์์ฒญ ๋ถ๋ถ", e.target.value);
}, 300);
}
};
JavaScript
๋ณต์ฌ
Throttle ์ด๊ฐ๋จ ๋ฏธ์
Throttle๋ฅผ ๊ตฌํํ๋ ์ฐ์ต์ ํด๋ณด๊ณ ์ถ๋ค๋ฉด ์ Codepen Sample์ ํตํด์ ์๋ ์๊ตฌ์ฌํญ์ ๊ตฌํํด๋ณด์ธ์!
์คํฌ๋กค ์ด๋ฒคํธ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค count๋ฅผ 1 ์ฆ๊ฐ์ํค๊ธฐ
Throttle๋ฅผ ์ ์ฉํ์ฌ 300ms์ ํ
์ ๋๊ณ ์คํ์ํจ ํ count ๋น๊ตํด๋ณด๊ธฐ
์ ๋ฆฌ
โข
Debounce๋ ์ฌ๋ฌ๋ฒ ๋ฐ์ํ๋ ์ด๋ฒคํธ์์, ๊ฐ์ฅ ๋ง์ง๋ง ๋๋ ์ ์ผ ์ฒ์ ์ด๋ฒคํธ๋ง์ ์คํ๋๋๋ก ๋ง๋๋ ๊ฐ๋
์ด๋ค.
โข
Throttle์ ์ฌ๋ฌ๋ฒ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ผ์ ์๊ฐ ๋์, ํ ๋ฒ๋ง ์คํ๋๋๋ก ๋ง๋๋ ๊ฐ๋
์ด๋ค.