Thottle과 Debounce

jplendor·2022년 5월 24일
0

배경 및 문제 상황

  • 제품 검색창에 연관검색어 리스트를 보여주고자 했다.

  • 입력창의 value가 바뀔 때 마다 api 요청을 보내는 것은 서버의 과부하를 가져오고, 필요하지도 않다.

  • 아래 코드는 실제 api 요청 없이 문제 상황을 구현한 html, js

  • getRecommendList가 연관검색어 조회 api 호출과 같은 역할

index.html

...
<body>
    <input type="text" id="search" autocomplete="off">
    <ul id="recommend-list"></ul>
</body>
...

index.js

const fakeData = [
    "가죽 치마",
    "가죽 가방",
    "가죽 벨트",
    "쑥 라떼",
    "카페",
    "도서관",
];

const init = () => {
    const inputElem = document.querySelector("#search");
    inputElem.addEventListener("input", handleChange);
};

const handleChange = (e) => {
    const keyword = e.target.value;
    console.log(`keyword : ${keyword}`);
    if (keyword.length !== 0) {
        const recommendList = getRecommendList(keyword);
        setLi(recommendList);
    } else {
        setLi([]);
    }
};

const getRecommendList = (keyword) => {
    return fakeData.filter((item) => item.startsWith(keyword));
};

const setLi = (recommendList) => {
    const ulElem = document.querySelector("#recommend-list");
    ulElem.innerHTML = "";
    recommendList.forEach((item) => {
        const liElem = document.createElement("li");
        liElem.innerText = item;
        ulElem.appendChild(liElem);
    });
};

init();

해결 방법

Throttle

  • 동일 이벤트가 반복적으로 발생하는 경우 이벤트의 발생과 상관없이 임의로 설정한 일정 시간(밀리세컨드) 간격으로 콜백 함수의 실행을 보장
  • 일정 시간 내에 또 이벤트가 발생하더라도 무시된다.
  • 무한스크롤 기능 구현 시, 적용하면 좋다.

Debounce

  • 동일 이벤트가 반복적으로 시행되는 경우 마지막 이벤트가 실행되고 나서 일정 시간(밀리세컨드)동안 해당 이벤트가 다시 발생하지 않으면 해당 이벤트의 콜백 함수를 실행

Debounce를 적용하기로 결정!

  • 둘 중에 Debounce가 더 적절한 해결 방법이라고 생각했다.
  • 사용자가 키워드 입력을 멈출때 (input 이벤트가 일정 시간 동안 다시 발생하지 않았을 때) getRecommendList를 호출하면 되니까

적용한 코드

profile
만들기는 재밌어!

0개의 댓글