React์์ ๊ฒ์ ์๋์์ฑ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ฑฐ๋,
์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํด์ ๋ฌดํ ์คํฌ๋กค์ ๋ง๋ค๋ค ๋ณด๋ฉด debounce
์ throttle
์ ๊ผญ ๋ง๋๊ฒ ๋๋ค.
๋ง์ ๊ตฌํํ๋ ค๊ณ ํ๋ฉด "๋ ์ค ๋ญ๊ฐ ๋ญ์๋๋ผ?" ํ๊ฒ ๋ผ์ ์ ๋ฆฌํด๋ดค๋ค.
๋ง์ง๋ง ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ ์ผ์ ์๊ฐ์ด ์ง๋์ผ ์คํ
์ฆ, ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ ๋ฉ์ถ๊ณ ์ผ์ ์๊ฐ์ด ์ง๋์ผ ํจ์๊ฐ ์คํ๋๋ค.
์ฃผ๋ก ๊ฒ์์ฐฝ ์๋์์ฑ ๊ฐ์ ๋ฐ์์ ์ฌ์ฉ๋๋ค.
function debounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
์ผ์ ์๊ฐ ๋์ ํ ๋ฒ๋ง ์คํ๋๊ฒ ์ ํ
์คํฌ๋กค์ฒ๋ผ ์ด๋ฒคํธ๊ฐ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๊ณ์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ,
๋๋ฌด ๋ง์ ํธ์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ผ์ ์๊ฐ ๋จ์๋ก ๋์ด์ ์คํํ๋ค.
function throttle(fn, limit) {
let inThrottle;
return (...args) => {
if (!inThrottle) {
fn(...args);
inThrottle = true;
setTimeout(() => (inThrottle = false), limit);
}
};
}
๊ตฌ๋ถ | debounce | throttle |
---|---|---|
์คํ ์์ | ๋ง์ง๋ง ์ด๋ฒคํธ ๋ฐ์ ํ ์ผ์ ์๊ฐ ๋ค | ์ผ์ ์๊ฐ๋ง๋ค ํ ๋ฒ์ฉ |
์ฌ์ฉ ์์ | ๊ฒ์์ฐฝ ์ ๋ ฅ, ์ฐฝ ํฌ๊ธฐ ์กฐ์ ๋ฑ | ์คํฌ๋กค ์ด๋ฒคํธ, ๋๋๊ทธ, resize ๋ฑ |
ํน์ง | ์ด๋ฒคํธ๊ฐ ๋๋ ํ ์คํ๋จ | ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋จ |
๊ฐ๋
๋ง ๋ณด๋ฉด ๋น์ทํด ๋ณด์ด์ง๋ง,
"์ฌ์ฉ์๊ฐ ์
๋ ฅ์ ๋ฉ์ท์ ๋" ์คํํด์ผ ํ๋ ์ํฉ์ debounce,
"๊ณ์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ ํํ๊ณ ์ถ์ ๋" throttle์ ์จ์ผ ํ๋ค๋ ์ฐจ์ด๊ฐ ๋ถ๋ช
ํด์ก๋ค.
์ด์ ๋ฌดํ์คํฌ๋กค ๋ง๋ค ๋ ํท๊ฐ๋ฆฌ์ง ์์ ์์ ์ด ์๊ฒผ๋ค ๐
๐ฏ "์ ๋ ฅ์ debounce, ์ด๋ฒคํธ๋ throttle!"