Debounce & Throttle
์ฐ์์ ์ผ๋ก ๋ฐ์ํ๋ ํจ์๋ ์ด๋ฒคํธ์ ์คํ ๋น๋๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ์ผ๋ก, ์ต์ ํ๋ฅผ ํตํ ์ฑ๋ฅ ํฅ์์ด ๋ชฉ์ ์ด๋ค.
Debounce vs Thottle
1) ํจ์๋ ์ด๋ฒคํธ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ
2) ํจ์๋ ์ด๋ฒคํธ๊ฐ ์ฐ์์ ์ด ์๋ ๋์ด์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
Debounce : ์ฐ์์ ์ผ๋ก ํจ์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ํ ์ผ์ ์๊ฐ ๋์ ์ถ๊ฐ ์ด๋ฒคํธ/ํจ์๊ฐ ์๋ค๋ฉด ์คํ
Throttle : ์ฐ์์ ์ผ๋ก ํจ์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๋์ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ(ํ ์ ๊ฐ์ง๊ณ )์ผ๋ก ์คํ
Debounce
์ฐ์์ ์ผ๋ก ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ํ๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก, ๋ง์ง๋ง์ ํ ๋ฒ์ ๋ฌถ์ด์ ์ฒ๋ฆฌํด๋ ์๊ด ์์ ๋ ์ฌ์ฉํ๋ค.
๊ฒ์ ์๋ ์์ฑ ๊ฐ์ ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ์ ์ ์ฉํ๋ค.
์์
์ด๋ฒ์๋ ์ด์ ์ ์ค์ตํ ๋๋ฌผ ์ ๋ณด ์ฌ์ดํธ๋ฅผ ๊ฐ์ ธ์๋ค... https://hydeveloper.tistory.com/195
์ผ๋จ Debounce๋ฅผ ์ฐ๊ธฐ์ ์์ ์ด์ง ์ฝ๋๋ฅผ ์์ ํด์ ๊ฒ์์ด๊ฐ ์ ๋ ฅ๋ ๋๋ง๋ค ๋ฐ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ก ํ๋ค.
App.jsx์ ์ผ๋ถ
<input
value={inputValue}
onChange={(event) => {
setInputValue(event.target.value);
// inputValue๊ฐ ์๋ event.target.value๋ฅผ ์ฌ์ฉํ๋ ์ด์
// inputValue๋ ๋ณ๊ฒฝ๋๊ธฐ ์ด์ ์ ์ํ์ฌ์ ๋ง์ฝ ์๋ ์ฃผ์์ inputvalue๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ
// ๊ธฐ์กด ํค์๋์์ ์์๋ก ์
๋ ฅ์ ํ๋ฒ ๋ ํด์ผ๋ง ๊ทธ ๊ฒ์์ด ๊ฒฐ๊ณผ๊ฐ ๋ฐ์๋๋ค... (ํ๋จ๊ณ ๋๋ฆฌ๊ฒ url์ด ์
๋ฐ์ดํธ๋จ)
navigate(`/search?animal=${event.target.value}`);
}}
/>
<button onClick={() => navigate(`/search?animal=${inputValue}`)}>
๊ฒ์
</button>
Search.jsx์ ์ผ๋ถ
const [searchParams] = useSearchParams();
const param = searchParams.get("animal");
const reg = getRegExp(param);
const filteredData = data.filter((el) => el.name.match(reg));
์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ..
๋ง์ฝ ๋ด๊ฐ 'ํ๋ค'๋ฅผ ์ ๋ ฅํ๊ณ ์ ํ๋ค๋ฉด ์คํ๊ฐ ์๋ค๋ ๊ฐ์ ํ์ ใ ใ ใด ใท ใ ์ต์ ๋ค์ฏ๋ฒ์ ์๋ฒ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ค. ์ด๋ฐ ์์ ๊ฒ์ ์ด๋ฒคํธ๊ฐ ์์ฐจ๋ก ๋ฐ์๋๋ค๋ฉด ์ ์ด๋ ์๋ฒ๋ ์ฒญ๊ตฌ์ ๋ ์ค ํ๋๋ ํฐ์ง ์ ์๋ค...
์ด์ Debounce๋ฅผ ์ฌ์ฉํด์ ์์ ํ ๊ฑด๋ฐ, ์๋ฌด๋๋ ์ผ์ ์๊ฐ์ด ์ง๋ ํ์ ํจ์/์ด๋ฒคํธ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ setTimeout๊ฐ์ ํ์ด๋จธ ํจ์๊ฐ ํ์ํ๋ค.
const [searchParams] = useSearchParams();
const param = searchParams.get('animal');
const reg = getRegExp(param);
// filteredData๊ฐ ๋ณ๊ฒฝ๋ ๋ debounce๋ฅผ ์คํํ๊ธฐ ์ํด ์๋ก์ด ์ํ ์์ฑ
const [filteredData, setFilteredData] = useState(data);
useEffect(() => {
const debounceTimer = setTimeout(() => {
const newFilteredData = data.filter((el) => el.name.match(reg));
setFilteredData(newFilteredData);
}, 1000); // 1์ด ๋์ ์ถ๊ฐ ์
๋ ฅ์ด ์ผ์ด๋์ง ์์ผ๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค
return () => clearTimeout(debounceTimer);
}, [param]);
- param์ด ๋ฐ๋ ๋๋ง๋ค useEffect๊ฐ ์คํ
- setTimeout์ผ๋ก 1์ด ๋ค์ ํํฐ๋ง ์ํ
=> ๊ทธ๋ฌ๋ 1์ด ์์ผ๋ก ๋ค๋ฅธ param์ด ์ ๋ ฅ๋๋ฉด ์ด์ ํ์ด๋จธ๋ฅผ ํด๋ฆฌ์ดํจ์๋ก ์ ๊ฑฐ
=> 1์ด ๋ค์๋ param์ด ๋ฐ๋์ง ์๋๋ค๋ฉด ๊ฒ์ ํํฐ๋ง ์คํ - ์ ์์์์ Debounce๋ ์ ๋ ฅ์ด ๋ฉ์ถ ๋ค, 1์ด๊ฐ ์ง๋์ ์คํ๋๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
Throttle
์ด๋ฒคํธ๋ฅผ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์ ๋ก, ์ค๊ฐ ์ค๊ฐ ๋๊ธฐ์ง ์๋ ์ธํฐ๋์ ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ค.
๋ง์ฐ์ค ์ด๋, ์คํฌ๋กค ์ด๋ฒคํธ๊ฐ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ ์ ์ ์ฉํ๋ค.
์์
์์ ๋๋ฌผ ์ ๋ณด ์ฌ์ดํธ๋ฅผ ์ด๋ฒ์ throttle ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
์ผ์ ์๊ฐ๋ง๋ค ์คํ๋๋ ๋งํผ ์๊ฐ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค์ผ ํ๋๋ฐ, ์ด ์์์์๋ ๋จ์ ์๊ฐ์ ๊ณ์ฐํด ์ง์ฐ์ํค๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ณ ์๋ค.
์์์์๋ 1์ด๋ง๋ค ์คํํ๋ฏ๋ก setTimeout์ ๋งค๊ฐ๋ณ์ ์ค delay ๋ถ๋ถ์
1000- (ํ์ฌ ์๊ฐ - ์ด์ ์คํ ์๊ฐ)์ผ๋ก ์์ฑํด 1์ด๋ง๋ค ์คํ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค....
const [searchParams] = useSearchParams();
const param = searchParams.get('animal');
const reg = getRegExp(param);
// filteredData๊ฐ ๋ณ๊ฒฝ๋ ๋ debounce๋ฅผ ์คํํ๊ธฐ ์ํด ์๋ก์ด ์ํ ์์ฑ
const [filteredData, setFilteredData] = useState(data);
// ์ด์ ์คํ ์๊ฐ์ ๊ธฐ์ตํด๋๋ ๋ณ์
// useRef๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋ฉ๋ผ๋ ๊ฐ์ด ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ!!
const time = useRef(new Date());
useEffect(() => {
// ํ์ฌ ์๊ฐ, time.current์ ๋น๊ตํด์ ์ผ๋ง๋ ์๊ฐ์ด ํ๋ ๋์ง ์ธก์ ์ ์ํจ
const newTime = new Date();
const throttleTimer = setTimeout(() => {
const newFilteredData = data.filter((el) => el.name.match(reg));
setFilteredData(newFilteredData);
// ์คํ๋์์ผ๋ ํ์ฌ ์๊ฐ์ผ๋ก ๊ฐฑ์
time.current = new Date();
// ๋ง์ง๋ง ์คํ์ด 0.6์ด ์ ์ด๋ผ๋ฉด, 1000 - 600 = 400ms ํ์ ์คํ๋๋๋ก ์์ฝ
// ์ฆ 1์ด์ ํ๋ฒ๋ง ์คํ๋๋๋ก ํจ
}, 1000 - (newTime - time.current));
// ํด๋ฆฌ์ด ํจ์
return () => clearTimeout(throttleTimer);
}, [param]);
๋น๊ต
debounce ๋ฐฉ์๊ณผ throttle ๋ฐฉ์์ ๋น๊ตํ๊ธฐ ์ํด setTimeout ๋ด์ console.log๋ฅผ ๋ฃ์ด ์ด๋ป๊ฒ ์คํ๋๋์ง ํ์ธํด๋ดค๋ค.
debounce ๋ฐฉ์
throttle ๋ฐฉ์
์ฐธ๊ณ
https://velog.io/@jiynn_12/Debounce-%EC%99%80-throttle-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B3%A0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90
https://velog.io/@eungbi/JS-debounce-throttle-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
https://pks2974.medium.com/throttle-%EC%99%80-debounce-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-2335a9c426ff
'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React / Next.js (2) | 2025.04.29 |
---|---|
React / ๋ฒ๋ค๋ง, ์ฝ๋์คํ๋ฆฌํ (0) | 2025.04.24 |
React / lazy, Suspense (1) | 2025.04.24 |
React / React Developer Tools (0) | 2025.04.24 |
React / ์ต์ ํ ํจ์ (0) | 2025.04.23 |