Skip to content

Another-Glass/Assignment2_Team

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 

Repository files navigation

원티드 백엔드 프리온보딩 2차 과제 - 프레시코드

👨‍💻 원티드 프리온보딩 어나더글라스 팀입니다.

6명의 안경잡이 개발자들의 시선과 관점이 담긴 과제입니다.

무던히 포기하지 않고 견디고 견뎠던 그 시간들이 변함없는 단 하나의 해답임을 믿습니다.

PRs Welcome Hits issues






🎤 소개

이 레포지토리는 원티드 프리온보딩 백엔드 코스 2차 과제를 위해 만들어졌습니다.

  • 일정 : 2021년 11월 4일(목) 오후 6시 ~ 11월 6일(토) 오전 10시


🧑🏻‍💻 팀원 소개

팀장 박상수 팀원 김성연 팀원 최준호
blog: Plus Ultra
github: epitone
blog: sudocorp
github: SibaDoge1
blog: raejun92.log
github: raejun92
sprint2 sprint2 sprint2
단위 테스트 DevOps, API, DB API
프로젝트 회고 프로젝트 회고 프로젝트 회고


팀원 어유선 팀원 김현길 팀원 이동훈
blog: Makkiato
github: Makkiato
blog: gusrlf14
github: hyunghilkim
blog: dongjay00.log
github: dongjay00
sprint2 sprint2 sprint2
통합 테스트 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를 사용해서 응답을 하였습니다.

[상품 CRUD]

  • 관리자와 사용자를 구분하여, 일반 사용자는 상품 조회만 가능하게 제한하고, 관리자는 상품 추가, 수정, 삭제 권한을 주어 구현 하였습니다.
  • 상품(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=
    


🗂 과제 확인 및 평가 API 명세서

  • Postman을 활용하여 API 작동 테스트를 진행했습니다.
  • 배포된 서버 주소 및 자세한 API 명세는 아래에서 확인 가능합니다.
  • 🗂 API Description Link


😎 컨벤션 설정



🛠 Dependencies




🌲 File Tree



📦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