Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 0 additions & 6 deletions .env.example

This file was deleted.

12 changes: 5 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
node_modules
# Keep environment variables out of version control
.env
dist

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/src/generated/prisma

# Uploads
uploads/
# Claude Code
.claude/
.claude
3 changes: 0 additions & 3 deletions .vs/ProjectSettings.json

This file was deleted.

Binary file removed .vs/Splint_M_3/v17/.suo
Binary file not shown.
6 changes: 0 additions & 6 deletions .vs/VSWorkspaceState.json

This file was deleted.

Binary file removed .vs/slnx.sqlite
Binary file not shown.
1 change: 0 additions & 1 deletion COMMIT_EDITMSG

This file was deleted.

68 changes: 6 additions & 62 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,67 +1,11 @@
# 토큰 기반 유저 인증/인가 API 시스템
# Jest & Supertest 테스트 프로젝트

Node.js, Express, TypeScript, Prisma를 사용한 JWT 기반 인증/인가 시스템입니다.
Express API 통합 테스트 및 유닛 테스트 프로젝트

## 🚀 구현된 기능

### 기본 요구사항
- ✅ JWT Access Token 기반 인증
- ✅ 회원가입/로그인 API
- ✅ 비밀번호 해싱 (bcrypt)
- ✅ 상품/게시글/댓글 CRUD + 인가
- ✅ 유저 정보 관리

### 심화 요구사항
- ✅ Refresh Token 구현
- ✅ 상품/게시글 좋아요 기능
- ✅ Prisma 관계형 데이터베이스
- ✅ isLiked 필드로 좋아요 상태 표시

## 🛠 기술 스택

- **언어**: TypeScript
- **프레임워크**: Node.js + Express
- **데이터베이스**: SQLite + Prisma ORM
- **인증**: JWT + bcrypt

서버: `http://localhost:3000`

## 📖 주요 API

### 인증
- `POST /api/auth/signup` - 회원가입
- `POST /api/auth/login` - 로그인
- `POST /api/auth/refresh` - 토큰 갱신
- `POST /api/auth/logout` - 로그아웃

### 유저
- `GET /api/users/me` - 내 정보 조회
- `PUT /api/users/me` - 내 정보 수정
- `PUT /api/users/me/password` - 비밀번호 변경

### 상품/게시글
- `GET /api/products` - 목록 조회
- `POST /api/products` - 등록 (인증 필요)
- `PUT /api/products/:id` - 수정 (작성자만)
- `DELETE /api/products/:id` - 삭제 (작성자만)
- `POST /api/products/:id/like` - 좋아요/취소

게시글 API(`/api/posts`)도 동일한 패턴으로 구현됨

## 🔐 인증/인가

- **Access Token**: 1시간, API 요청 인증용
- **Refresh Token**: 7일, 토큰 갱신용
- **권한**: 비인증(조회만) → 인증(CRUD) → 작성자(수정/삭제)

## 📁 프로젝트 구조
# 테스트 실행
npm test

# 개발 서버 실행
npm run dev
```
src/
├── types/ # TypeScript 타입 정의
├── controllers/ # API 컨트롤러
├── middleware/ # 인증 미들웨어
├── routes/ # 라우터
├── utils/ # 유틸리티
└── app.ts # 메인 애플리케이션
```
28 changes: 28 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',

// 테스트 파일 위치
testMatch: ['**/src/**/*.test.ts'],

// 커버리지 설정
collectCoverage: true,
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov', 'html'],
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.test.ts',
'!src/**/*.d.ts',
],

// 모듈 파일 확장자
moduleFileExtensions: ['ts', 'js', 'json'],

// Transform 설정
transform: {
'^.+\\.ts$': 'ts-jest',
},

// 타임아웃 설정 (통합 테스트를 위해)
testTimeout: 10000,
};
8 changes: 4 additions & 4 deletions nodemon.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node -r tsconfig-paths/register ./src/app.ts"
}
"ext": "ts",
"ignore": ["src/**/*.test.ts"],
"exec": "ts-node src/index.ts"
}
Loading