이 레포지토리는 원티드 프리온보딩 백엔드 코스 2차 과제를 위해 만들어졌습니다.
- 일정 : 2021년 11월 4일(목) 오후 6시 ~ 11월 6일(토) 오전 10시
팀장 박상수 | 팀원 김성연 | 팀원 최준호 |
---|---|---|
blog: Plus Ultra github: epitone |
blog: sudocorp github: SibaDoge1 |
blog: raejun92.log github: raejun92 |
단위 테스트 | DevOps, API, DB | API |
프로젝트 회고 | 프로젝트 회고 | 프로젝트 회고 |
팀원 어유선 | 팀원 김현길 | 팀원 이동훈 |
---|---|---|
blog: Makkiato github: Makkiato |
blog: gusrlf14 github: hyunghilkim |
blog: dongjay00.log github: dongjay00 |
통합 테스트 | API | DB |
프로젝트 회고 | 프로젝트 회고 | 프로젝트 회고 |
- Swagger나 Postman을 이용하여 API 테스트 가능하도록 구현
- README 작성
- 프로젝트 빌드, 자세한 실행 방법 명시
- 구현 방법과 이유에 대한 간략한 설명
- 완료된 시스템이 배포된 서버의 주소
- Swagger나 Postman을 통한 API 테스트할때 필요한 상세 방법
- 해당 과제를 진행하면서 회고 내용 블로그 포스팅
- Database RDBMS
- JWT 인증방식 사용
- 서비스 실행 시 데이터베이스 또는 In Memory 상에 유저와 상품 최소한 5개를 미리 생성
- Request시 Header에 Authorization 키를 체크
- Authorization 키의 값이 없거나 인증 실패시 적절한 Error Handling
- 상품 추가/수정/삭제는 admin 권한을 가진 사용자만 이용 가능
- 상품 조회는 하나 또는 전체목록을 조회할 수 있으며, 전체목록은 페이징 기능 존재
- 한 페이지 당 아이템 수 5개
- 사용자는 상품 조회만 가능
- 관리자만 상품 추가/수정/삭제
- 상품 관리 API 개발시 적절한 Error Handling
- 유닛 테스트 구현
- Node.js, express, MySQL, sequelize를 활용해서 CRUD API, 회원가입 로그인 API, 상품 CRUD를 구현했습니다.
- 인증, 인가를 위해 JWT를 활용했습니다.
- 코드 컨벤션, 커밋 컨벤션, Git Flow를 지켜가며 작업했습니다.
- Github Project, 마일스톤을 활용해서 백로그, 이슈 관리를 진행했습니다.
- 계층 분리를 통해 코드의 가독성을 높였습니다.
- 리팩토링을 통해 가독성을 높이고, 유지보수를 편하게 하기 위해 노력 했습니다.
- 유닛테스트와 통합테스트를 개발하여 개발자가 의도한대로 로직이 동작하는지 명확하게 알 수 있고 로직에 대해 보증하기 위해 노력했습니다.
- 회원가입시 password 같은 민감정보는 단방향 해쉬 알고리즘인
crypto
를 이용해서 암호화 하여 database에 저장하였습니다. - 로그인이 성공적으로 완료되면, user정보를 토큰으로 반환할때, 양방향 해쉬 알고리즘인
JWT
를 사용해서 응답을 하였습니다.
- 관리자와 사용자를 구분하여, 일반 사용자는 상품 조회만 가능하게 제한하고, 관리자는 상품 추가, 수정, 삭제 권한을 주어 구현 하였습니다.
- 상품(Menu) 조회시, items , tags를 함께 조회가 가능하게 구현 하였습니다.
- 상품 페이지를 불러올때 1page당 limit5로 하여 페이징를 구현 하였습니다.
- 클라이언트 요청시 정보 누락 및 부족으로 인한 에러 처리, 인증관련 에러처리를 구현 하였습니다.
- jest를 활용해서 단위 테스트를 구현했습니다.
- faker.js 라이브러리를 활용해서 seed data를 생성했습니다.
- 통합 테스트를 구현해서 실제 사용자와 관리자가 보일만한 패턴을 시나리오로 작성해서 활용하고자 노력했습니다.
- 자바스크립트 자체 내장 Error 클래스를 상속 받아서, 커스텀 에러를 생성해서 관리했습니다.
-
레포지토리를 clone 받거나, 압축을 해제한 후 npm install을 통해 환경 셋팅을 진행합니다.
-
npm start를 통해 서버를 구동합니다.
-
src 폴더에 .env 파일을 설정해서, 환경변수를 설정합니다.
-
npm start로 서버를 구동시키고, npm test를 입력하면 단위 테스트가 가능합니다.
-
.env 파일 설정 방법
RDS_DATABASE= RDS_USERNAME= RDS_PASSWORD= RDS_HOSTNAME= RDS_PORT= PORT= JWT_SECERT= JWT_ALGO= ADMIN_USER= ADMIN_PASSWORD= HOST=
- Postman을 활용하여 API 작동 테스트를 진행했습니다.
- 배포된 서버 주소 및 자세한 API 명세는 아래에서 확인 가능합니다.
- 🗂 API Description Link
📦src
┣ 📂bin
┃ ┗ 📜www.js
┣ 📂configs
┃ ┣ 📜db.js
┃ ┣ 📜index.js
┃ ┗ 📜secretKey.js
┣ 📂controllers
┃ ┣ 📜itemController.js
┃ ┣ 📜menuController.js
┃ ┣ 📜tagController.js
┃ ┗ 📜userController.js
┣ 📂globals
┃ ┣ 📜index.js
┃ ┣ 📜responseMessage.js
┃ ┣ 📜routes.js
┃ ┗ 📜statusCode.js
┣ 📂libs
┃ ┣ 📜encryption.js
┃ ┗ 📜jwt.js
┣ 📂middlewares
┃ ┗ 📜auth.js
┣ 📂models
┃ ┣ 📜index.js
┃ ┣ 📜item.js
┃ ┣ 📜menu.js
┃ ┣ 📜tag.js
┃ ┗ 📜user.js
┣ 📂routes
┃ ┣ 📜globalRouter.js
┃ ┣ 📜index.js
┃ ┣ 📜menuRouter.js
┃ ┣ 📜tagRouter.js
┃ ┣ 📜tokenRouter.js
┃ ┗ 📜userRouter.js
┣ 📂services
┃ ┣ 📜itemService.js
┃ ┣ 📜menuService.js
┃ ┣ 📜tagService.js
┃ ┗ 📜userService.js
┣ 📂test
┃ ┣ 📂Menu
┃ ┃ ┣ 📜createMenu.test.js
┃ ┃ ┣ 📜deleteMenu.test.js
┃ ┃ ┣ 📜getMenu.test.js
┃ ┃ ┣ 📜getMenuList.test.js
┃ ┃ ┗ 📜putMenu.test.js
┃ ┣ 📂Tag
┃ ┃ ┣ 📜deleteTag.test.js
┃ ┃ ┣ 📜getTag.test.js
┃ ┃ ┣ 📜postTag.test.js
┃ ┃ ┗ 📜putTag.test.js
┃ ┗ 📂User
┃ ┃ ┣ 📜signin.test.js
┃ ┃ ┗ 📜signup.test.js
┣ 📂utils
┃ ┣ 📂errors
┃ ┃ ┣ 📜errors.js
┃ ┃ ┣ 📜menuError.js
┃ ┃ ┣ 📜tagError.js
┃ ┃ ┗ 📜userError.js
┃ ┣ 📜index.js
┃ ┣ 📜logger.js
┃ ┗ 📜resFormatter.js
┣ 📜.eslintrc.json
┣ 📜.gitignore
┣ 📜.prettierrc.json
┣ 📜app.js
┗ 📜package.json