- 키보드만으로 추천 검색어들로 이동 가능하도록 구현
- 사용자의 입력값에 따른 추천 검색어 제공
- API 호출 횟수를 줄이는 전략 수립 및 실행
- API 호출별로 로컬 캐싱 구현
- 캐싱 기능을 제공하는 라이브러리 사용 금지(React-Query 등)
배포 링크 : https://pre-onboarding-12th-3-13.vercel.app/
사용자 경험(UX)을 개선하기 위해 다양한 Event Handler를 활용하여 추천 검색어와 최근 검색어를 손쉽게 선택하고 빠르게 검색할 수 있도록 도와줍니다.
-
src/components/SearchContainer/SearchContainer.tsx, TextInput.tsx
-
검색 Input과 관련된 사용자 Event 발생 시 실행할 Event Handler 함수가 정의되어 있습니다.
-
Focus Event Handler :
- 검색 Input Focus 시 검색어 리스트 UI가 노출되고, Blur 시 검색어 리스트 UI가 제거됩니다.
-
Keyboard Event Handler :
- 위, 아래 방향키 입력 시 검색어 리스트의 검색어가 활성화되어 원하는 검색어로 간편하게 이동할 수 있습니다.
- Keyboard Event를 이용하여 검색어를 활성화 시킬 경우, 검색 Input에 해당 검색어를 반영합니다.
- 사용자의 편의를 위해 Keyboard Event로 인해 검색 Input이 변경될 경우, 추천 검색어를 갱신하지 않습니다.
- Enter 키를 눌러 활성화 된 검색어를 즉시 검색할 수 있습니다.
-
Change Event Handler :
- 검색 Input의 Value가 없으면 최근 검색어가, Value가 있으면 추천 검색어가 나타납니다.
- Change Event가 발생 시 추천 검색어가 갱신됨에 따라 검색어 활성화 상태를 초기화합니다.
-
-
src/components/KeywordsList/KeywordListItem.tsx
- 각각의 추천 검색어 및 최근 검색어를 나타내는 컴포넌트로, Mouse Event Handler 함수와 함께 정의되어 있습니다.
- Mouse Event Handler :
- 검색어에 마우스 커서를 올리면 해당 검색어가 활성화됩니다.
- 검색어에서 마우스 커서가 벗어나면 검색어 활성화 상태가 초기화됩니다.
- Mouse Event와 검색 Input의 Keyboard Event로 발생한 검색어 활성화 상태는 공유됩니다.
input의 값이 변할때 마다 api가 호출되는 것을 막기 위해 Debounce를 수행하는 useDebounce 훅을 추가하였습니다.
이를 통해 이벤트 오버클럭으로 인한 리소스 사용량의 증가와 서버의 과부하를 예방하고자 하였습니다.
- src/hooks/useDebounce.ts
- callback : 사용자의 키보드 이벤트가 멈춘 후 실행 될 함수를 정의합니다
- delay : 사용자의 이벤트가 멈춘 것을 감지 할 시간을 정의합니다.
- trigger : 변경을 감지하여 useDebounce 훅이 실행 될 의존성을 설정합니다.
- src/components/keywordList/RecommendList.tsx
- getResultList: 검색어 키워드를 쿼리스트링으로 전달하여 서버에서 데이터를 받아오고, 이를 recommendList에 저장하여 사용자에게 저장합니다.
- useDebounce : searchText의 변화를 감지하여 사용자의 동작이 150ms 이상 멈추면 콜백함수로 전달한 getResultList를 실행하여 api를 호출합니다.
프로젝트에서는 로컬 스토리지(Local Storage)를 활용하여 검색 결과를 캐싱하고 관리하는 캐싱 기능을 구현하였습니다. 이를 위해 주요한 설계 및 개발 방향은 다음과 같습니다:
-
LocalStorage 내부 데이터 관리: 로컬 스토리지를 사용하여 검색 결과를 캐싱하고, 이 데이터를 효율적으로 관리합니다.
-
유효 기간 설정: 각 검색 결과에 대한 유효 기간(Expiration Date)을 설정하여 만료된 데이터를 정기적으로 삭제합니다.
-
캐시 크기 관리: 로컬 스토리지의 메모리 사용을 효율적으로 관리하기 위해 캐시 크기 제한을 설정하고, 초과할 경우 가장 오래된 데이터를 제거합니다.
-
Main logic: api를 호출 할 때마다, caching된 local storage를 확인 한 후 cache hit가 발생할 경우 해당 cache를 사용합니다. 만약 존재 하지않다면 새로운 cache를 설정합니다. 이때, 존재하는 cache가 maximum cache size를 초과하였을때, 가장 오래된 cache를 제거합니다.
-
LocalStorageCacheManager 클래스: 검색 결과를 캐싱하고 로컬 스토리지를 관리하기 위한 클래스로서, 다음과 같은 메소드를 포함하고 있습니다:
-
set(key, value, duration): 특정 검색어에 대한 결과를 캐싱하며, 지정된 기간 동안 유지합니다.
-
get(key): 특정 검색어에 대한 캐시된 결과를 반환하며, 만료된 데이터는 자동으로 삭제됩니다.
-
has(key): 특정 검색어에 대한 캐시가 있는지 확인합니다.
-
delete(key): 특정 검색어에 대한 캐시를 삭제합니다.
-
cleanupExpiredItems(): 만료된 캐시 항목을 정리하고 삭제합니다.
-
removeOldestItem(): 가장 오래된 캐시 항목을 삭제하여 캐시 크기를 유지합니다.
-
-
캐시 크기 제한 설정: cacheSizeLimit 속성을 사용하여 로컬 스토리지에 저장할 수 있는 캐시의 최대 크기를 설정할 수 있습니다.