Git Product home page Git Product logo

assignment2_team's Introduction

원티드 백엔드 프리온보딩 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

assignment2_team's People

Contributors

dongjay00 avatar epitone avatar raejun92 avatar sibadoge1 avatar

Forkers

raejun92

assignment2_team's Issues

[Test] 단위 테스트 작성

Description

  • jest를 활용한 단위 테스트 코드 작성

Progress

  • 사용자 회원가입
  • 사용자 로그인
  • 메뉴 생성
  • 메뉴 수정
  • 메뉴 삭제
  • 메뉴 상세 조회
  • 메뉴 전체 조회
  • 태그 생성
  • 태그 수정
  • 태그 삭제
  • 태그 조회
  • 태그 연결 추가
  • 태그 연결 삭제
  • 아이템 추가
  • 아이템 수정
  • 아이템 삭제

Related content

[Delete] 태그 삭제

Description

  • 태그 삭제 구현

Progress

  • 태그 삭제 구현
  • 관리자만 삭제할 수 있도록 설정

Related content

[Chore] 개발환경 셋팅

Description

  • 개발 시작 전, 개발환경을 셋팅합니다.

Progress

  • 코드 포맷팅을 위한 eslint, prettier 설치
  • 보안강화를 위한 helmet 설치
  • express에서 json 요청을 받을 수 있게 설정
  • 서버 재시작을 하지 않고도 코드 변화 감지하는 nodemon 설치
  • 깃허브 이슈 템플릿 생성
  • 깃허브 PR 템플릿 생성
  • MySQL 사용을 위한 RDS 설정
  • ORM 사용을 위한 sequelize 설정
  • 에러 핸들링 코드 수정

[Post] 태그 연결 추가

Description

  • 상품 메뉴에 태그 연결 추가 구현

Progress

  • 상품 메뉴에 태그 연결 추가 구현
  • null값이 파라미터로 들어왔을 경우 예외 처리

Related content

[Post] 상품 메뉴 생성

Description

상품 메뉴 생성

Progress

  • 토큰에 따라 권한이 달라지도록 설정(관리자일 경우에만 생성 가능)
  • 상품 메뉴 생성 기능 추가

Related content

[Put] 태그 수정

Description

  • 태그 수정 구현

Progress

  • 태그 수정 구현
  • 관리자만 수정할 수 있도록 설정

Related content

[Post] 상품 아이템 생성

Description

  • 상품 아이템 생성

Progress

  • 특정 메뉴에 아이템 생성
  • 관리자만 생성 가능하게 설정

Related content

[Post] 태그 생성

Description

태그 생성 구현

Progress

  • 태그 생성 구현
  • 관리자만 생성할 수 있도록 설정

Related content

[Delete] 태그 연결 삭제

Description

  • 상품 메뉴에 태그 연결 삭제 구현

Progress

  • 상품 메뉴에 태그 연결 삭제 구현
  • null값이 파라미터로 들어왔을 경우 예외 처리

Related content

[DB] DB 테이블 생성

Description

DB 테이블 생성

Progress

  • menu 테이블
  • item 테이블
  • tag 테이블
  • user 테이블

Related content

[Get] 상품 메뉴 상세 조회

Description

  • 상품 메뉴 상세 조회 구현

Progress

  • 파라미터 값과 DB 메뉴 id와 일치하는 경우 상세 조회

Related content

[Delete] 상품 아이템 삭제

Description

  • 상품 아이템 삭제 구현

Progress

  • 상품 아이템 삭제 구현
  • 관리자만 삭제 가능하도록 구현

Related content

[DB] DB Service 파트 구현

Description

DB Service 파트 구현

Progress

  • User Service 구현
  • Menu Service 구현
  • Item Service 구현
  • Tag Service 구현

Related content

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.