목적 : 배포된 프로젝트를 통하여, 배운 내용을 바로 적용시켜 고도화해보거나, 추가적인 공부를 위한 용도
- MongoDB Board 개인 스터디 내용을 활용하여, MySQL 시스템으로 전환하였고, 현재는 팀 프로젝트로까지 발전했습니다.
- Passport 로그인 방식 -> JWT 로그인 방식으로 전환
- Bootstrap 4.6.2을 활용한 페이지 구성 & 프론트와 백엔드의 통신과정 이해
1. JWT를 활용한 로그인, 회원가입
2. Access 토큰 이외 Refresh 토큰을 추가하여 보안 강화
3. 로컬 스토리지를 활용한 토큰 저장 & 로그아웃
4. MD5 해시 함수를 활용하여 사용자 비밀번호 단방향 암호화
5. 기본적인 게시판 CRUD
6. 페이징 기능 & 해당 페이지에 보여줄 게시글 수 지정 가능
7. (제목, 내용), (제목), (내용), (작성자)의 종류로 게시글 검색 가능
8. 해당 게시글 조회 시, 조회 수 증가 & 추천 기능
9. 해당 게시글과 현재 로그인된 사용자를 비교하여 특정 권한 지정
10. 주소 상의 쿼리 스트링을 활용하여, 이전 페이지 기억
11. 유저 프로필 변경 기능
12. CodeDeploy, CodePipeLine을 통한 CI/CD 구현
HOME
GET / - 홈 화면 렌더링
GET /about - 홈페이지에 대한 설명 페이지 렌더링
USER
POST /user/login - 로그인 post 요청
POST /user/register - 회원가입 post 요청
GET /user/profile - 프로필 열람 시, 유저 토큰 검사 요청
PATCH /user/profile - 프로필 편집
GET /user/token/refresh - refresh 토큰 받아서, access token 재발급
GET /user/login - 로그인 페이지 렌더링
GET /user/register - 회원가입 페이지 렌더링
GET /user/profile/output - 프로필 페이지 렌더링
BOARD
GET /board - 조건에 따른 글 데이터 전달
위 메뉴 'Board'를 클릭 시, /board API 호출
글 ID, 제목, 조회 수, 작성자, 작성 시간 등을 표시할 수 있다.
글의 (제목, 글),(제목),(글),(작성자)로 게시글을 검색할 수 있다.
페이지가 존재하고, 페이지당 표시될 게시글의 수를 정할 수 있다.
New 버튼 클릭 시, 브라우저 내 로컬 스토리지에서 토큰 검사 (토큰이 없을 시, 로그인 화면으로 이동)
프론트로부터 page, limit, Search 종류 등을 전달받아, 해당 조건에 맞는 게시글로 응답
page 값이 1000 이상일 시, 에러 메시지 반환
page 값이 1000미만이고, 최대 페이지를 넘는 경우, 최대 페이지로 반환
limit 값이 5, 10, 20 이외의 값일 시, 에러 메시지 반환
POST /board - 글 생성
GET /board/:id - id 번호의 글 페이지 렌더링
DELETE /board/:id - id 번호의 글 삭제
PATCH /board/:id/edit - id 번호의 글 edit 후 post
POST /board/:id/recommand - id 번호의 글 추천
GET /board/:id/auth - 해당 글 작성자와 로그인 중인 사용자 일치 확인(인증)
프론트로부터 토큰을 전달받고, 토큰 검사 후, 주소상 게시글의 id가 토큰에 존재하는 사용자가 작성한 글이 맞는지 확인
그 후, 해당 글 페이지의 [back] or [back, edit, delete] button 출력여부 결정
GET /board/post/new - 글 생성 페이지 렌더링
GET /board/:id/edit - id 번호의 글 데이터와 함께, edit 페이지 렌더링
Main
| 홈 화면 | 로그인 | 회원가입 | 프로필 |
Board
| 게시판 메인 | 게시글 제한 | 글 & 제목 검색 | 유저 검색 |
Board Content
| 게시글 생성 | 게시글 읽기 | 게시글 수정 | 게시글 삭제 |
"dependencies": {
"@sentry/node": "^7.49.0",
"aws-sdk": "^2.1338.0",
"bcrypt": "^5.0.1",
"body-parser": "^1.20.0",
"config": "^3.3.7",
"ejs": "^3.1.8",
"express": "^4.18.1",
"jsonwebtoken": "^8.5.1",
"method-override": "^3.0.0",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1",
"multer-s3": "^2.10.0",
"mysql2": "^2.3.3",
"sequelize": "^6.21.3",
"sequelize-cli": "^6.4.1",
"winston": "^3.8.2",
"winston-daily-rotate-file": "^4.7.1"
},
"devDependencies": {
"eslint": "^8.36.0",
"eslint-config-prettier": "^8.7.0",
"eslint-plugin-prettier": "^4.2.1",
"prettier": "^2.8.4",
"standard-version": "^9.5.0"
}