1. 프로젝트 개요
- FITMATCH(핏매치)
- 핵심 가치: 사용자 위치 기반 운동 시설 추천 및 통합 예약/결제 시스템 제공
- 주요 타겟: 효율적인 운동 시설 예약을 원하는 고객, 클래스 및 매출 관리가 필요한 판매자(센터 운영자), 플랫폼 전체를 관제하는 관리자
2. 담당한 작업
- 기획
- FE
- 어드민 페이지
- 공통 API 클라이언트 및 유틸리티 함수 관리
- 쿠폰 / 포인트 서비스 구현
- 쿠폰 및 포인트 API 모듈 개발
- BE
- 초기 설정
- 클래스, 예약, 센터, 포인트, 리뷰, 쿠폰, 사용자 모듈
- 업로드, 로거, 에러 핸들러, 검증 미들웨어
- 유닛 테스트
- 배포
3. 기술적 성과
- 백엔드 시스템 안정성 및 데이터 무결성 확보
- 참조 무결성을 보장하는 데이터 모델링 (Soft Delete):
- 매출 통계 및 예약 히스토리의 데이터 유실을 방지하기 위해 물리적 삭제 대신 논리적 삭제(Soft Delete) 메커니즘을 도입했습니다.
- Class 및 Schedule 데이터 삭제 시 연관된 예약 데이터의 참조가 깨지지 않도록 설계하여 운영 데이터의 신뢰성을 보장했습니다.
- Type-Safe한 API 통신 및 유효성 검증:
- Zod 의 coerce 기능을 활용하여 쿼리 스트링이나 바디로 넘어오는 데이터의 타입을 엄격하게 변환 및 검증했습니다. 이를 통해 런타임 환경에서 발생할 수 있는 타입 호환성 오류를 제로에 가깝게 제거했습니다.
- 테스트 주도 개발 환경 및 중앙 집중형 에러 처리:
- Prisma Mocking을 통해 DB 의존성을 제거한 독립적인 단위 테스트 환경을 구축했습니다.
- 클라우드 인프라 및 DevOps 자동화
- AWS 기반 확장형 서비스 연동:
- AWS S3 & Multer: 다중 이미지 업로드 및 프로필 관리를 위한 안정적인 파일 업로드 파이프라인을 구축하고, DB와 스토리지 간 데이터 싱크를 맞췄습니다.
- Geocoding API: 사용자 및 센터의 좌표 데이터를 실시간으로 변환/처리하여 위치 기반 추천 서비스와 알림 시스템을 통합 구현했습니다.
- CI/CD 파이프라인 및 배포 최적화:
- GitHub Actions: 프론트엔드와 백엔드 전체에 대한 빌드 및 배포 자동화 워크플로우를 구축하여 개발 생산성을 극대화했습니다.
- Next.js Standalone & PM2: 프론트엔드는 Docker 환경에 최적화된 Standalone 빌드 모드를 적용해 이미지를 경량화했으며, 백엔드는 PM2 클러스터링과 SSL 보안 연결을 적용하여 무중단 운영 환경을 조성했습니다.
4. 문제점 및 해결 과정
- 쿠폰 템플릿과 쿠폰의 강한 결합 문제 (데이터 무결성)
- 문제 상황: 관리자가 '쿠폰 템플릿(찍어내기 위한 원본)'의 할인율이나 내용을 수정/삭제할 경우, 이미 사용자가 발급받은 쿠폰의 정보까지 연쇄적으로 변경되거나 유실되는 문제가 발생했습니다.
- 원인: UserCoupon 테이블이 CouponTemplate 테이블을 단순히 참조만 하고 있어, 원본 데이터에 종속적이었기 때문입니다.
- 해결:
- 스냅샷 패턴 도입: 사용자가 쿠폰을 발급 받는 시점의 만료일, 할인율 등의 정보를 userCoupon 엔티티 내부에 별도 저장하도록 설계했습니다.
- 성과: 이를 통해 템플릿이 변경되더라도 이미 발급된 사용자의 혜택 정보는 변하지 않는 구조를 완성하여 데이터 신뢰성을 확보했습니다.
5. 협업 및 피드백
- 느낀 점
- 기획부터 진행하다 보니 나 혼자만 생각하는 부분이 있던 것 같다
- 그 연장선으로 api 명세가 잦은 변경이 있던것 같다
- 피드백
- 기획 및 설명, 의견 공유를 더 적극적으로 했어야 됐을것 같다
6. 코드 품질 및 최적화
- Zod를 활용한 방어적 프로그래밍: API 요청 시 들어오는 모든 데이터에 대해 Zod 스키마로 런타임 검증을 수행하여, 잘못된 데이터가 DB 로직까지 도달하는 것을 원천 차단했습니다.
- 에러 핸들링 표준화: AppError 클래스를 정의하고 전역 필터에서 에러를 잡아, 프론트엔드에게 항상 일관된 포맷으로 응답을 주도록 통일했습니다.
7. 향후 개선 사항 및 제안