개인 풀스택 프로젝트
백엔드 API 설계부터 iOS 앱, 웹, 인프라 배포까지 혼자 개발·운영하는 운동 기록 서비스입니다.
기술 스택
Backend
App (iOS)
Web
Infra
주요 설계 결정
세션-운동-세트 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 = 맨몸'이라는 명확한 의미론을 유지합니다.