Giter VIP home page Giter VIP logo

pre-onboarding-11th-4's Introduction

프리온보딩 인턴십 4주 차 과제

검색창, 검색어 추천 기능, 캐싱 기능 구현

0. 목차

1. 최종 구현 화면

00-assignments-conclusion.webm

2. 데모 링크

https://real-bird.github.io/pre-onboarding-11th-4/

3. Assignments

3-1. 검색 영역 클론

3-2. 질환명 검색시 API 호출 통해서 검색어 추천 기능 구현

  • 최종 구현 화면 참고
  • 검색어 state가 변경되면 API 요청 메서드를 호출해 검색 결과를 가져왔습니다.
  • 검색 결과에서 검색어를 포함한 질환명만 필터링하였고, 원본 사이트처럼 최대 7개의 검색 결과만 추천되도록 구현했습니다.

3-3. API 호출별로 로컬 캐싱 구현

  • API를 호출하면 검색어를 key, 검색 결과를 value로 설정하여 localStorage에 저장했습니다.
    • localStorage를 선택한 이유는 제가 로컬 캐싱 개념을 몰라 구현에 의의를 두자는 마음 때문이었습니다.
    • 가장 친숙한 저장소를 사용해 빠르게 기능을 구현했습니다.
  • expire time은 저장 시간에 만료 기한을 더한 값을 추가하여 구현하였습니다.
class CacheService {
  get<T>(searchValue: string): FetchStateType<T> {
    return JSON.parse(this.localStorage.get(searchValue));
  }

  set<T>(searchValue: string, fetchState: T, expiryTime?: number) {
    this.localStorage.save(searchValue, {
      fetchState,
      saved_at: new Date().getTime() + (expiryTime || this.EXPIRY_MINUTES),
    });
  }
}
  • localStorage를 순회하면서 saved_at이 현재 시간보다 작거나 같으면 스토리지에서 삭제합니다.
class CacheService {
  removeExpiryCaches() {
    for (const item in localStorage) {
      const localCacheItem = JSON.parse(this.localStorage.get(item));
      if (localCacheItem?.saved_at && localCacheItem?.saved_at <= Date.now()) {
        this.localStorage.remove(item);
      }
    }
  }
}
  • 로컬 캐싱에 대한 생각을 나열해 기준으로 삼았습니다. #로컬 캐시

3-4. 입력마다 API 호출하지 않도록 API 호출 횟수를 줄이는 전략 수립 및 실행

  • 유저가 검색어 입력을 끝냈는지 알 수 없기 때문에 호출 시간을 지연하는 전략을 생각했습니다.
  • 입력을 끝내는 지점까지 기다렸다가 일정 시간 이벤트가 없으면 트리거하는 debounce가 가장 적절하다고 생각했습니다.
  • useDebounce 훅을 생성하여 필요한 곳에서 debounce를 사용할 수 있도록 구현했습니다.
export default function useDebounce<T>() {
  const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);

  return (CallBackFn: CallBackFnType<T>, delay: number) => {
    clearTimeout(timerRef.current);
    timerRef.current = setTimeout(() => {
      CallBackFn();
    }, delay);
  };
}
  • 실제 사용에서는 CallBackFnrefetchSickList를 넣고, 지연 시간은 1000ms로 설정했습니다.
export default function useSickSearch() {
  const debounce = useDebounce();

  useEffect(() => {
    const refetchSickList = async () => {
     // refetch 로직
    };
    debounce(() => refetchSickList(), 1000);
  }, [searchValue]);

  return { ... };
}
  • #api handling에서 api 관련 생각들을 정리해 참고했습니다.

3-5. API를 호출할 때 마다 console.info("calling api") 출력을 통해 콘솔창에서 API 호출 횟수 확인이 가능하도록 설정

05-assignments-calling api

  • api 요청 시 finally 블록에서 console.info를 처리하여 성공, 실패에 상관없이 호출 횟수 확인을 설정했습니다.

3-6. 키보드만으로 추천 검색어들로 이동 가능하도록 구현

06-1-assignments-arrow-key-move

  • 검색어 입력 후 추천 검색어 리스트가 나오면 아래 화살표 방향키를 이용해 검색어로 이동할 수 있습니다.
  • 키보드 이벤트 고민은 #move list using keyboard에 정리했습니다.

pre-onboarding-11th-4's People

Contributors

real-bird avatar

Watchers

 avatar

pre-onboarding-11th-4's Issues

검색어 추천 기능

  • 질환명 검색시 API 호출 통해서 검색어 추천
  • 검색어가 없을 시 “검색어 없음” 표출

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.