์ง์ ๊ตฌํํ๋ฉฐ ๋๋ Debounce ์ Throttle ์ฐจ์ด
๐ Debounce ? Throttle ? ๊ณต๋ถํ๊ฒ ๋ ์ด์
resize ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ํ๋ฉด์ ์ฌ์ด์ฆ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ
๊ทธ์ ๋ฐ๋ผ ํ๋ฉด์ ์ ๋๋ฉ์ด์ ์ ๋ณ๊ฒฝํด์ผํ๋ ๊ธฐ๋ฅ์ด ์์๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋ง๋ก ํ๋ฉด ํฌ๊ธฐ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋งค๋ฒ ์ด๋ฒคํธ๊ฐ ํธ์ถ๋๋ ๊ฑธ ๋ณด๊ณ
๋ฆฌํ์ธํธ ๋น์ฉ ๋ญ๋น๊ฐ ์์๋์๋ค.
๋ง์ฐ์ค๋ก ์๋ฆฌ์กฐ๋ฆฌ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋ ๊ฒ ์๋๋ผ
๋ณ๊ฒฝ์ด ๋๋ ํ ํ๋ฉด ์ฌ์ด์ฆ๊ฐ ๊ณ ์ ๋์์ ๋ ํ๋ฒ๋ง ํธ์ถํ๋๋ก ์์ ํ๊ณ ์ถ์๋ค.
์ต์ ํ ๋ฐฉ๋ฒ ์ค ์ผ๋ถ์ธ, Debounce ์ Throttle ์ ๊ณต๋ถํด๋ณด์.
Debounce ์ Throttle ๋ชจ๋ ํจ์์ ์ฐ์์ ์ธ ์คํ์ ์ ํํ๋ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์ค๊ณ๋์๋ค.
๐ Debounce
์์ฒญ์ด ๋ค์ด์จ ๋ค, ์ผ์ ์๊ฐ์ ๊ธฐ๋ค๋ฆฐ ํ ์์ฒญ์ ์ํํ๋ค.
์ผ์ ์๊ฐ ๋ด์ ๊ฐ์ ์์ฒญ์ด ์ถ๊ฐ๋ก ๋ค์ด์ค๋ฉด ์ด์ ์์ฒญ์ ์ทจ์๋๋ค.
const debounce = (func, timeout = 300) => {
let timerID;
return (...args) => {
clearTimeout(timerID);
timerID = setTimeout(() => {
func(...args);
}, timeout);
};
};
์ฝ๋๋ฅผ ๋ณด๋ฉด, ๋ด๊ฐ ์คํ์ํค๊ณ ์ถ์ ํจ์์ ์ผ์ ์๊ฐ์ ์ฐจ๋ก๋ก ์ ๋ ฅ๋ฐ๋๋ค.
timer ๋ณ์๋ setTimeout ํจ์๋ฅผ ์ฐ์ํด์ ํ ๋น๋ฐ๋๋ค.
clearTimeout ์ setTimeout ๋น๋๊ธฐ ํจ์์ ํธ์ถ์ ์ทจ์ํ๋ ์ญํ ์ ํ๋ค.
์ผ์ ์๊ฐ ๋ด์ debounce ํจ์๋ฅผ ๊ณ์ ํธ์ถํ์ ๋,
timerID ๋ณ์์ ๊ณ์ ์๋ก์ด setTimeout ํจ์๊ฐ ํ ๋น๋๋ค.
์ผ์ ์๊ฐ์ด ์ง๋๊ณ timerID ๊ฐ ๋ ์ด์ ์ด๊ธฐํ๋์ง ์์ ๋,
๊ทธ์ ์์ผ setTimeout ๋ด ๋น๋๊ธฐ ํจ์๊ฐ ์คํ๋๋ค.
์ด๋ ์ธ์๋ก ๋ฐ์ ํจ์๊ฐ ํธ์ถ๋๋ค. (1๋ฒ)
์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํ์๋ฉด,
setTimeout ์ ํธ์ถํ๋ฉด Timer Identifier (ํ์ด๋จธ ์๋ณ์) ๊ฐ ๋ฐํ๋๋ค.
(timerID ๋ณ์์ ์ค์ ๋ก ๋ด๊ฒจ์๋ ๊ฐ)
๊ทธ๋์ clearTimeout(ํ์ด๋จธ ์๋ณ์) ๋ฅผ ํธ์ถํ์ ๋
setTimeout ๋ด ๋น๋๊ธฐ ํจ์์ ์คํ์ ์ทจ์ํ ์ ์๋ค.
โ Trailing vs Leading
ํจ์๊ฐ ๋์ค์ ์คํ๋๋์ง, ์ฒ์์ ์คํ๋๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ Debounce ๋ฅผ ๊ตฌ๋ถํ ์๋ ์๋ค.
1๏ธโฃ Trailing Debounce
const debounce = (func, timeout = 300) => {
let timerID;
return (...args) => {
clearTimeout(timerID);
timerID = setTimeout(() => {
func(...args);
}, timeout);
};
};
์ ์ฝ๋์ ๋์ผํ๋ค.
๋งค๋ฒ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ง์ ํ timeout ๋งํผ ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์
๋ง์ง๋ง์ ๋ฐ์ํ ์ด๋ฒคํธ๋ ์ผ์ ์๊ฐ ๊ธฐ๋ค๋ฆฐ ๋งํผ ์คํ๋๋ค.
2๏ธโฃ Leading Debounce
const debounce = (func, timeout = 300) => {
let timerID;
return (...args) => {
if (!timerID) {
func(...args);
}
clearTimeout(timerID);
timerID = setTimeout(() => {
timerID = undefined;
}, timeout);
};
};
์ด๋ฒคํธ ๋ฐ์์ ์ฒ์ ํจ์๊ฐ ํธ์ถ๋๊ณ ์ดํ์ ํจ์ ํธ์ถ์ ๋ชจ๋ ๋ฌด์ํ๋ค.
๐ Throttle
์ผ์ ์๊ฐ ๋์ ์์ฒญ์ด ํ ๋ฒ๋ง ์ํํ๋ค.
Devounce vs Throttle visualization
๋๋ฐ์ด์ฑ๊ณผ ํธ๋กํ๋ง ์๊ฐํ๋ฅผ ์ ํด๋์ ๋ธ๋ก๊ทธ๊ฐ ์์ด ์ฒจ๋ถํ๋ค.