Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
0163d06
🔄 chore: 미션 4 초기 세팅 및 인증 관련 패키지 설치
kyoumi3263-hue Nov 24, 2025
15ac458
📚 docs(README): 개발 체크리스트 및 환경변수 설정 가이드 추가
kyoumi3263-hue Nov 24, 2025
c52c37d
🗑️ remove(mission3): 잘못 위치한 미션2 파일 삭제 및 폴더 구조 정상화
kyoumi3263-hue Nov 24, 2025
ffdbb93
🔄 chore(mission3): 에러 방지를 위해 백업 스키마 주석 처리
kyoumi3263-hue Nov 24, 2025
84551a8
🚀 feat(db): Prisma 스키마 관계 설정 및 시드 데이터(bcrypt) 구현
kyoumi3263-hue Nov 25, 2025
9e78a4e
🚀 feat(server): app.js 서버 진입점 생성 및 환경 상수(constants) 설정
kyoumi3263-hue Nov 25, 2025
093e9a7
🚀 feat(core): 공통 유틸리티(Prisma, Structs) 및 미들웨어(Validator, ErrorHandler…
kyoumi3263-hue Nov 25, 2025
cd584bf
🚀 feat(product): 상품 CRUD API, 검색/정렬, 페이지네이션 구현
kyoumi3263-hue Nov 25, 2025
5c3decd
🚀 feat(server): Product 라우터 연결 및 전역 에러 핸들러 적용
kyoumi3263-hue Nov 25, 2025
c2f42a2
🚀 feat(auth): 회원가입 API 구현 (bcrypt 암호화 및 유효성 검사 적용)
kyoumi3263-hue Nov 26, 2025
c4dcd32
🚀 feat(auth): 로그인 API 구현 (JWT 발급 로직)
kyoumi3263-hue Nov 26, 2025
6e64b8e
🚀 feat(auth): JWT 인증 미들웨어 구현 및 README 업데이트
kyoumi3263-hue Nov 26, 2025
cc9d5e1
🚀 feat(user): 내 정보 조회 API 구현 (Auth Middleware 적용)
kyoumi3263-hue Nov 26, 2025
c4345c7
🚀 feat(user): 유저 정보 조회/수정/탈퇴 API 구현 및 README 업데이트
kyoumi3263-hue Nov 26, 2025
1f75b77
🚀 feat(product): 상품 API 인가(Authorization) 적용 및 본인 확인 로직 구현
kyoumi3263-hue Nov 26, 2025
947339b
🚀 feat(article): 자유게시판 CRUD API 구현 (인가 로직 적용) 및 README 업데이트
kyoumi3263-hue Nov 27, 2025
4234f27
🚀 feat(comment): 댓글 CRUD 및 인가 기능 구현 완료, README 업데이트
kyoumi3263-hue Nov 27, 2025
b2db241
🚀 feat(user): 비밀번호 변경 및 내가 등록한 상품 조회 기능 구현
kyoumi3263-hue Nov 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
node_modules/
__http__/
# 1. 환경 변수
.env
/generated/prisma
.env.*

# 팀원 공유용 예시 파일은 깃에 올려줘 (느낌표는 '이건 제외하고'라는 뜻)
!.env.example

# 2. 로컬 설정 및 모듈
__http__/
node_modules/

# 3. 업로드 파일 관리
# image 폴더가 업로드용이라면 유지, 아니라면 지워도 됨
image/
public/*
!public/.gitkeep
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
"semi": true,
"printWidth": 100,
"endOfLine": "auto",
"arrowParens": "always"
"arrowParens": "always",
"tabWidth": 2
}
150 changes: 48 additions & 102 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,118 +1,64 @@
# 기본 요구 사항
# 🛡️ 스프린트 미션: 인증/인가 및 관계형 DB 구현

## 공통
## 📅 프로젝트 개요

- [x] PostgreSQL를 이용해 주세요.
- [x] 데이터 모델 간의 관계를 고려하여 onDelete를 설정해 주세요.
- [x] 데이터베이스 시딩 코드를 작성해 주세요.
- [x] 각 API에 적절한 에러 처리를 해 주세요.
- [x] 각 API 응답에 적절한 상태 코드를 리턴하도록 해 주세요.
- **목표:** 토큰 기반의 인증(Authentication)과 인가(Authorization) 시스템을 구현하고, Prisma의 관계형 데이터 모델링을 적용합니다.
- **핵심 기술:** Node.js, Express, Prisma, JWT, bcrypt

## 스키마
---

### 중고마켓
## ✅ 개발 체크리스트 (To-Do List)

- [x] Product 스키마를 작성해 주세요.
### 🛠️ 1. 초기 세팅 & 데이터베이스 (Prisma)

- [x] id, name, description, price, tags, createdAt, updatedAt필드를 가집니다.
필요한 필드가 있다면 자유롭게 추가해 주세요.
- [x] **환경변수(.env) 설정**
- [x] `DATABASE_URL` 확인
- [x] `JWT_SECRET` (토큰 비밀키)
- [x] **User 스키마 작성**
- [x] 필드 구성: `id`, `email`, `nickname`, `image`, `password`, `createdAt`, `updatedAt`
- [x] 기존 모델(`Product`, `Article`, `Comment`)과 1:N 관계 설정 (`relation` 연결)

- [x] 상품 등록 API를 만들어 주세요. == POST ==
### 🔐 2. 인증 (Authentication) - 로그인/회원가입

- [x] name, description, price, tags를 입력하여 상품을 등록합니다.
- [x] **회원가입 API 구현**
- [x] 입력: `email`, `nickname`, `password`
- [x] **중요:** 비밀번호는 반드시 **해싱(Hashing)** 하여 저장 (bcrypt 등 사용)
- [x] **로그인 API 구현**
- [x] 입력: `email`, `password` 검증
- [x] 성공 시: **Access Token (JWT)** 발급 및 반환

- [x] 상품 목록 조회 API를 만들어 주세요. == GET LIST ==
### 👮 3. 인가 (Authorization) - 권한 체크

- [x] id, name, price, createdAt를 조회합니다.
- [x] offset 방식의 페이지네이션 기능을 포함해 주세요.
- [x] 최신순(recent)으로 정렬할 수 있습니다.
- [x] name, description에 포함된 단어로 검색할 수 있습니다.
> **공통 규칙:** 로그인한 유저만 등록 가능 / 본인만 수정, 삭제 가능

- [x] 상품 상세 조회 API를 만들어 주세요. == GET ID ==
- [x] **인가 미들웨어(Middleware) 구현** (토큰 검증 및 유저 확인)
- [x] **상품(Product) 기능 인가**
- [x] 등록: 로그인한 유저만 가능
- [x] 수정/삭제: 상품 등록자(본인)만 가능
- [x] **게시글(Article) 기능 인가**
- [x] 등록: 로그인한 유저만 가능
- [x] 수정/삭제: 게시글 작성자(본인)만 가능
- [x] **댓글(Comment) 기능 인가**
- [x] 등록: 상품/게시글에 댓글 달기 (로그인 유저만)
- [x] 수정/삭제: 댓글 작성자(본인)만 가능

- [x] id, name, description, price, tags, createdAt를 조회합니다.
### 👤 4. 유저 정보 관리 (My Page)

- [x] 상품 수정 API를 만들어 주세요. == PATCH ID ==
- [x] **내 정보 조회 API**
- [x] 응답에 `password` 제외할 것
- [x] **내 정보 수정 API**
- [x] **비밀번호 변경 API** (기존 비번 확인 과정 권장)
- [x] **내가 등록한 상품 목록 조회 API**

- [x] PATCH 메서드를 사용해 주세요.
---

- [x] 상품 삭제 API를 만들어 주세요. == DELETE ID ==
## 🔥 심화 요구사항 (Advanced) - 시간 남으면 도전!

- [] 각 API에 적절한 에러 처리를 해 주세요.

- [] 각 API 응답에 적절한 상태 코드를 리턴하도록 해 주세요.

### 자유게시판

- [x] Article 스키마를 작성해 주세요.

- [x] id, title, content, createdAt, updatedAt 필드를 가집니다.

- [x] 게시글 등록 API를 만들어 주세요. == POST ==

- [x] title, content를 입력해 게시글을 등록합니다.

- [x] 게시글 목록 조회 API를 만들어 주세요. LIST

- [x] id, title, content, createdAt를 조회합니다.
- [x] offset 방식의 페이지네이션 기능을 포함해 주세요.
- [x] 최신순(recent)으로 정렬할 수 있습니다.
- [x] title, content에 포함된 단어로 검색할 수 있습니다.

- [x] 게시글 상세 조회 API를 만들어 주세요. == GET ID ==

- [x] id, title, content, createdAt를 조회합니다.

- [x] 게시글 수정 API를 만들어 주세요. == PATCH ID ==

- [x] 게시글 삭제 API를 만들어 주세요. == DELETE ID ==

### 댓글

- [x] 댓글 등록 API를 만들어 주세요. == POST ==

- [x] content를 입력하여 댓글을 등록합니다.
- [x] 중고마켓, 자유게시판 댓글 등록 API를 따로 만들어 주세요.

- [x] 댓글 목록 조회 API를 만들어 주세요. == GET LIST ==

- [x] id, content, createdAt 를 조회합니다.
- [x] cursor 방식의 페이지네이션 기능을 포함해 주세요.
- [x] 중고마켓, 자유게시판 댓글 목록 조회 API를 따로 만들어 주세요.

- [x] 댓글 수정 API를 만들어 주세요. == PATCH ==

- [x] PATCH 메서드를 사용해 주세요.

- [x] 댓글 삭제 API를 만들어 주세요. == DELETE ==

## 미들웨어

### 유효성 검증

- [x] 상품 등록 시 필요한 필드(이름, 설명, 가격 등)의 유효성을 검증하는 미들웨어를 구현합니다.

- [x] 게시물 등록 시 필요한 필드(제목, 내용 등)의 유효성 검증하는 미들웨어를 구현합니다.

### 이미지 업로드

- [x] multer 미들웨어를 사용하여 이미지 업로드 API를 구현해주세요.
- [] 업로드된 이미지는 서버에 저장하고, 해당 이미지의 경로를 response 객체에 포함해 반환합니다.

### 에러 처리

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

## 라우터

### 라우트 중복 제거

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

# 배포

- [x] .env 파일에 환경 변수를 설정해 주세요.
- [x] CORS를 설정해 주세요.
- [] render.com으로 배포해 주세요.
- [ ] **Refresh Token 구현** (토큰 갱신 기능)
- [ ] **좋아요(Like) 기능 - 상품**
- [ ] 좋아요 / 좋아요 취소 토글
- [ ] 조회 시 `isLiked` 필드 포함
- [ ] **좋아요(Like) 기능 - 게시글**
- [ ] 좋아요 / 좋아요 취소 토글
- [ ] 조회 시 `isLiked` 필드 포함
- [ ] **좋아요한 목록 조회 기능**
Loading