- NodeJS 16.14.2에서 실행하는 것을 권장합니다.
- .env 파일을 root 디렉토리에 만들고 다음과 같이 값을 넣으세요.
REACT_APP_GITHUB_TOKEN=<your-key>
npm ci
npm start
📦src
┣ 📂Components
┣ 📂Pages
┃ ┣ 📂Detail
┃ ┣ 📂Home
┃ ┣ 📂NotFound
┣ 📂Routes
┣ 📂lib
┃ ┣ 📂api
┃ ┣ 📂hooks
┃ ┣ 📂store
┃ ┗ 📂styles
저희는 동료 학습을 프로젝트 진행시 사용된 기술의 이해를 목적으로 진행하고 있습니다.
- 개인 프로젝트 구현 후 만남
- 과제 제출을 위한 토의
- 모르는 부분 교환 공부
- 다함께 파트 나누어서 Best 코드를 기반으로 Refactoring 진행
- 이해 안되는 부분 공부
1. Intersection Observer API 사용하여 무한 스크롤 구현하기
- scroll animation에 비해서 코드를 이해하는 것이 더 편리하다고 생각되어 사용하게 되었습니다.
- Intersection Observer는 뷰포트 상에 관찰하겠다고 결정한 컴포넌트(또는 HTML 태그)가 노출 되면 관찰 중인 entry.isIntersecting 값을 사용하여 Data Fetching을 제어할 수 있습니다.
해당 API를 사용하여 useIntersection라는 훅을 만들어 외부에서 관리하는 서버 상태값을 사용하여 Data Fetching을 제어하고 있습니다.
- 전역 상태를 관리하는 경우 router 내부가 아닌 외부에 Provider를 배치하여 관리의 용이성을 높였습니다.
- custom hook을 통해서 Context에서 관리하고 있는 상태를 컴포넌트에서 더욱 편하게 이용할 수 있습니다.
- context와 API 로직을 분리하고, API는 GithubRequestService 클래스를 만들어 관심사를 분리하여 사용하였습니다.
- issue를 Map 타입으로 적용하여 숫자 키를 사용할 수 있었고, 기존 키와 비교하면서 처음 불러오는 issue만 Github REST API에서 불러오며, 이미 불러왔던 issue는 재사용하도록 하였습니다.
- 에러의 경우, NotFound 페이지뿐만 아니라 다른 에러가 발생할 경우 별도 페이지를 제공하였습니다.
- 로딩의 경우, 데이터를 처음 불러올 때, 스크롤에 따라 데이터를 추가적으로 불러올 때 로딩 스피너를 보여줌으로써 사용자 편의성을 제공하였습니다.
- github rest api의 공식문서에서 추천하는 utilkit 인 octokit 패키지를 사용하여 config에 sort: "comments", state: "open" 값을 주도록 하여 공식문서가 안내하는 방법으로 데이터를 정렬하였습니다.
- 이 외에 자바스크립트의 filter함수나 map함수로 정렬하는 방식은 결국 클라이언트의 리소스를 사용하는 것이기에 octokit의 옵션을 주어 데이터를 요청하는 방식을 채택하였습니다.
- 미디어 쿼리를 이용해서 디바이스 크기에 따라 레이아웃이 변하도록 구현했습니다.
- styled-componenst의 theme provider에 device 사이즈의 값을 저장했습니다.
- children을 받아 전체 viewport를 감싸는 layout에 헤더를 배치하는 방식보다는, react-router-dom의 outlet 기능으로 헤더 이외 레이아웃 path에 해당하는 컴포넌트를 띄워주어 헤더 컴포넌트가 리렌더링이 되지 않도록 했습니다.
- @octokit/rest
- github Rest API Document에서 제안하고 있어 HTTP Client로 사용하게 되었습니다.
- styled-components
- 팀 원 모두가 JS-Style로 사용하기로 하여 라이브러리 통일을 위해 사용하였습니다.
- react-icons
- svg icon을 사용하기 위해 설치하여 사용하였습니다.
- react-markdown
- Markdown을 HTML 태그로 전환하기 위해 사용했습니다.
- react-syntax-highlighter
- markdown으로 작성된 코드 블록을 HTML로 전환해 CSS 스타일을 입혀 사용자가 code block을 보기 편하게 하기 위해 사용하였습니다.
- rehype-raw
- remark-gfm
- react-router-dom
- 리액트 상에서 SPA간에 페이지 이동을 보다 편리하게 설계하기 위해서 사용하였습니다.
- eslint
- prettier
- husky