2025.01.06 ~ 2025.02.25
FS-2기 Part4. 고급 프로젝트 1팀
서비스 이름: 핏메이트(FitMate)
-
핏메이트는 운동 전문가인 강사님과 건강 운동을 배우고 싶은 유저를 연결하여, 개인 맞춤형 운동 프로그램을 제공합니다.
유저는 자신의 건강 상태, 운동 목표, 선호도에 맞는 운동 전문가를 찾아 1:1 맞춤형 운동 프로그램을 받게 되며,
이를 통해 더 효율적이고 지속 가능한 운동 계획을 세울 수 있습니다.강사님은 각 유저의 목표와 상황에 맞춘 체계적인 운동 계획을 제시하고, 꾸준한 피드백과 지도를 통해 올바른 운동 습관을 형성할 수 있도록 도와줍니다.
또한, 운동 강사와 유저 간의 지속적인 소통을 통해 유저는 자신의 진행 상황을 점검하고, 필요한 부분에 대한 조정을 할 수 있습니다.이 서비스는 유저가 건강하고 효과적인 운동을 지속적으로 할 수 있도록 도와주는 동시에,
운동 강사들에게는 자신만의 클라이언트를 관리하고 전문성을 발휘할 수 있는 기회를 제공합니다.🔝 목차로 돌아가기
- environment
- VS Code, Prettier, ESLint, TypeScript, npm
- infra
- EC2, PM2, Nginx, Let's Encrypt SSL, Github Actions, docker, Git & Github, Amazon S3
- Real-time
- SSE, Socket.io
- tools
- Notion, Slack, Discord, Gather, Zoom
- backend:
- NodeJS, Express.js
- Authentication
- JWT, OAuth 2.0, Passport, bcrypt, async-local-storage
- Scheduling
- @nest/schedule
- Queue
- BullMQ
- Email
- Nodemailer
- Database
- MongoDB, PostgreSQL, Redis
- Etc
- Swagger
🔝 목차로 돌아가기
| 김민선 | 소재희 | 이동훈 |
|---|---|---|
| alscksdlek | BuffSo | ciin1411 |
🔝 목차로 돌아가기
Chores
팀장 + 백엔드장- 백엔드 기초 세팅 (폴더 아키텍처 설계, 린트 설정)
- 이슈 및 PR 템플릿 세팅
- 백엔드 일정 관리
- 백엔드 발표자료 정리
- 백엔드 배포 (EC2 인스턴스 내 서버 구축 + docker로 redis 컨테이너 실행 + RDS DB인스턴스 연결 + PM2 이용 자동 재시작 + MongoDB Atlas 연동)
- Nginx 리버스 프록시 & HTTPS 적용 ( Let's Encrypt SSL 인증서 적용 및 자동 갱신 설정)
- CI/CD 자동화 (GitHub Actions)
Development
- 담당 모듈: auth, cache, common, email, mail, mq, profile, s3, user, config
- 로컬 회원가입 및 nodemailer 적용 이메일 전송 및 인증(인증 번호)
- 로컬 로그인
- 구글 회원가입, 로그인(passport미사용)
- 네이버 카카오 회원가입, 로그인(passport 사용)
- refreshToken 활용 accessToken 재발급 및 유저 세션 연장 (sliding session)
- 비밀번호 변경
- 로그아웃
- AccessTokenGuard 생성(유저 정보 조회)
- async local storage 적용 (Request 단위 Context 관리)
- user 조회
- profile 생성, 조회, 업데이트
- profile 이미지 S3 presignedUrl 적용
- redis 적용
- bullMq 적용
Chores
- 발표
- api 명세서 관리
Development
- 데이터베이스 설계
- 레슨 관련 API 개발
- 레슨 요청 및 취소 기능
- 레슨 목록 및 레슨 상세 조회
- 내가 신청한 레슨 목록 조회
- 나의 요청 레슨에 대한 지정 견적 요청 생성
- 지정 견적 요청에 대한 반려 기능 (트레이너)
- 견적 관련 API 개발
- 견적 작성 기능
- 견적 목록 및 견적 상세 조회
- 견적 확정 및 반려 기능
- 리뷰 작성 가능한 견적 목록 조회
- 알림 시스템 구현
- 유저 알림 목록 조회
- 특정 알림 읽음 처리 (토글)
- 특정 유저에게 알림 전송 (SSE 방식)
- 트리거와 저장 프로시저를 이용한 알림 생성 기능 개발
- Fitmate AI 챗봇 구현
- OpenAI API를 이용하여 맞춤형 운동 추천 챗봇 개발
Chores
- 백엔드 깃허브 README.md 작성
Development
- 담당 모듈: Trainer, Review, Chat
- Trainer
- 강사님 목록 조회
- 찜한 강사님 목록 조회
- 특정 강사에 대한 찜수와 찜여부 조회
- 강사님 찜하기
- 찜한 강사 취소하기
- Review
- 내가 작성한 리뷰
- 리뷰 작성
- 리뷰 목록 조회
- 특정 트레이너 리뷰 점수 조회
- Chat
- 채팅방 생성
- 채팅 보내기
- 채팅방 채팅 내역 조회
- 내가 참여중인 채팅방 조회
- 채팅방 나가기
🔝 목차로 돌아가기
dev
├── docs
│ └── test.txt
├── eslint.config.js
├── logs
│ ├── 2025-01-06-warn.log
│ ├── 2025-02-17-debug.log
│ ├── 2025-02-18-debug.log
│ ├── 2025-02-19-debug.log
│ ├── 2025-02-20-debug.log
│ ├── 2025-02-21-debug.log
│ ├── combined.log
│ └── error.log
├── nest-cli.json
├── package-lock.json
├── package.json
├── prisma
│ ├── migrations
│ │ ├── 20250203091539_init_schema
│ │ │ └── migration.sql
│ │ ├── 20250203091557_add_notification_sp_trigger
│ │ │ └── migration.sql
│ │ ├── 20250213084946_remove_user_refresh_token
│ │ │ └── migration.sql
│ │ └── migration_lock.toml
│ ├── mock
│ │ ├── direct_quote_request.mock.ts
│ │ ├── favorite_trainers.mock.ts
│ │ ├── lesson_quote.mock.ts
│ │ ├── lesson_request.mock.ts
│ │ ├── profile.mock.ts
│ │ ├── review.mock.ts
│ │ └── user.mock.ts
│ ├── prisma.module.ts
│ ├── prisma.service.ts
│ ├── schema.prisma
│ └── seed.ts
├── src
│ ├── app.module.ts
│ ├── auth
│ │ ├── auth.controller.ts
│ │ ├── auth.module.ts
│ │ ├── auth.service.ts
│ │ ├── decorator
│ │ │ └── user.decorator.ts
│ │ ├── dto
│ │ │ └── auth.dto.ts
│ │ ├── guard
│ │ │ ├── access-token.guard.ts
│ │ │ ├── kakao.guard.ts
│ │ │ ├── naver.guard.ts
│ │ │ └── refresh-token.guard.ts
│ │ ├── interface
│ │ │ └── auth.service.interface.ts
│ │ ├── strategy
│ │ │ ├── kakao.strategy.ts
│ │ │ ├── local.strategy.ts
│ │ │ ├── naver.strategy.ts
│ │ │ └── refresh-token.strategy.ts
│ │ └── type
│ │ └── auth.type.ts
│ ├── cache
│ │ ├── cache.client.ts
│ │ ├── cache.config.module.ts
│ │ ├── cache.module.ts
│ │ ├── cache.service.ts
│ │ └── interface
│ │ └── cache.service.interface.ts
│ ├── chat
│ │ ├── chat.controller.ts
│ │ ├── chat.gateway.ts
│ │ ├── chat.module.ts
│ │ ├── chat.repository.ts
│ │ ├── chat.schema.ts
│ │ ├── chat.service.ts
│ │ ├── chatRoom.schema.ts
│ │ ├── dto
│ │ │ └── chat.dto.ts
│ │ ├── interface
│ │ │ ├── chat.repository.interface.ts
│ │ │ └── chat.service.interface.ts
│ │ └── type
│ │ └── chat.type.ts
│ ├── chatbot
│ │ ├── chatbot.controller.ts
│ │ ├── chatbot.module.ts
│ │ ├── chatbot.service.ts
│ │ └── dto
│ │ └── chatbot.dto.ts
│ ├── common
│ │ ├── als
│ │ │ ├── als.middleware.ts
│ │ │ ├── als.module.ts
│ │ │ ├── als.type.ts
│ │ │ └── store-validator.ts
│ │ ├── jwt.module.ts
│ │ └── uuid.pipe.ts
│ ├── configs
│ │ └── jwt.config.ts
│ ├── email
│ │ ├── email.module.ts
│ │ ├── email.service.ts
│ │ └── interface
│ │ └── email.service.interface.ts
│ ├── exception
│ │ ├── auth-exception-message.ts
│ │ ├── chat-exception-message.ts
│ │ ├── chatbot-exception-meaage.ts
│ │ ├── exception-message.ts
│ │ ├── global-exception-filter.ts
│ │ ├── lesson-exception-message.ts
│ │ ├── notification-exception-message.ts
│ │ ├── profile-exception-message.ts
│ │ ├── quote-exception-message.ts
│ │ ├── review-exception-message.ts
│ │ └── trainer-exception-message.ts
│ ├── lesson
│ │ ├── dto
│ │ │ └── lesson.dto.ts
│ │ ├── interface
│ │ │ ├── lesson-repository.interface.ts
│ │ │ ├── lesson-scheduler-service.interface.ts
│ │ │ └── lesson-service.interface.ts
│ │ ├── lesson-scheduler.service.ts
│ │ ├── lesson.controller.ts
│ │ ├── lesson.module.ts
│ │ ├── lesson.repository.ts
│ │ ├── lesson.service.ts
│ │ └── type
│ │ └── lesson.type.ts
│ ├── logger
│ │ ├── logging.interceptor.ts
│ │ └── winston-logger.ts
│ ├── mail
│ │ ├── mail.module.ts
│ │ ├── mail.processor.ts
│ │ ├── mail.service.ts
│ │ └── templates
│ │ └── verificationEmail.pug
│ ├── main.ts
│ ├── mq
│ │ ├── mq.module.ts
│ │ └── queue.constants.ts
│ ├── notification
│ │ ├── dto
│ │ │ └── notification.dto.ts
│ │ ├── interface
│ │ │ ├── notification-repository.interface.ts
│ │ │ └── notification-service.interface.ts
│ │ ├── notification.controller.ts
│ │ ├── notification.module.ts
│ │ ├── notification.repository.ts
│ │ ├── notification.service.ts
│ │ └── type
│ │ └── notification.type.ts
│ ├── profile
│ │ ├── decorator
│ │ │ └── role-field-validator.ts
│ │ ├── dto
│ │ │ └── profile.dto.ts
│ │ ├── interceptor
│ │ │ └── role.interceptor.ts
│ │ ├── interface
│ │ │ ├── profile.repository.interface.ts
│ │ │ └── profile.service.interface.ts
│ │ ├── profile.controller.ts
│ │ ├── profile.module.ts
│ │ ├── profile.repository.ts
│ │ ├── profile.service.ts
│ │ └── type
│ │ ├── profile.dto.ts
│ │ └── profile.type.ts
│ ├── quote
│ │ ├── dto
│ │ │ └── quote.dto.ts
│ │ ├── interface
│ │ │ ├── quote-repository.interface.ts
│ │ │ └── quote-service.interface.ts
│ │ ├── quote.controller.ts
│ │ ├── quote.module.ts
│ │ ├── quote.repository.ts
│ │ ├── quote.service.ts
│ │ └── type
│ │ └── quote.type.ts
│ ├── review
│ │ ├── dto
│ │ │ └── review.dto.ts
│ │ ├── interface
│ │ │ ├── review.repository.interface.ts
│ │ │ └── review.service.interface.ts
│ │ ├── review.controller.ts
│ │ ├── review.module.ts
│ │ ├── review.repository.ts
│ │ ├── review.service.ts
│ │ └── type
│ │ └── review.type.ts
│ ├── s3
│ │ ├── s3.controller.ts
│ │ ├── s3.module.ts
│ │ └── s3.service.ts
│ ├── trainer
│ │ ├── dto
│ │ │ └── trainer.dto.ts
│ │ ├── interface
│ │ │ ├── trainer.repository.interface.ts
│ │ │ └── trainer.service.interface.ts
│ │ ├── trainer.controller.ts
│ │ ├── trainer.module.ts
│ │ ├── trainer.repository.ts
│ │ ├── trainer.service.ts
│ │ └── type
│ │ └── trainer.type.ts
│ ├── user
│ │ ├── dto
│ │ │ └── user.dto.ts
│ │ ├── interface
│ │ │ ├── user.repository.interface.ts
│ │ │ └── user.service.interface.ts
│ │ ├── type
│ │ │ └── user.type.ts
│ │ ├── user.controller.ts
│ │ ├── user.module.ts
│ │ ├── user.repository.ts
│ │ └── user.service.ts
│ └── utils
│ ├── chat-utils.ts
│ ├── date.util.ts
│ ├── filter-sensitive-user-data.ts
│ ├── get-env.ts
│ ├── hashing-password.ts
│ ├── lesson.util.ts
│ └── map-to-role.ts
├── tsconfig.build.json
├── tsconfig.build.tsbuildinfo
├── tsconfig.json
└── README.md
🔝 목차로 돌아가기
🌐 Front-End 배포 사이트
📁 Back-End Repository
📄 1팀 프로젝트 문서
🔝 목차로 돌아가기