- 회원 정보 & 게시판 관리 RESTful API 서버가 오픈되었습니다!
22.09.01 ~ 22.09.05
원티드 백엔드 프리온보딩 1차 과제입니다. backend
회원 정보 내용을 포함하는 테이블을 설계하고 다음과 같은 기능을 제공하는 RESTful API 서버 개발을 목적으로 구현하였습니다.
- 공지사항, 자유게시판, 운영 게시판
- 회원 등급에 따른 게시판 기능 접근제어
- 회원가입, 로그인, 회원 탈퇴
- 이용 통계집계
nodejs
express.js
sequelize
mySql
swagger
├── README.md
├── components
│ ├── posts
│ │ ├── postApi.js
│ │ ├── postService.js
│ │ └── postModel.js
│ └── users
├── .idea
├── config
├── errors
├── middlewares
├── models
├── seeders
├── swagger
│
├── .gitignore
├── .eslintrc.json
├── .prettierrc.json
├── app.js
├── index.js
├── package-lock.json
└── package.json
-
components :
- posts : posts 도메인의 요청에 대한 소스코드들이 모여있습니다.
- postApi.js : request에대한 라우터 설정과 postService 호출, response를 담당합니다.
- postService.js : 서비스로직 적용과 ORM을 통한 DB통신을 담당합니다.
- postModel.js : post 테이블이 작성되어있습니다.
- users : users 도메인의 요청에 대한 소스코드들이 모여있습니다.
- posts : posts 도메인의 요청에 대한 소스코드들이 모여있습니다.
-
.idea :
-
config : 프로젝트에 필요한 환경변수들이 모여있습니다.
-
errors : 프로젝트에 사용될 httpError클래스들이 있습니다.
-
middlewares : 컨트롤러에 닿기 전에 반복되는 로직을 모듈화 해 놓은 폴더입니다.(Error로거 & 핸들러, 토큰검사기)
-
models : Sequelize connection에 필요한 로직이 들어있습니다.
-
seeders : 정적데이터를 생성하는 seeder파일들이 모여있습니다.
-
swagger :
- .eslintrc.json : 협업시 동일한 eslint 설정을위해 적용될 json 형태의 파일입니다.
- .prettierrc.json : 협업시 동일한 prettier 설정을위해 적용될 json 형태의 파일입니다.
- app.js : 서버를 필요한 각종 소스코드와 미들웨어들을 조합합니다.
- index.js :
master
stage
feature
세 종류의 브랜치를 기본으로 사용합니다.
- 이슈를 선정하고 이슈번호에 맞는
feature/issueNumber
브랜치를 만들어 기능을 개발합니다. - 구현이 끝나면
stage
에 PR합니다. 이때, 머지를 위해선 2인 이상의 리뷰가 필요합니다. - 각 기능이 병합된
stage
에서master
로 병합합니다.
회원가입
- 사용자는 이름, id(username), 성별, 생년월일, 전화번호, 비밀번호를 입력해 회원가입을 시도합니다.
- 이때 id(username) 또는 전화번호가 기존 DB에 존재한다면 회원가입이 되지 않습니다.
BadRequestError
- 사용자가 입력한 비밀번호는
bcrypt
를 이용해 암호화된 상태로 DB에 저장됩니다. - 사용자가 회원가입한 시간(
created_at
)이 저장되며, 논리삭제를 위한deleted_at
은 null로 초기화됩니다.
로그인
- 회원가입시에 입력한 id(username), 비밀번호를 통해 로그인을 시도합니다.
- 암호화된 상태의 패스워드를 복호화하지 않고 비교합니다.
- 사용자가 입력한 id(username)이 DB에 없거나, 비밀번호가 다르다면
BadRequestError
를 반환합니다. - 로그인이 완료된 사용자는 일정 시간만 사용 가능한 JWT token 값을 배정받게 됩니다.
회원탈퇴
- 회원가입시 입력한 id(username)을 통해 DB에서 사용자 정보를 조회합니다.
- ORM 상에서 destroy 하면
deleted_at
칼럼에 현재 시간 정보가 저장됩니다. deleted_at
이 null이 아니라면 DB상에서 조회가 되지 않습니다. 논리적으로 탈퇴가 구현됩니다.
회원 권한 변경
- 회원가입시 입력한 id(username)과 변경될 role 정보를 입력합니다.
- 사용자의 역할이 기존 user에서 입력한 role로 변경됩니다.
게시판은 총 세 가지(운영, 공지, 자유 게시판)로 구분됩니다.
- 유저는 자유 게시판에서 글을 작성, 조회, 수정, 삭제를 진행할 수 있습니다.
- 유저는 공지 게시판을 조회할 수는 있지만, 공지 게시판에 글을 작성, 수정, 삭제를 할 수는 없습니다.
- 운영자는 운영, 공지, 자유 게시판의 글을 작성, 조회, 수정, 삭제할 수 있습니다.
권한 처리를 제외하면, 나머지 로직이 같기 때문에 자유 게시판 기준으로 설명합니다.
게시판 내 여러 건의 게시물 조회
- userAuthChecker를 이용해 게시판 이용 권한이 있는 사용자를 판별합니다.
- 로그인한 유저가 게시판 이용 권한이 있는 사용자라면, {user, postType, skip, limit}을 서비스 로직에 보내 페이징 처리된 검색 결과를 가져옵니다.
- 검색된 결과를 json 형식으로 반환합니다.
게시판 내 게시글 작성
- userAuthChecker를 이용해 게시판 이용 권한이 있는 사용자를 판별합니다.
- 로그인한 유저가 게시판 이용 권한이 있는 사용자라면, {post, user}를 서비스 로직에 보내 작성 결과를 가져옵니다.
- 작성이 성공했다면 201 메시지를 보내며 게시글이 등록됩니다.
게시판 내 단건 게시물 조회
- userAuthChecker를 이용해 게시판 이용 권한이 있는 사용자를 판별합니다.
- 로그인한 유저가 게시판 이용 권한이 있는 사용자라면, {postId, user}를 서비스 로직에 보내 해당하는 페이지 객체를 가져옵니다.
- 검색된 결과를 json 형식으로 반환합니다.
게시판 내 게시글 수정
- userAuthChecker를 이용해 게시판 이용 권한이 있는 사용자를 판별합니다.
- 로그인한 유저가 게시판 이용 권한이 있는 사용자라면, {postId, newPost, user}를 서비스 로직에 보내 작성자 id와 수정 요청 id를 비교합니다.
- 작성자 id와 삭제 요청자 id가 같다면, 200(OK) 메시지를 보내며 게시글이 수정됩니다.
게시판 내 게시글 삭제
- userAuthChecker를 이용해 게시판 이용 권한이 있는 사용자를 판별합니다.
- 로그인한 유저가 게시판 이용 권한이 있는 사용자라면, {postId, user}를 서비스 로직에 보내 작성자 id와 삭제 요청 id를 비교합니다.
- 작성자 id와 삭제 요청자 id가 같다면, 200(OK) 메시지를 보내며 게시글이 삭제됩니다.
npm install
npm start
npm run dev // 개발자용
npm run swagger // swagger용
fix:
버그가 발생해 코드를 고칠 때
feat:
기능을 추가할 때
build:
빌드할 때
chore:
설정 변경 발생시(단순오타 등은 refactor 😊)
docs:
문서 수정(마크다운 파일, swagger doc 등)
style:
코드 스타일 수정(개행 등)
refactor:
코드의 기능변화 없이 수정할 때
test:
테스트파일 관련 작업(jest)
예시)
/**
* @description 유저의 게시글 수정, 삭제 권한을 확인합니다.
* @param {string} userRole 유저의 권한
* @param {number} expectedUserId 현재 접속한 유저의 id
* @param {number} actualUserId 게시글을 작성한 유저의 id
* @throws {ForbiddenError} 유저는 해당 게시글 수정, 삭제 권한이 없음
* @returns {boolean} 게시글 수정, 삭제 권한을 확인 결과
*/