ProLogProLog

개인 풀스택 프로젝트

백엔드 API 설계부터 iOS 앱, 웹, 인프라 배포까지 혼자 개발·운영하는 운동 기록 서비스입니다.

GitHub 저장소API 문서 (Swagger)App Store

기술 스택

Backend

Spring Boot 4.0.1메인 API 서버
Java 21Virtual Threads 활용
MySQL 8.4운동 기록·루틴·사용자 데이터
Redis 7.0이메일 인증 코드, JWT 블랙리스트
Spring Security + JWTAccess/Refresh Token 기반 인증

App (iOS)

React Native 0.81 / Expo SDK 54크로스 플랫폼 모바일
TypeScript전체 코드베이스 타입 안전성
Expo Router 6파일 기반 라우팅
NativeWind 4.2TailwindCSS 기반 스타일링

Web

Next.js 15 (App Router)서비스 소개 및 포트폴리오 웹
React 19
TailwindCSS

Infra

AWS EC2API 서버 호스팅
AWS RDSMySQL 관리형 DB
AWS ElastiCacheRedis 관리형 캐시
GitHub ActionsCI/CD 자동 배포
Nginx + SSL리버스 프록시, HTTPS

주요 설계 결정

세션-운동-세트 3단계 구조

workout_sessions → workout_session_exercises → workout_sets 로 계층을 분리해 종목별 순서 변경, 세트 독립 수정, 운동 완료 후 부분 삭제 등 다양한 편집 시나리오를 유연하게 처리합니다.

스냅샷 패턴으로 과거 기록 불변성 보장

운동 세션 저장 시 exercise_name·body_part·routine_title을 스냅샷으로 복사 저장합니다. 이후 종목이나 루틴을 삭제·수정해도 과거 기록이 그대로 유지됩니다.

루틴 삭제 시 ON DELETE SET NULL

루틴 삭제 후에도 해당 루틴으로 운동한 세션 기록을 보존하기 위해 workout_sessions.routine_id를 SET NULL로 설정했습니다. routine_title_snapshot과 함께 '어떤 루틴으로 운동했는지'를 항상 표시할 수 있습니다.

SharedRoutine의 FK 없는 독립 설계

커뮤니티 공유 루틴(SharedRoutine)은 원본 routines 테이블과 FK를 두지 않고 스냅샷으로 저장합니다. 원본 루틴을 수정하거나 삭제해도 공유 게시물이 유지되어 커뮤니티의 안정성을 확보합니다.

맨몸 운동 weight = 0 (NOT NULL)

풀업·딥스 같은 맨몸 운동에서 무게를 NULL이 아닌 0으로 저장합니다. 집계·통계 쿼리에서 NULL 처리 분기를 제거하고 '0kg = 맨몸'이라는 명확한 의미론을 유지합니다.