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
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/panda-market
PORT=3000
JWT_ACCESS_TOKEN_SECRET=your-secret-key
JWT_REFRESH_TOKEN_SECRET=your-refresh-secret-key
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
node_modules/
.env*
!.env.example
build/
coverage/

# Uploaded files
public/*
!public/.gitkeep

!public/socket-client-test.html
81 changes: 53 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,53 @@
# 🚩 Sprint 5 미션 체크리스트

## ✅ 기본 요구 사항
- [x] 스프린트 미션 4의 구현 완료 상태에서 진행
- [x] 타입스크립트 마이그레이션 진행 및 미구현 기능 추가

## 🛠️ 프로젝트 세팅
- [x] `tsconfig.json` 파일 생성 및 필요한 옵션 설정 (예: `outDir`)
- [x] 필요한 npm script 설정 (빌드 및 개발 서버 실행 명령어)

## 🟦 타입스크립트 마이그레이션
- [x] 기존 Express.js 프로젝트를 타입스크립트 프로젝트로 마이그레이션
- [x] 필요한 타입 패키지 설치 (`@types/express`, `@types/node`, `@types/cookie-parser` 등)
- [x] `any` 타입 사용 최소화
- [x] 복잡한 객체/배열 구조에 인터페이스 또는 타입 별칭(Type Alias) 사용
- [x] 타입 별칭 또는 유틸리티 타입을 사용해 타입 복잡성 감소
- [x] `declare`를 사용하여 타입을 오버라이드하거나 확장 (예: `req.user`)

## 💻 개발 환경 설정
- [x] `ts-node`를 사용해 `.ts` 코드를 바로 실행할 수 있는 npm script 생성 (`npm run dev`)
- [x] `nodemon`을 사용해 코드가 변경될 때마다 서버가 다시 실행되도록 설정

## 🚀 심화 요구 사항 (진행 중)
- [ ] **Layered Architecture(계층형 아키텍처) 적용**
- [ ] **Controller**: 요청 검증 및 응답 처리 계층 분리
- [ ] **Service**: 비즈니스 로직 및 에러 처리 계층 분리
- [ ] **Repository**: 데이터베이스 액세스 로직 분리
- [ ] 계층 사이에서 데이터를 주고받을 때 **DTO(Data Transfer Object)** 활용
# 🐼 판다마켓 백엔드 스프린트 미션 9

이번 스프린트에서는 **Jest**와 **Supertest**를 활용하여 서비스의 안정성을 검증하고, 테스트 주도 개발(TDD)의 기초가 되는 통합 테스트 및 단위 테스트 환경을 구축했습니다.

---

## 🛠️ 테스트 환경 설정
- **Test Runner:** Jest
- **Library:** Supertest (API 통합 테스트), ts-jest (TypeScript 지원)
- **Database:** Prisma (PostgreSQL)
- **Coverage:** Jest 내장 커버리지 도구 활용



---

## ✅ 요구사항 이행 현황

### 1. 기본 요구사항 (통합 테스트)
- [x] **테스트 커버리지 설정:** `npm test -- --coverage`를 통한 리포트 생성 설정 완료
- [x] **인증 불필요 상품 API:** 상품 목록 조회, 상세 조회 기능 검증
- [x] **인증 불필요 게시글 API:** 자유게시판 목록 및 상세 조회 기능 검증
- [x] **인증/인가 API:** 회원가입 및 로그인(JWT 발급) 프로세스 검증
- [x] **인증 필요 상품 API:** 상품 등록, 수정, 삭제 시 권한 및 유효성 검증
- [x] **인증 필요 게시글 API:** 게시글 작성, 수정, 삭제 및 댓글 기능 검증

### 2. 심화 요구사항 (단위 테스트)
- [x] **비즈니스 로직 유닛 테스트:** `productsService` 등 주요 서비스 로직에 대해 Mock, Spy를 활용한 독립적 검증 수행

---

## 📈 테스트 실행 및 결과 확인

```
# 모든 테스트 실행
npm test
# 테스트 커버리지 확인
npm test -- --coverage
```
<img width="349" height="232" alt="스크린샷 2026-03-06 104441" src="https://github.com/user-attachments/assets/5c8cd82e-5e8b-4420-8135-19263c7cdafe" />

---


## 💡 주요 구현 사항 및 트러블슈팅
### 1. 앱 진입점 분리 (App vs Main)
- 테스트 실행 시 서버가 중복 포트로 뜨는 문제를 방지하기 위해 app.ts(익스프레스 설정)와 main.ts(서버 실행)를 분리하여 테스트 효율성을 높였습니다.

### 2. 데이터베이스 참조 무결성 해결
- 테스트 종료 후 afterAll에서 데이터를 삭제할 때, 외래키(Foreign Key) 제약 조건으로 인해 발생하는 삭제 오류를 삭제 순서 조정 및 트랜잭션 처리를 통해 해결했습니다.

### 3. Mocking을 활용한 서비스 테스트
- 외부 의존성(Prisma Client 등)을 jest.mock으로 대체하여 데이터베이스 연결 없이도 순수 비즈니스 로직만을 빠르게 테스트할 수 있도록 구현했습니다.
505 changes: 505 additions & 0 deletions bun.lock

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { Config } from 'jest';

const config: Config = {
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
collectCoverageFrom: [
'src/**/*.ts',
'!src/main.ts',
'!src/app.ts',
'!src/types/**',
'!src/lib/prismaClient.ts',
],
coverageReporters: ['text', 'lcov', 'html'],
coverageDirectory: 'coverage',
setupFiles: ['<rootDir>/src/tests/setup.ts'],
};

export default config;
Loading