/javascript-youtube-classroom

자바스크립트와 외부 API를 이용해 구현 하는 나만의 유튜브 강의실

Primary LanguageJavaScriptMIT LicenseMIT

level1 - 나만의 유튜브 강의실

자바스크립트와 외부 API를 이용해 구현 하는 나만의 유튜브 강의실

template version

⚙️ Before Started

API 사용과 디바운스에 대한 추가적인 학습을 위해 시도해본 검색어 추천 기능이 들어가있습니다. 해당 기능에서 사용하는 API의 CORS 이슈 해결을 위해 cors-anywhere 라는 프록시 서버를 사용하였습니다.

검색어 추천 기능 활성화

해당 링크에서 Request temporary access to the demo server 버튼을 클릭하시면 검색어 추천 기능을 사용할 수 있습니다.


📍 학습 목표

이번 미션의 주요 목표는 웹 프론트엔드에서의 비동기에 대해 이해하고, API 통신을 처리할 때 고려해야 하는 다양한 문제를 직접 경험해보면서 해결 방법을 고민해보는 것입니다.

  • 실제 동작하는 API를 사용하며 기술적, UX적으로 겪게되는 문제를 해결해보는 경험
  • 무한 스크롤 구현

🎯 기능 요구사항

🔎 검색 모달

검색

  • 유튜브 검색 API를 사용해 내가 보고 싶은 영상들을 검색할 수 있다.
    • 입력 예외 처리
      • 입력된 검색어가 없거나, 공백만 입력된 경우 검색이 안되게 한다.
    • 엔터키를 눌러 검색할 수 있다.
    • 검색 버튼을 클릭해 검색할 수 있다.

검색 결과

  • 데이터를 불러오는 동안 현재 데이터를 불러오는 중임을 skeleton UI로 보여준다.
  • 검색 결과가 없는 경우 src/images/status/not_found.png 경로에 있는 결과 없음 이미지를 보여준다.
  • 최초 검색 결과는 10개까지만 불러온다.
  • 스크롤을 내려 추가 검색 결과를 10개씩 불러올 수 있다.
    • 검색 결과 화면에서 유저가 브라우저 스크롤 바를 끝까지 이동시켰을 경우, 그 다음 10개 아이템을 추가로 불러온다.
    • 스크롤 이벤트가 발생했을 시, Throttle을 적용한다.
  • 검색결과가 처리되기 전까진 skeleton UI로 로딩화면을 보여준다.

메인 페이지

  • 가장 처음에는 저장된 영상이 없으므로, 비어있다는 것을 사용자에게 알려주는 상태를 보여준다.
  • 이후 페이지를 방문했을 때 기본 메인 화면은 내가 볼 영상들의 리스트를 보여준다.
  • 영상 카드의 이모지 버튼을 클릭하여 아래와 같은 상태 변경이 가능해야 한다.
    • ✅ 본 영상으로 체크
    • 🗑️ 버튼으로 저장된 리스트에서 삭제할 수 있다. (삭제 시 사용자에게 정말 삭제할 것인지 물어봅니다.)
  • 본 영상, 볼 영상 버튼을 눌러 필터링 할 수 있다.
  • 반응형 웹: 유저가 사용하는 디바이스의 가로 길이에 따라 검색결과의 row 당 column 갯수를 변경한다.
  • 1280px 이상: 4개
  • 960px이상~1280px 미만: 3개
  • 600px이상~960px 미만: 2개
  • 600px 미만: 1개

저장

  • 내가 검색한 영상들의 저장할 수 있다.
    • 저장되는 영상의 형태는 json 데이터이다.
    • 실제로 동영상을 저장하는 것이 아니라, 영상 id를 Web Storage에 저장한다.
    • 중복된 video id의 경우 Web Storage에 저장하지 않는다.
    • 이미 저장된 영상이라면 저장 버튼이 보이지 않도록 한다.
    • 저장 가능한 최대 동영상의 갯수는 100개이다.

테스트 요구사항

  • 비즈니스 로직에 대한 단위 테스트를 Jest로 작성한다.

    • 입력 예외 처리
      • 입력된 검색어가 없거나, 공백만 입력된 경우 검색이 안되게 한다.
  • 핵심 플로우에 대한 E2E 테스트를 작성한다.

    • 검증이 필요하다고 생각되는 플로우를 1가지 설정하고 이에 대한 검증을 E2E 테스트로 진행한다.

UI

빌드

  • Webpack을 사용해 스스로 빌드 환경을 구축한다.

👏 Contributing

만약 미션 수행 중에 개선사항이 보인다면, 언제든 자유롭게 PR을 보내주세요.


🐞 Bug Report

버그를 발견한다면, Issues에 등록해주세요.


📝 License

This project is MIT licensed.