Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[김현우] Sprint 10 #71

Open
wants to merge 3 commits into
base: express-김현우
Choose a base branch
from

Conversation

Accreditus
Copy link
Collaborator

Pull Request: Weekly Mission for Backend Development

요구사항

기본

  • GitHub에 위클리 미션 PR을 생성합니다.
  • React.js 혹은 Next.js를 사용하여 진행합니다.
  • RESTful API를 설계하고 백엔드 코드를 변경합니다.
  • (풀스택) 설계한 백엔드 코드에 맞게 프론트엔드 코드를 수정합니다.
  • https://panda-market-api.vercel.app의 API를 본인의 백엔드 API 코드로 변경합니다.
  • (백엔드) 프론트엔드 코드에 맞게 백엔드 코드를 수정합니다.
  • Swagger를 추가하여 API 명세 문서를 생성합니다.

프론트엔드 구현 요구사항

중고마켓 페이지 (Secondhand Market Page)

  • 디폴트 이미지로 처리한 이미지를 실제 Product Get API에서 가져온 이미지로 변경합니다.
  • 좋아요 순 정렬 기능을 추가합니다.
  • 베스트 상품 기능 추가: 가장 많이 좋아요를 받은 상품 최대 4개 조회 가능.

상품 등록하기 페이지

  • 상품 이미지 등록 기능 구현: 파일 선택 후 이미지 업로드 및 미리보기 기능. 최대 3개 이미지 등록 가능.
  • 상품 이미지 수정 기능 추가.
  • 상품 등록 성공 시 중고마켓 페이지로 이동합니다.

백엔드 구현 요구사항

상품 등록

  • "상품 등록하기" 버튼 클릭 시, 상품 정보 등록 API 엔드포인트에 요청하여 상품을 등록합니다.
  • 필드 유효성 검증 미들웨어 구현: (이름, 설명, 가격 등).
  • Multer 미들웨어를 사용하여 이미지 업로드 API 구현: 업로드된 이미지는 서버에 저장하고, 이미지 경로를 response에 포함합니다.

상품 상세

  • 상품 조회 시 댓글 리스트와 사용자의 '좋아요' 여부를 응답 객체에 포함합니다.

좋아요 기능

  • '좋아요' API를 생성: 사용자가 상품 또는 게시글에 '좋아요'를 할 수 있습니다. $transaction 사용.
  • '좋아요' 취소 API 생성: 사용자가 상품 또는 게시글에 '좋아요'를 취소할 수 있습니다. $transaction 사용.
  • 상품 또는 게시글 조회 시, '좋아요' 여부를 확인할 수 있도록 isLiked 필드를 포함합니다.

에러 처리

  • 모든 예외 상황을 처리할 수 있는 에러 핸들러 미들웨어 구현: 서버 오류(500), 사용자 입력 오류(400 시리즈), 리소스 찾을 수 없음(404) 등.

라우트 중복 제거

  • 중복되는 라우트 경로 통합: app.route() 사용.
  • express.Router()를 활용하여 중고마켓/자유게시판 관련 라우트를 별도의 모듈로 구분합니다.

인증

  • User 스키마 작성: id, email, nickname, image, encryptedPassword, createdAt, updatedAt 필드 포함.
  • 회원가입 API: email, nickname, password 입력 후 회원가입 진행. password는 해싱하여 저장.
  • 로그인 API: 사용자의 신원을 확인하고, 성공적 인증 후 액세스 토큰을 발급합니다.

상품 기능 인가

  • 로그인한 사용자만 상품 등록 가능.
  • 등록한 사용자만 상품 정보 수정 및 삭제 가능.
  • 로그인한 사용자만 상품에 '좋아요' 추가 또는 삭제 가능.

게시글 기능 인가

  • 로그인한 사용자만 게시글 등록 가능.
  • 등록한 사용자만 게시글 정보 수정 및 삭제 가능.
  • 로그인한 사용자만 게시글에 '좋아요' 추가 또는 삭제 가능.

댓글 기능 인가

  • 로그인한 사용자만 상품에 댓글 등록 가능.
  • 로그인한 사용자만 게시글에 댓글 등록 가능.
  • 등록한 사용자만 댓글 수정 또는 삭제 가능.

심화 요구사항

  • 상태코드 (HTTP Status Codes): 프론트엔드에서 서버 응답 상태코드에 따라 적절한 사용자 피드백 제공.
  • 인증 (Authentication):
    • 토큰 기반 방식 사용 시, 만료된 액세스 토큰을 새로 발급하는 리프레시 토큰 발급 기능 구현 (JWT sliding session 적용).
    • OAuth를 활용한 인증: 구글 OAuth를 사용하여 회원가입 및 로그인 기능 구현.
  • 프로젝트 구조 변경 (Project Structure Change): MVC 패턴이나 Layered Architecture와 같은 설계 방식 적용 (선택 사항).
  • 자유게시판 게시물 등록 (Free Board Post Registration):
    • 프론트엔드를 Next.js로 마이그레이션한 경우에만 진행.
    • 게시물 등록 시 이미지 등록 기능 구현: 파일 선택 후 이미지 업로드 및 미리보기 기능. 최대 3개 이미지 등록 가능.
    • 게시물 등록 시 필요한 필드(제목, 내용 등)의 유효성 검증 미들웨어 구현.
    • Multer 미들웨어를 사용하여 이미지 업로드 API 구현: 업로드된 이미지는 서버에 저장하고, 이미지 경로를 response에 포함합니다.

주요 변경사항

  • prisma -> sequelize로 변경되었습니다..

스크린샷

멘토에게 (To the Mentor)

  • 분리했습니다! 프론트 PR은 다시할 예정이라 닫았고... 아마 그 이번주안으로 제출하겠습니다.. 지정일 못맞춰서 죄송합니다 ㅠㅠ..

@Accreditus Accreditus added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 제출일에 늦은 PR입니다. 제출일 이후의 PR입니다. labels Oct 7, 2024
@Accreditus Accreditus requested a review from ehj0128 October 7, 2024 07:54
@Accreditus Accreditus changed the title Sprint week 10 [김현우] 미션 10 Oct 7, 2024
@Accreditus Accreditus changed the title [김현우] 미션 10 [김현우] Sprint 10 Oct 7, 2024
@Accreditus Accreditus added the 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! label Oct 7, 2024
Copy link

@ehj0128 ehj0128 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

보통
-route
-controller
-service

이렇게 나누고 대부분의 로직이 service에 들어가게 되는데 service는 사용안하고 있는 것 같아서 추천드립니다.

const { generateToken, generateRefreshToken } = require("../utils/jwt");

exports.signUp = async (req, res) => {
const { email, password, nickname } = req.body;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

password 는 암호화 전인가요? 그러면 클라이언트에서 보낼때도 그냥 password스트링 그대로 보내나요?

};

exports.refreshToken = async (req, res) => {
const { refreshToken } = req.body;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

refreshToken 새로 발급할때 만료된 accessToken도 같이 받아오지는 않나요?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

auth middleware 에서 토큰검증을 한번 해서 상관 없으려나요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 제출일에 늦은 PR입니다. 제출일 이후의 PR입니다. 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요!
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants