웹 개발에서 이벤트 처리는 중요한 부분이다. 사용자의 입력, 스크롤등 다양한 이벤트가 발생할 때마다 적절한 반응이 필요하다. 하지만, 이러한 이벤트들이 과도하게 자주 발생한다면 성능 문제로 이어질 수 있다. 이를 해결하기 위해 Throttle과 Debounce라는 두 가지 기법이 필요하다.
Throttle은 함수의 호출 빈도를 제한하는 기법이다. 이는 지정된 시간 간격으로 이벤트를 처리한다 . 예를 들어, 스크롤 이벤트를 처리할 때 유용하다. Throttle을 사용하면 이벤트가 발생하는 동안 일정 시간 간격으로만 함수가 실행되기 때문에, 불필요한 처리를 최소화하고 성능을 향상시킬 수 있다.
import React, { useEffect } from 'react';
import { throttle } from 'lodash';
const ScrollComponent = () => {
const handleScroll = throttle(() => {
console.log(`Scroll position: ${window.scrollY}`);
// 스크롤 처리 로직
}, 200);
useEffect(() => {
window.addEventListener('scroll', handleScroll);
return () => {
window.removeEventListener('scroll', handleScroll);
};
}, []);
return (
<div>
<h1>스크롤하여 테스트하세요</h1>
</div>
);
};
Debounce는 이벤트가 연속해서 발생할 때 마지막 이벤트만을 처리한다. 예를 들어 사용자의 입력이 완료되었다고 판단되는 지점에서만 함수를 실행한다. 예를 들어, 사용자가 검색창에 타이핑을 할 때마다 검색을 실행하는 대신, 타이핑이 완료된 후에 검색을 실행하고자 할 때 Debounce를 사용한다.
import React, { useState } from 'react';
import { debounce } from 'lodash';
const SearchComponent = () => {
const [query, setQuery] = useState('');
const handleSearch = debounce((searchQuery) => {
console.log(`Search for: ${searchQuery}`);
// 검색 로직 또는 API 호출
}, 500);
const handleChange = (event) => {
setQuery(event.target.value);
handleSearch(event.target.value);
};
return (
<input type="text" value={query} onChange={handleChange} />
);
};
Throttle은 지정된 시간 간격마다 함수를 실행한다. 이는 지속적인 이벤트에 대해 과도한 반응을 줄이는 데 적합하다. 반면, Debounce는 이벤트가 연속해서 발생할 때 마지막 이벤트만을 처리한다. 이는 사용자의 입력이 끝난 것으로 간주되는 시점에 적합하다.
Throttle과 Debounce는 이벤트 기반 프로그래밍에서 성능을 최적화하는 데 필수적인 도구이다. 각각의 특성을 이해하고 적절한 상황에 맞게 사용한다면, 웹 애플리케이션의 반응성과 성능을 크게 향상시킬 수 있다. Throttle은 지속적인 이벤트 처리에, Debounce는 사용자의 입력이 끝나는 시점을 감지하는 데 유용하게 사용된다.