1. 프로젝트 개요
핏메이트는 운동 전문가(강사)와 운동을 배우고싶은 유저를 연결하여,
1:1 맞춤형 운동 프로그램을 제공하는 서비스입니다.
유저는 자신의 운동 목표, 선호도에 맞는 운동 강사를 찾아 맞춤형 운동 지도를 받을 수 있으며
이를 통해 보다 효율적이고 지속 가능한 운동 계획을 세울 수 있습니다.
강사는 유저의 목표와 상황에 맞춘 체계적인 운동 계획을 제시하고
지도를 통해 유저가 올바른 운동 습관을 형성하도록 돕습니다.
2. 담당한 작업
트레이너 관리 기능
- 트레이너 목록 조회 API 개발 (페이징 및 정렬 기능 포함)
- 특정 트레이너에 대한 찜(즐겨찾기) 등록 및 해제 기능 구현
- 찜한 트레이너 목록 조회 기능 추가
- 트레이너의 리뷰 수 및 평점 관리 기능 추가
리뷰 시스템
- 트레이너에 대한 리뷰 작성 기능 개발
- 특정 트레이너의 리뷰 목록 조회 API 구현 (페이징 적용)
- 사용자가 작성한 리뷰 목록 조회 기능 추가
- 리뷰 작성 시 검증 로직 추가 (레슨이 완료된 경우만 리뷰 작성 가능)
- 리뷰 작성 후 트레이너의 평균 평점 및 리뷰 수 자동 업데이트
실시간 채팅 기능
- 유저 간 1:1 채팅방 생성 및 메시지 전송 기능 구현
- 채팅 메시지 조회 API 개발 (페이징 적용)
- 로그인한 사용자의 채팅방 목록 조회 기능 추가
- 채팅방 나가기 기능 구현 (한 명만 나가면 유지, 모두 나가면 삭제)
- 채팅 데이터 저장을 위해 MongoDB 및 Socket.io 기반의 웹소켓 시스템 구축
3. 기술적 성과
트레이너 및 리뷰 시스템 개선
- NestJS의 DTO를 활용하여 데이터 유효성 검증을 강화하여 입력 오류 방지
- Prisma ORM을 사용하여 트레이너 찜 기능 및 리뷰 관리 최적화
- 리뷰 작성 후 트레이너 평점 및 리뷰 수 자동 업데이트 적용
채팅 기능 개선
- MongoDB 및 Socket.io 기반의 채팅 시스템 구축
- 페이징 적용하여 채팅 메시지 조회 성능 개선
- 나간 채팅방은 조회되지 않도록 필터링하여 UI/UX 개선
4. 문제점 및 해결 과정
채팅방 나가기 시 메시지 유지/삭제 문제
⛔ 발생 문제:
- 기존 로직에서는 유저가 한 명이라도 채팅방을 나가면 자동으로 채팅방과 메시지가 모두 삭제됨.
- 하지만 한 명만 나간 경우, 남아 있는 사용자가 대화 내용을 볼 수 있어야함
🔍 원인 분석:
- 기존 로직에서는 채팅방에서 어느 한 명이라도 나가면 chatRoom이 삭제됨.
- 유저의 나가기 여부를 별도로 저장하지 않아서, 나간 후 그간의 채팅을 볼 수 없었음
✅ 해결 방법:
- chatRoom 스키마에 left_participant1, left_participant2 필드 추가하여 각 유저의 나가기 여부 관리.
- 한 명만 나갈 경우 채팅방 유지, 두 명 모두 나가야 삭제되도록 로직 수정.
- getMyChatRooms API에서 나간 채팅방은 조회되지 않도록 필터링.
리뷰 작성 시 중복 생성 방지 문제
⛔ 발생 문제:
- 같은 견적에 대해 중복 리뷰 작성 가능했던 문제 발생.
- API 호출 시 검증 로직이 부족하여 같은 견적에 여러 개의 리뷰가 저장될 수 있었음.
🔍 원인 분석:
- createReview 메서드에서 리뷰 존재 여부를 확인하지 않고 바로 저장함.
✅ 해결 방법:
- review.repository.ts의 findByLessonQuoteId 메서드를 사용하여 리뷰 중복 여부 확인.
- 이미 존재하는 리뷰가 있으면 BadRequestException을 발생시켜 중복 작성 방지.
5. 협업 및 피드백
효율적인 협업
- Git 브랜치 전략을 활용하여 기능별 개발 진행 및 코드 리뷰 절차 수행.
- Issues와 PR을 통해 팀원들과 코드 리뷰 및 개선 사항 논의.
지식 공유
- NestJS 모듈화 및 3-Tier Architecture에 대한 논의 및 문서 공유.
- Socket.io 및 웹소켓 통신 방식에 대한 학습 및 공유 세션 진행.
문제 발생 시 신속한 대응
- Notion 및 Slack을 활용한 실시간 피드백 공유 및 이슈 해결.
6. 코드 품질 및 최적화
DTO를 활용한 데이터 검증 및 중복 코드 제거
- 공통 DTO를 생성하여 페이징 관련 중복 코드 제거.
- Transform을 활용하여 page와 limit 값을 string → number 변환.
서비스-레포지토리 계층 분리
- Service에서 비즈니스 로직을 처리하고, Repository에서 DB 접근을 담당하도록 구조화.
- chat.service.ts에서 DB 조회 로직을 repository로 위임하여 서비스 코드 단순화.
웹소켓 이벤트 최적화
- Socket.io의 Room 기반 메시지 전송을 활용하여 불필요한 네트워크 부하 감소.
- 유저가 채팅방을 나가면 leaveRoom 이벤트 발생 → 실시간 UI 반영.
7. 향후 개선 사항 및 제안
채팅방 자동 삭제 기능 추가
- 현재는 두 명 모두 나가야 채팅방이 삭제됨.
- 일정 기간 동안 대화가 없을 경우 자동 삭제 기능 추가 필요.
- 예를 들어, 30일 이상 메시지가 없을 경우 채팅방을 자동 삭제하는 배치 작업을 도입할 수 있음.
리뷰
- 리뷰 작성 시 사진 업로드 기능 추가하여 보다 상세한 정보 제공.
- 트랜잭션을 적용하여 리뷰 저장과 평점 업데이트가 원자적으로 수행되도록 개선