차량 대여를 위해 차량 목록을 불러오는 사이트입니다.
전역 상태 관리는 React에 내장되어있는 Context API를 사용했고,
스타일 라이브러리는 Styled-components를 사용했습니다.
과제에 사용된 API 상세 설명입니다.
과제에서 요구사항으로 주어진 Figma입니다.
git clone [email protected]:crystal993/pre-onboarding-7th-2-2-0.git
yarn install
yarn start
open http://localhost:3000
- 디렉토리 구조
📂src
| 📄App.js
| 📄index.js
|
+---📂api
| 📄 apis.js
| 📄 axiosInstance.js
| 📄 carService.js
|
+---📂assets
| \---📂icons
| 📄icon_back.svg
|
+---📂components
| +---📂detail
| | 📄DetailContainer.jsx
| | 📄DetailInfoBar.jsx
| | 📄DetailSectionBar.jsx
| |
| +---📂elements
| | 📄Badge.jsx
| | 📄Button.jsx
| | 📄MsgBox.jsx
| |
| +---📂layout
| | 📄Header.jsx
| | 📄Layout.jsx
| |
| +---📂main
| | 📄CarItem.jsx
| | 📄CarList.jsx
| | 📄FilteringBar.jsx
| | 📄SwiperTags.jsx
| |
| \---📂metaTag
| 📄SEOMetaTag.jsx
|
+---📂context
| 📄actionTypes.js
| 📄CarListProvider.js
| 📄CarListReducer.js
|
+---📂pages
| 📄Detail.jsx
| 📄Main.jsx
| 📄NotFound.jsx
|
+---📂router
| 📄Routers.jsx
|
+---📂styles
| 📄GlobalStyle.jsx
| 📄theme.js
|
\---📂utils
+---📂constant
| 📄fuelTypeOption.js
| 📄segmentOption.js
|
\---📂function
📄convertAmount.js
📄convertOption.js
📄convertUsableDate.js
📄IsCreatedWithinDay.js
- api : CarService 에서 컴포넌트 단에서 함수 호출만 가능하도록 최대한 관심사를 분리했습니다.
- context : context에서 사용하는 actionTypes, CarListProvider, CarListReducer 로 분리해서 썼습니다.
- utils : 상수와 자주 쓰이는 함수들을 따로 분리해놨습니다.
커밋 규칙
코딩 컨벤션 규칙
- 컴포넌트의 ID사용은 지양한다.
- react의 state는 여러개 사용시 최소 집합을 찾아 사용한다.
- 컴포넌트의 이벤트에서 불필요한 익명함수를 사용하지 않는다. (예시: 함수의 인자가 event 하나인 경우)
- 코드를 설명하는 주석은 가급적 사용하지 않는다.
- 상수는 영문 대문자 스네이크 표기법(Snake case)를 사용한다.(예시: SYMBOLIC_CONSTANTS)
- 반환 값이 불린인 함수는 'is'로 시작한다
- const와 let은 사용 시점에 선언 및 할당한다.
- 함수는 사용 전에 선언해야 하며, 함수 선언문은 변수 선언문 다음에 오도록 한다.
- 이벤트 핸들러는 'on'으로 시작한다.
- 한 줄짜리 블록일 경우라도 {}를 생략하지 않으며 명확히 줄 바꿈 하여 사용한다.
Lint, Formatter 규칙
printWidth: 100, // printWidth default 80 => 100 으로 변경
singleQuote: true, // "" => ''
arrowParens: 'avoid', // arrow function parameter가 하나일 경우 괄호 생략
printWidth: 100, // printWidth default 80 => 100 으로 변경
singleQuote: true, // "" => ''
arrowParens: 'avoid', // arrow function parameter가 하나일 경우 괄호 생략
- eslint
- eslint-config-prettier
- husky
- prettier
- react-router-dom
- axios
- styled-components
- Figma 상의 디자인 및 기능 구현
- 모바일 웹 기준으로 제작
- 450px ~ 360px까지 고려해서 제작
- 필수 요구 사항
- Figma 상의 디자인 및 기능 구현
Chrome | Whale |
---|---|
- 차량 리스트
차량이 없을 때 | 차량을 불러올 때 |
---|---|
- CarList.jsx
B2C-Car-Sharing/src/components/main/CarList.jsx
Lines 8 to 42 in 57ac898
차량을 불러올 때와 차량이 없을 때 텍스트를 다르게 해서 MsgBox
컴포넌트를 재사용했습니다.
Context API에서 전역으로 관리하는 isloading 변수가 true일 때 불러오는 중을 표시하고,
Context API에서 전역으로 관리하는 carList 변수의 배열의 길이가 0일 때 차량이 없습니다를 표시합니다.
B2C-Car-Sharing/src/components/main/CarItem.jsx
Lines 8 to 29 in 57ac898
B2C-Car-Sharing/src/components/metaTag/SEOMetaTag.jsx
Lines 1 to 22 in 57ac898
- react-helmet을 적용하면 메타태그들과 title이 동적으로 바뀌는 것을 볼 수 있었습니다.
- SNS 공유 할 때는 SNS 크롤러 봇이 CSR의 메타태그들을 인식하지 못했습니다.
- nextjs나 cloudfront + Lambda로 SEO를 적용해볼 예정입니다.
B2C-Car-Sharing/src/components/main/SwiperTags.jsx
Lines 10 to 43 in 57ac898
- Swiper.js 리액트 버전을 사용하여 구현하였습니다.
- 한 슬라이드에 5개가 보이도록 구현하고, 초기값을 3번째 인덱스에 존재하는 태그로 지정해주었습니다.
실제로 서버 API로 응답받는 데이터와 요구사항으로 주어지는 화면상의 데이터 형태가 달랐습니다.
사용자가 보기 쉽게 구현해야만 했습니다.
B2C-Car-Sharing/src/utils/constant/segmentOption.js
Lines 1 to 9 in 57ac898
- option을 value, name으로 나눠서 API로 받아오는 값을 value, 화면상에 보여지는 값을 name으로 분류하여 파일을 만들어서 따로 관리하였습니다.
B2C-Car-Sharing/src/utils/function/convertOption.js
Lines 1 to 22 in 57ac898
- segment와 fuelType option의 value를 이름으로 변환해주는 함수이다.
- 서버에서 받은 값을 화면 상에 UI로 보기 쉽게 변환해주는 함수입니다.
- segVal은 서버에서 받아오는 segment값이므로 segmentOption 배열에 filter로 value와 일치하면 name을 반환하게끔 코드를 짰습니다.
B2C-Car-Sharing/src/utils/function/convertAmount.js
Lines 1 to 3 in 57ac898
B2C-Car-Sharing/src/utils/function/convertUsableDate.js
Lines 1 to 9 in 57ac898
B2C-Car-Sharing/src/styles/GlobalStyle.jsx
Lines 1 to 33 in 57ac898
- styled-reset을 이용해서 전체 style을 초기화 시켰습니다.
- :root로 전체 font-size를 10px로 주고, 10px이 1rem이 되도록 만들었습니다.
- 과제 요구사항으로 주어진 Inter font를 적용했습니다.
:root {
font-size: 10px;
}
B2C-Car-Sharing/src/styles/theme.js
Lines 1 to 12 in 57ac898
- 과제 요구사항으로 주어진 색상과 반응형 크기를 Theme에서 관리하여 styled-components에서 props로 받아서 사용할 수 있도록 했습니다.
👑 권준 | 김경훈 | 김수정 |
@jun-05 | @tirhande | @crystal993 |
송슬기 | 오나래 | 이창훈 | 전이진 |
@songseul | @NR0617 | @anotheranotherhoon | @pongdang |