당근마켓 클론코딩 - 어플

20210530_044014 (1)

당근마켓 클론코딩 소개

  • 당근마켓 클론코딩을 진행
  • 중고거래 페이지, 동네생활 페이지 완성
  • 게시글 및 댓글 작성, 수정, 삭제가 가능한 커뮤니티 구현

개요

  • 이름: 당근마켓 클론코딩
  • 기간: 2021.04.02 ~ 2021.04.08
  • 팀원
    • Front-end(React-Native): 김지하, 신일섭
    • Back-end(Node.js): 조상균, 이총명

개발 환경

  • Server: AWS EC2(Ubuntu 20.04 LTS)
  • Framework: Express(Node.js)
  • Database: MongoDB

주요 라이브러리

mongoose, jsonwebtoken, multer, sanitize-html, dotenv

주요 기능

1. 로그인

  • 아이디, 패스워드를 입력하여 로그인 할 수 있고 로그아웃 버튼을 눌러서 나올수 있습니다. (JWT)

2. 회원가입

  • 아이디, 비밀번호, 닉네임을 입력하고 회원가입을 진행할 수 있습니다.

3. 동네 생활페이지 및 중고거래 페이지

  • 다른사람의 글 목록을 확인하고 클릭해서 상세 내용을 확인할 수 있습니다.

4. 글 작성, 수정, 삭제

  • 로그인한 사용자는 글을 작성하여 게시할 수 있고 자신의 글만 수정 및 삭제가 가능합니다

5. 댓글 작성, 수정, 삭제

  • 로그인한 사용자는 댓글을 달 수 있고 다른 사람들의 댓글 리스트를 확인 가능합니다.

DB 설계

API 설계

기능 Method URL Request Params / Body, Response
접속자 정보 GET /user userId, nickname, id, area
회원가입 요청 POST / msg : "empty"
로그인 요청 POST /auth msg : "success" or "fail"
글 목록 GET /exchange posts:[{ exchangeId, nickname, title, price, contents, loveCount, area, beforeTime, soldState}]..
중고거래 글 정보 GET /exchange exchangeId, title, price, beforeTime , nickname, loveCount, area, contents , img:[이미지1,2...], soldState
판매상태 변경 PATCH /exchange/:postId/state
글 등록 요청 POST /exchange
글 삭제 요청 DELETE /exchange/:exchangeId
글 수정 요청 PATCH /exchange/:exchangeId
글 목록 GET /town?lastId=<마지막글ID> status, boards: [{townId, nickname, area, contents, category, date, commentCount, images: [], userId },.....
글 등록 요청 POST /town
동네생활 글 정보 GET /town/:townId status, board: { townId, nickname, beforeTime, area, commentCount, contents, images: []}
글 삭제 요청 DELETE /town:townId
글 수정 요청 PATCH /town:townId
댓글 목록 GET /comment/:townId status, comments: [{ commentId, townId, commentContents, nickname, userId },...
댓글 추가 POST /comment/:townId
댓글 삭제 DELETE /comment/:commentId
프로필 확인 GET /profile {status, profileData :[{nickname, area, userid}]
이미지 업로드 요청 POST /image {status, images:["",""]}

힘들었던 점 및 개선 사항

  • 크로스 사이트 스크립팅(XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트관리자가 아닌 사용자가 웹페이지에 악성 스크립트를 삽입할 수 있는 취약점입니다. 그래서 sanitize-html라이브러리를 사용하여 데이터의 입력과 출력이 필요한 부분에 스크립트 방지 처리를 하여 보안적인 부분을 개선하였습니다.
  • 로그인, 회원가입을 JWT 인증으로 구현하면서 확실하게 이해할 수 있는 시간이었습니다. 사용자는 아이디와 패스워드를 입력하고 로그인을 요청합니다. 이때 서버는 DB와 해당 사용자가 존재한다면 토큰을 발급하고 로그인 요청을 승인합니다. 이때, 로그인을 한 사용자만 글을 쓰고, 글을 작성한 사용자만 해당 글에 대해서 수정, 삭제를 할 수 있도록 하기 위해서 미들웨어 형식으로 처리하여 해당 사용자를 res.locals.user로 정보를 찾은 후 해결하였습니다.
  • 각 페이지별로 게시글을 한번에 보여주면 사용자가 아래로 스크롤 할 때 불편함을 느낄 수 있었습니다. 그래서 쿼리 스트링으로 마지막으로 불러온 글의 ID를 찾은 후, 무한 스크롤이 첫 페이지일 경우, 무한 스크롤 이전 페이지가 있을 경우 분기처리를 해서 구현 했습니다. 그럼으로써 사용자가 페이지 하단에 다다르면 더 많은 항목을 로딩하면서 서버에서 받은 데이터를 웹에서 렌더링 하는 속도가 빨라졌습니다.

프로젝트 상세 설명 페이지

Front-End(React) 코드