Fitmate개인 개발 리포트

2025. 2. 24. 13:16·기타

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일 이상 메시지가 없을 경우 채팅방을 자동 삭제하는 배치 작업을 도입할 수 있음.

리뷰

  • 리뷰 작성 시 사진 업로드 기능 추가하여 보다 상세한 정보 제공.
  • 트랜잭션을 적용하여 리뷰 저장과 평점 업데이트가 원자적으로 수행되도록 개선

'기타' 카테고리의 다른 글

세션 기반 인증과 토큰 기반 인증  (0) 2024.11.04
'기타' 카테고리의 다른 글
  • 세션 기반 인증과 토큰 기반 인증
작은응애
작은응애
응애부터 으른까지 나의 성장일지
  • 작은응애
    응애개발
    작은응애
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (7)
      • GitHub (0)
      • 백엔드 (5)
        • 자바스크립트 (5)
        • Node.js (0)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    반복문
    JavaScript
    자바스크립트
    조건문
    변수
    switch
    논리 연산자
    데이터타입
    연산자
    js
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
작은응애
Fitmate개인 개발 리포트
상단으로

티스토리툴바