์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ๊ณผ์ ํ ์คํธ
- custom hook
- Node.js
- ์๊ณ ๋ฆฌ์ฆ
- ์ฝํ
- ์นด์นด์ค์ฑ์ฉ
- ๋ธ๋ฃจํธํฌ์ค
- React
- ์ด๋ถํ์
- ๋ฐฑ์ค
- ๋ถ์คํธ์บ ํ์น๋ชจ๋ฐ์ผ
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ๋ถ์คํธ์ปจํผ๋ฐ์ค
- ์นด์นด์ค
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์ฝ๋ ํฌ๋ฉง
- JavaScript
- ๋๋๊ทธ ์ด๋ฒคํธ
- DP
- icecandidate
- ์ฝ๋ฉํ ์คํธ
- svgํ์ผ ๋ค๋ฃจ๊ธฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- Redux toolkit
- router v6
- ์ด๋ฏธ์ง ์์
- ๋ฆฌ๋์ค ํดํท
- js
- TypeScript
- ๋์ ๊ณํ๋ฒ
- Today
- Total
๐ฅ dev-ruby
๋๋ฐ์ด์ฑ๊ณผ ์ฐ๋กํ๋ง ๋ณธ๋ฌธ
์๋ชป๋ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ ! ๐๐
๋๋ฐ์ด์ฑ๊ณผ ์ฐ๋กํ๋ง์ ๋๋ฐ์ด์ค์ ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์ง ์๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค. ์ผ์ข ์ ์ต์ ํ๋ผ๊ณ ๋ณด๋ฉด๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ๊ฐ์ ์๋ฏธ๋ฅผ ์์๋ณด์.
- ๋๋ฐ์ด์ฑ(debouncing) : ์ฐ์ด์ด ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ์ฃผ๋ก, ๊ทธ๋ฃน์์ ์ฒ์์ด๋ ๋ง์ง๋ง์ผ๋ก ์คํ๋ ํจ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.
- ์ฐ๋กํ๋ง(throttling) : ์ฐ์ด์ด ๋ฐ์ํ ์ด๋ฒคํธ์ ๋ํด, ์ผ์ ํ delay๋ฅผ ํฌํจ์์ผ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ ์ด๋ฒคํธ๋ ๋ฌด์ํ๋ ๋ฐฉ์์ ๋ปํ๋ค. ์ฆ, delay์๊ฐ๋์ ํธ์ถ๋ ํจ์๋ ๋ฌด์ํ๋ ๋ฐฉ์์ด๋ค.
๋๋ฐ์ด์ฑ
์์๋ฅผ ๋ค์ด ์ฝ๊ฒ ์ค๋ช ํด๋ณด๊ฒ ๋ค. ์๋น์์ ์ฃผ๋ฌธ์ ํ ๋,
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ
1. ๊ณ ๊ฐ: ์ฝ๋ผ ์ฃผ๋ฌธ์ด์!
2. ์ง์: ์ฝ๋ผ ์ฃผ๋ฌธ๋ฃ๊ธฐ
3. ๊ณ ๊ฐ: ํ์คํ ์ฃผ๋ฌธ์ด์!
4. ์ง์: ํ์คํ ์ฃผ๋ฌธ๋ฃ๊ธฐ
5. ๊ณ ๊ฐ: ์คํ ์ดํฌ ์ฃผ๋ฌธ์ด์!
6. ์ง์: ์คํ ์ดํฌ ์ฃผ๋ฌธ๋ฃ๊ธฐ
๋๋ฒ์งธ ๋ฐฉ๋ฒ
1. ๊ณ ๊ฐ: ์ฝ๋ผ, ํ์คํ, ์คํ ์ดํฌ ์ฃผ๋ฌธ์ด์!
2. ์ง์: ์ฝ๋ผ, ํ์คํ, ์คํ ์ดํฌ ์ฃผ๋ฌธ๋ฃ๊ธฐ
๋น์ฐํ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ด ํจ์ฌ ํจ์จ์ ์ด๋ค. ์ด๋ ๊ฒ ์ฃผ๋ฌธ์ด ๋๋ ๋๊น์ง ๋ฃ๊ณ ์๋ค๊ฐ ๋ง์ง๋ง ์์ฒญ์ด ์๋ฃ๋ ํ ์ฃผ๋ฌธ์ ๋ฃ๋ ๊ฒ์ด ๋๋ฐ์ด์ฑ์ ์๋ฆฌ์ด๋ค.
๋๋ฐ์ด์ฑ ์ฌ์ฉ์์
์คํฌ๋กค ์ด๋ฒคํธ๋ก ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค. ๋จผ์ ๋๋ฐ์ด์ฑ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง ์์์ ๋ ์์๋ฅผ ๋ณด์.
๋๋ฐ์ด์ฑ ์ ์ฉ X ์ฝ๋
<!DOCTYPE html>
<html>
<body>
<div id="main" style="height: 300vh">
<div style="position: fixed">
<h3>์๋ฌด ์ฒ๋ฆฌ๋ ํ์ง ์์์ ๊ฒฝ์ฐ</h3>
<div>
<label>์ด๋ฒคํธ ๋ฐ์ : </label>
<span id="count">0</span>
</div>
</div>
</div>
</body>
<script>
window.addEventListener("scroll", function (e) {
console.log("์คํฌ๋กค ์ด๋ฒคํธ ๋ฐ์");
const count = document.getElementById("count");
count.innerText = parseInt(count.innerText) + 1;
});
</script>
</html>
์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๋ชจ๋ ์๊ฐ๋ง๋ค ํจ์๊ฐ ํธ์ถ๋๊ณ count๊ฐ ๊ณ์ ๋์ด๋๊ฒ ๋๋ค. ๋ง์ฝ ์ด ํจ์๊ฐ ์ข ๋ ๋ฌด๊ฑฐ์ด ์์ ์ ํ๊ฒ ๋๋ค๋ฉด ์คํฌ๋กค์ ํ ๋๋ง๋ค ๋ ๋๋ง์ด ๋๊ณ ์ฑ๋ฅ ์ด์๋ก ์ด์ด์ง ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ๋๋ฐ์ด์ฑ ๊ธฐ๋ฒ์ ์ ์ฉํ ์ฝ๋๋ฅผ ๋ณด์.
๋๋ฐ์ด์ฑ ์ ์ฉ O ์ฝ๋
<!DOCTYPE html>
<html>
<body>
<div id="main" style="height: 300vh">
<div style="position: fixed">
<h3>Debouncing ์ ์ฉ</h3>
<div>
<label>์ด๋ฒคํธ ๋ฐ์ : </label>
<span id="count">0</span>
</div>
</div>
</div>
</body>
<script>
let debouncer;
window.addEventListener("scroll", function (e) {
if (debouncer) {
clearTimeout(debouncer);
}
debouncer = setTimeout(function () {
console.log("์คํฌ๋กค ์ด๋ฒคํธ ๋ฐ์");
const count = document.getElementById("count");
count.innerText = parseInt(count.innerText) + 1;
}, 300);
});
</script>
</html>
debouncer๋ผ๋ ๋ณ์์ delay 300ms๋ฅผ ๊ฑธ์ด์ค setTimeout ํจ์๋ฅผ ๋์
ํ๋ค. ์ฌ๊ธฐ์ ํด๋ก์ ๊ฐ๋
์ด ์ฐ์๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ง์ฝ ํ์ฌ ๋ฐ์ํ ์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ์ด์ ์ ๋ฐ์ํ ์คํฌ๋กค ์ด๋ฒคํธ๋ณด๋ค 300ms๋ด์(๋ณด๋ค ๋นจ๋ฆฌ) ๋ฐ์ํ๋ค๋ฉด, ์ด์ ์ด๋ฒคํธ์ ๊ธฐ๋ก๋ setTimeout์ด ๋์
๋ debouncer์ ๋ค์ ์๋ก์ด setTimeout์ ๋์
์ํจ๋ค. ์ด๋ debouncer์ ๊ฐ์ด ๋ค์ด์๋ค๋ฉด clearTimeout์ผ๋ก ํด๋น ํ์ด๋จธ๋ฅผ ์ทจ์ํด์ผ ํ๋ค. ๊ทธ๋์ผ ์ด์ ํ์ด๋จธ๊ฐ ์ง์์ง๊ณ ์๋ก์ด ํ์ด๋จธ๊ฐ ๋์
๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ง์ง๋ง์ผ๋ก ๋ฐ์ํ ์ด๋ฒคํธ์ ๋ํด์๋ง 300ms๊ฐ ์ง๋ ํ setTimeout์์ ๋ก์ง์ด ์ํ๋์ด ์นด์ดํธ๊ฐ ์ ์ ํ ๋ณํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฐ๋กํ๋ง
์ฐ๋กํ๋ง์ ๋ณดํต ์ฑ๋ฅ ๋ฌธ์ ๋๋ฌธ์ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค. ์ฐ๋กํ๋ง์ ์คํ ํ์์ ์ ํ์ ๊ฑฐ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๊ณ , ๋ช ์ด์ ํ ๋ฒ ๋๋ ๋ช ๋ฐ๋ฆฌ์ด์ ํ ๋ฒ์ฉ๋ง ์คํ๋๋๋ก ์ ํ์ ๋๋ ๊ฒ์ด๋ค.
์ฐ๋กํ๋ง ์ ์ฉ O ์ฝ๋
<!DOCTYPE html>
<html>
<body>
<div id="main" style="height: 300vh">
<div style="position: fixed">
<h3>Throttling ์ ์ฉ</h3>
<div>
<label>์ด๋ฒคํธ ๋ฐ์ : </label>
<span id="count">0</span>
</div>
</div>
</div>
</body>
<script>
let throttler;
window.addEventListener("scroll", function (e) {
if (throttler) {
return;
}
throttler = setTimeout(function () {
console.log("์คํฌ๋กค ์ด๋ฒคํธ ๋ฐ์");
const count = document.getElementById("count");
count.innerText = parseInt(count.innerText) + 1;
throttler = null;
}, 200);
});
</script>
</html>
์คํ ๊ฒฐ๊ณผ, ์คํฌ๋กค์ ์ฒ์ฒํ ์์ง์ฌ๋, ์์ฒญ ๋น ๋ฅด๊ฒ ์์ง์ฌ๋ ์ผ์ ํ๊ฒ count๊ฐ ๋ณํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ ๋๋ฐ์ด์ค์ ๋ค๋ฅธ ์ ์ throttler์ ํ์ด๋จธ๊ฐ ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ clearTimeout์ผ๋ก ํ์ด๋จธ๋ฅผ ์ทจ์ํด์ฃผ๋ ๊ฒ์ด ์๋ return์ผ๋ก ๊ทธ๋ฅ ์ข
๋ฃ ์ํค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ด์ ์ ๋์
๋์๋ ํ์ด๋จธ๊ฐ ์ทจ์๋์ง ์๊ณ , ํ์ด๋จธ๊ฐ ์ค์ ์ด ๋ ์ดํ๋ก๋ถํฐ 300ms๋ด์ ์คํ๋๊ฒ ๋ ๊ฒ์ด๋ค. throttler์ ํ์ด๋จธ๊ฐ ์ค์ ๋๊ณ ๋ ํ 300ms๋์์ throttler๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฅ๊ณ ์๋ ๊ฒ์ด๋ค. ์ด๋ฒคํธ๋ฅผ ์ฅ๊ณ ์๋ 300ms๋์ 1๋ฒ์ ์ด๋ฒคํธ๋ง ๋ฐ์ํ๊ฒ ๋๋ค.
๋ํ, ๋ก์ง์ด ์คํ๋๊ณ ๋ ํ throttler๋ฅผ null๋ก ์ด๊ธฐํ ์์ผ์ฃผ๋ฉด์ throttler์ ๊ฐ์ด ์๋ค๋ ๊ฒ ์๋ ค์ฃผ์ด์ผ ๋ค์ ์คํฌ๋กค ์ด๋ฒคํธ ๋ฐ์ ์ return ๋์ง ์๊ณ setTimeout์ ๋ค์ ๊ฑธ์ด์ค ์ ์์ ๊ฒ์ด๋ค.
์ฝ์๋ก ํ์ธํด๋ณด๋ setTimeout์ด ์์ ์ ์๊ฐ์ ๋ฆฌํดํ๋๋ฐ, 300msํ ๋ก์ง์ด ์ ๋ถ ๋๋๊ณ ๋์๋ 1์ ์ถ๋ ฅํ๋ ๊ฒ์ ํ์ธํ๋ค. ์ฐ๋ฆฌ๋ clearTimeout์ผ๋ก ํ์ด๋จธ๋ฅผ ์ด๊ธฐํ์์ผ์ฃผ์ง ์์์ผ๋ฏ๋ก null๋ก ๊ฐ์ด ์๋ค๋ ๊ฒ์ ์๋ ค์ฃผ์ด์ผ ํ๋ค.
๋ ํผ๋ฐ์ค
https://developer.mozilla.org/ko/docs/Web/API/setTimeout
https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout
https://programming119.tistory.com/241