Skip to content

[권태현] 스프린트 미션 9#61

Open
cari-0 wants to merge 7 commits into
codeit-sprint-fullstack:express-권태현from
cari-0:express-권태현

Hidden character warning

The head ref may contain hidden characters: "express-\uad8c\ud0dc\ud604"
Open

[권태현] 스프린트 미션 9#61
cari-0 wants to merge 7 commits into
codeit-sprint-fullstack:express-권태현from
cari-0:express-권태현

Conversation

@cari-0

@cari-0 cari-0 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

개요

중고마켓(Product) + 자유게시판(Article) 서비스의 백엔드 API를 처음부터 구현했습니다.
인증 → 상품 → 게시글 → 댓글 → 이미지 업로드 순으로 기능을 쌓았고, Swagger 문서와 README를 정리했습니다.

주요 기능

  • 인증: 회원가입/로그인, accessToken·refreshToken 발급, 토큰 갱신(슬라이딩 세션 지원)
  • 상품(중고마켓): CRUD, 태그, 검색/정렬(최신순·좋아요순), 좋아요 추가/취소, 본인 소유 검증
  • 게시글(자유게시판): 상품과 동일한 패턴으로 CRUD, 좋아요 추가/취소
  • 댓글: 상품/게시글 공용 로직(type 기반)으로 CRUD, 작성자만 수정/삭제 가능
  • 이미지 업로드: multer 기반 업로드, 타입/용량 제한
  • API 문서: Swagger UI(/api-docs)

아키텍처

Route → Middleware(인증/검증) → Controller → Service → Repository → Prisma 계층 구조로 통일했습니다.

  • 좋아요는 Product/Article.likeCount 컬럼 + $transaction으로 카운트와 좋아요 row를 원자적으로 처리
  • 조회 응답에 isLiked/isMyComment를 서비스 레이어에서 계산해 포함(테이블 필드 아님)
  • zod 검증은 validate 미들웨어로 라우터 단에서 분리

리뷰 과정에서 고친 주요 버그

  • 상품/게시글 조회 시 작성자 password/refreshToken이 응답에 노출되던 문제
  • refreshToken 회전 시 DB에 저장되지 않아 다음 갱신이 항상 실패하던 문제
  • refreshToken 쿠키 path 불일치로 로그인 직후 첫 갱신 이후 세션이 끊기던 문제
  • 댓글 id만으로 상품/게시글을 구분하려다 id 충돌 시 잘못된 댓글을 수정/삭제할 뻔한 문제 → 라우트를 /products/:id/comments/:commentId 형태로 재설계
  • 이미지 업로드 응답이 상대경로라 상품/게시글 등록 시 URL 검증에 항상 실패하던 문제

테스트

  • Swagger UI 및 REST Client(src/http/*.http)로 전체 엔드포인트 수동 테스트
  • 주요 시나리오(좋아요 토글+트랜잭션, 댓글 권한 검증, isLiked 정확도 등)는 실제 DB 대상 스크립트로 검증

참고

  • API 문서: GET /api-docs
  • 실행 방법: README.md 참고

요구사항

기본 요구사항

공통

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

백엔드 구현 요구사항

상품 등록

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

상품 상세

  • 상품을 조회할 때, 해당 상품에 대한 댓글 리스트, 사용자가 '좋아요'를 눌렀는지 여부를 확인할 수 있도록 응답 객체에 포함시켜 반환해 주세요.

좋아요 기능

  • '좋아요' API를 만들어 주세요.
  • 사용자는 상품 또는 게시글에 '좋아요'를 할 수 있습니다.
  • $transaction을 사용해 주세요.
  • '좋아요' 취소 API를 만들어 주세요.
  • 사용자는 상품 또는 게시글에 '좋아요'를 취소할 수 있습니다.
  • $transaction을 사용해 주세요.
  • 상품 또는 게시글을 조회할 때, 사용자가 '좋아요'를 누른 항목인지 확인할 수 있도록 isLiked 필드를 응답 객체에 포함시켜 반환해 주세요.

에러 처리

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

라우트 중복 제거

  • 중복되는 라우트 경로(예: /users에 대한 get 및 post 요청)를 app.route()로 통합해 중복을 제거합니다.
  • express.Router()를 활용하여 중고마켓/자유게시판 관련 라우트를 별도의 모듈로 구분합니다.

인증

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

상품 기능 인가

  • 로그인한 사용자만 상품을 등록할 수 있습니다.
  • 상품을 등록한 사용자만 해당 상품의 정보를 수정 및 삭제를 할 수 있습니다.
  • 로그인한 사용자만 상품에 '좋아요'를 추가하거나 삭제할 수 있습니다.

게시글 기능 인가

  • 로그인한 사용자만 게시글을 등록할 수 있습니다.
  • 게시글을 등록한 사용자만 해당 게시글 정보를 수정 및 삭제할 수 있습니다.
  • 로그인한 사용자만 게시글에 '좋아요'를 추가하거나 삭제할 수 있습니다.

댓글 기능 인가

  • 로그인한 사용자만 상품에 댓글을 등록할 수 있습니다.
  • 로그인한 사용자만 게시글에 댓글을 등록할 수 있습니다.
  • 댓글을 등록한 사용자만 댓글을 수정하거나 삭제할 수 있습니다.

심화 요구사항

상태코드 (웹 API 관련)

  • 프론트엔드에서는 서버 응답의 상태코드에 따라 적절한 사용자 피드백을 제공합니다.

인증

  • 토큰 기반 방식을 사용할 경우, 만료된 액세스 토큰을 새로 발급하는 리프레시 토큰 발급 기능을 구현합니다.(jwt sliding session 적용)

OAuth를 활용한 인증

  • 구글 OAuth를 사용하여 회원가입 및 로그인 기능을 구현합니다.

프로젝트 구조 변경

  • 프로젝트의 구조와 복잡성을 관리하기 위해 MVC 패턴이나 Layered Architecture와 같은 설계 방식을 적용해 보세요.

(생략 가능) 자유게시판 게시물 등록

  • 프론트엔드를 Next.js로 Migration 했을 경우에만 진행해 주세요.
  • 게시물 등록 시 이미지 등록 기능을 구현합니다. 파일을 선택해 이미지를 업로드하고, preview를 볼 수 있도록 구현합니다. 이미지는 최대 3개까지만 등록 가능하도록 구현해 주세요.
  • 게시물 등록 시 필요한 필드(제목, 내용 등)의 유효성 검증하는 미들웨어를 구현합니다.
  • multer 미들웨어를 사용하여 이미지 업로드 API를 구현해 주세요.
  • 업로드된 이미지는 서버에 저장하고, 해당 이미지의 경로를 response 객체에 포함해 반환합니다.

멘토님께

스프린트 8, 9 내용을 이해하는데 시간이 많이 소요되어서 내용이 많이 비어있습니다..🥲
미션 중간중간 AI를 곁들여서 코드를 보고 부분 부분 수정하는 방법으로 했습니다. 감사합니다

@cari-0 cari-0 added the 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! (2주 이상의 스프린트 미션 중간점검 PR 제출시 사용합니다.) label Jul 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! (2주 이상의 스프린트 미션 중간점검 PR 제출시 사용합니다.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant