본문으로 바로가기

프로젝트 평가 기준을 보다가 

Enter 키로 검색을 실행해도 버튼 클릭과 동일한 결과가 나올 수 있도록 구현하세요.

 

라는 부분이 있어 흠칫했습니다....

디바운싱으로 구현하면 상관 없는거 아니야.....? 라고 생각하고 바로 튜터님께 갔더니 "상관없어요~~~ㅎㅎ"라는 말을 듣고 안심했지만 뭐 도전 기능 구현도 끝냈겠다 바로 디바운싱과 일반 검색 두 개의 기능을 선택해서 사용할 수 있도록 만들어보자...! 라는 생각이 들었습니다.

 

일단 

<select id="search-type">
    <option value="search-debouncing">디바운싱</option>
    <option value="search-normal">일반검색</option>
</select>
<input id="movie-search" type="text" placeholder="영화를 검색하세요..." autocomplete="off">

 

이렇게 select 태그를 이용하여 디바운싱과 일반검색을 선택할 수 있도록 해줍니다.

 

 

그 후에 각각의 검색 기능을 searchDebouncing과 searchNormal로 나눠주고

const searchDebouncing = searchInput.addEventListener(
    'input',
    debounce((e) => {
        console.log(e.target.value);
        const search = e.target.value.trim();
        renderMovieList(search);
    }, 300)
);

const searchNormal = searchInput.addEventListener(
    'keyup',
    (e) => {
        if(e.key === 'Enter'){
            const search = e.target.value.trim();
            renderMovieList(search);
        }
    }
)

 

그 후 select 태그 이벤트리스너에서 초기에 설정해놨던 검색 이벤트리스너를 삭제해서 초기화해주고 디바운싱을 선택하면 디바운싱 이벤트리스너를 일반 검색이면 일반 검색 이벤트리스너를 추가해줬습니다.

 

searchInput.addEventListener('input', searchDebouncing);

searchOption.addEventListener('change', (e) => {
    const selectedOption = e.target.value;

    searchInput.removeEventListener('input', searchDebouncing);
    searchInput.removeEventListener('keyup', searchNormal);

    if (selectedOption === 'search-normal') {
        console.log('normal');
        searchInput.addEventListener('keyup', searchNormal);
    } else {
        console.log('debounce');
        searchInput.addEventListener('input', searchDebouncing);
    }
});

 

 뭐 바로 되는 줄 알았는데 역시나...

 

??????

 

수많은 콘솔의 향연.....
저렇게 많이 콘솔이 찍히는데에는 무조건 함수의 중복된 호출 때문일거라 생각하고 수정에 들어가봤습니다.

 

다시 보니까 왜 저렇게 짰는지....

searchDebouncing과 searchNoraml 함수에서도 이벤트리스너가 있고 searchOption에서 검색 방식이 바뀔 때마다도 이벤트리스너가 중복으로 실행되는 중이었습니다....

const searchDebouncing = debounce((e) => {
	console.log(e.target.value);
    const search = e.target.value.trim();
    renderMovieList(search);
}, 300);

const searchNormal = (e) => {
    if (e.key === 'Enter') {
        const search = e.target.value.trim();
        renderMovieList(search);
    }
};

 

바로 함수에서 addEventListener를 없애고 매개변수를 받아서 그 값에 따라 렌더링해주는 함수로 바꿔주고 실행해봤습니다.

 

이런 간단한 데에서 실수를 하면서 코드를 짜다니...

 

그래도 이런 실수를 하면서 다 성장하는거 아니겠습니까~~~

프로젝트도 점점 깔끔해지는 중인거 같아(제 기준ㅎ) 만족스럽습니다!!