AS-IS

전역변수로 스로틀링할 로직의 key를 설정하도록 구현하였습니다.

스로틀링할 로직이 추가될 때마다 key를 추가해주어야하고 key의 목록을 관리해야하는 불편함이 있습니다.

TO-BE

클로저를 활용해 key 없이 스로틀링 함수를 사용할 수 있도록 리팩토링을 진행하였습니다.

AS-IS: 전역 key 기반

const throttleManager = {};
export const throttle = (key = '', callback = () => {}, delay = 500) => {
    if (throttleManager[key]) {
        return;
    }

    callback();
    throttleManager[key] = true;

    setTimeout(() => {
        delete throttleManager[key];
    }, delay);
};

TO-BE: 클로저 기반

const throttle = (callback: (...params: any[]) => void, delay = 500) => {
    let timeout: ReturnType<typeof setTimeout> | null = null;

    return (...params: any[]) => {
        if (timeout) {
            return;
        }
        callback(...params);
        timeout = setTimeout(() => {
            timeout = null;
        }, delay);
    };
};

AS-IS: 전역 key 기반

장점

  • 구현이 단순함

고려할 점

  • 전역 객체 오염
  • key 문자열 수동 관리 필요
  • key 충돌 위험

TO-BE: 클로저 기반

장점

  • key 관리 불필요
  • 호출부마다 독립적 상태
  • params 전달 지원

고려할 점

  • 인스턴스별 생성 필요