- 운동 인증 커뮤니티 서비스의 백엔드 시스템 구축
- 그룹, 참여자, 운동 기록, 배지, 좋아요 기능
- 프로젝트 기간: 2025.08.11 ~ 2025.08.29
| 문서 | 링크 |
|---|---|
| Swagger API | 바로가기 |
| 팀 문서 (Notion) | 바로가기 |
| 실행 영상 | 바로가기 |
| 최종 발표 PPT | 바로가기 |
| 프론트엔드 레포지토리 | 바로가기 |
| 이상욱 | 김보경 | 엄규리 | 박형익 | 김태회 |
|---|---|---|---|---|
📂 기술 스택 보기
| Category | Stack | Version |
|---|---|---|
| Language | TypeScript | 5.9.2 |
| Runtime | Node.js | 22.17.0 |
| Framework | Express.js | 5.1.0 |
| ORM | Prisma ORM | 6.14.0 |
| Database | PostgreSQL | 17.5 |
| Auth | Bcrypt | 6.0.0 |
| Validation | Zod | 4.0.17 |
| File Upload | Multer | 2.0.2 |
| Logger | Morgan | 1.10.1 |
| Middleware | CORS | 2.8.5 |
| Config | Dotenv | 17.2.1 |
| API Docs | Swagger UI Express | 5.0.1 |
| Test | Vitest / Supertest | 3.2.4 / 7.1.4 |
| Lint / Format | ESLint / Prettier | 9.33.0 / 3.6.2 |
| Git Hook | Husky | 9.1.7 |
| Package Manager | npm | 10.x |
📁 자세히 보기
|
그룹 등록 수정 삭제 이미지 업로드 참여자 인증 |
|
|
Husky 이용 Prettier Lint Build 자동화 Lint 규칙 설정 |
|
|
GitHub Actions CD 이용 백엔드 배포 자동화 + AWS EC2 / RDS Vercel(프론트) |
|
|
그룹 & 이미지 Swagger문서 작성 및 파일 분리 |
|
|
gotty이용 서버 로그 실시간 웹뷰어 설정 |
|
| ERD |
|
| Deployment Diagram |
|
- 참여자의 그룹 탈퇴 상황 케이스 처리
- 그룹 응답 데이터 프론트와 일치시키는 매핑 개발
- 배지 테스트를 위한 목업 데이터 만들기
개발 내용
- vitest를 통한 전체적인 기능점검
- 백앤드의 설정한 fields 값이 아닐경우 request를 reject한후 무슨 값이 필요한지 알려주는 기능
- 직접 타이머 api를 구축해 실제로 UI 시작 종료를 누르는시간을 서버타임으로 계산후 검증기능 구축
- 운동기록/사진 검증 및 등록 기능 구축
📂 파일 구조 보기
.
├── src
│ ├── app.ts
│ ├── config
│ │ └── db.ts
│ ├── controllers
│ │ ├── group
│ │ │ ├── create_group.controller.ts
│ │ │ ├── delete_group.controller.ts
│ │ │ ├── get_group_by_id.controller.ts
│ │ │ ├── get_group_mem_rank.controller.ts
│ │ │ ├── get_group.controller.ts
│ │ │ ├── index.ts
│ │ │ ├── join_group.controller.ts
│ │ │ ├── leave_group.controller.ts
│ │ │ ├── recommend_group.controller.ts
│ │ │ └── update_group.controller.ts
│ │ └── record.controller.ts
│ ├── generated
│ ├── index.ts
│ ├── middleware
│ │ ├── auth.middleware.ts
│ │ ├── error.middleware.ts
│ │ ├── group.middleware.ts
│ │ ├── index.ts
│ │ └── validate.middleware.ts
│ ├── models
│ │ ├── auth
│ │ │ ├── auth_request.model.ts
│ │ │ ├── auth_response.model.ts
│ │ │ └── index.ts
│ │ ├── error_response.model.ts
│ │ ├── group
│ │ │ ├── create_group.dto.ts
│ │ │ ├── delete_group.dto.ts
│ │ │ ├── group_response.dto.ts
│ │ │ ├── index.ts
│ │ │ └── update_group.dto.ts
│ │ └── upload
│ │ ├── upload_request.model.ts
│ │ └── upload_response.model.ts
│ ├── routes
│ │ ├── group.routes.ts
│ │ ├── record.routes.ts
│ │ ├── timer.routes.ts
│ │ ├── upload.route.ts
│ │ └── uploads
│ ├── services
│ │ ├── group
│ │ │ ├── badge_evaluation.service.ts
│ │ │ ├── create_group.service.ts
│ │ │ ├── delete_group.service.ts
│ │ │ ├── get_group_by_id.service.ts
│ │ │ ├── get_group_mem_rank.service.ts
│ │ │ ├── get_group.service.ts
│ │ │ ├── index.ts
│ │ │ ├── join_group.service.ts
│ │ │ ├── leave_group.service.ts
│ │ │ ├── recommend_group.service.ts
│ │ │ └── update_group.service.ts
│ │ └── record.service.ts
│ ├── swagger
│ │ ├── components
│ │ │ ├── examples
│ │ │ ├── index.yaml
│ │ │ ├── parameters
│ │ │ ├── responses
│ │ │ └── schemas
│ │ ├── info
│ │ │ └── index.yaml
│ │ ├── paths
│ │ │ ├── group
│ │ │ ├── index.yaml
│ │ │ ├── record
│ │ │ ├── timer
│ │ │ └── upload
│ │ ├── server
│ │ │ └── index.yaml
│ │ ├── swagger.yaml
│ │ └── tags
│ │ └── index.yaml
│ ├── tests
│ │ ├── api.test.ts
│ │ └── setup.ts
│ └── utils
│ ├── auth.util.ts
│ ├── discord.ts
│ ├── mappers
│ │ └── group.mapper.ts
│ ├── password.ts
│ └── timer.ts
├── test_webhook.js
├── test.txt
├── tsconfig.json
├── uploads
├── eslint.config.js
├── package-lock.json
├── package.json
├── README.md
├── seed.js
└── vitest.config.ts

















