Skip to content

세션 완료 화면 즉시 저장 전환 — 진입 자동 저장·되돌아가기 제거 (2026-09-01)

  • 기간: 2026-08-31 ~ 2026-09-01 (2세션 — 구현 519ba1e4, 충돌 해소·e2e 수리·랜딩 d0ddeb46. 오너 방식 A 확정 08-31, 인계 지시: "1021 충돌도 네가 풀어줄래?")
  • 랜딩: PR #1021(ea5ee297) — 프론트 전용(마이그레이션 없음), Vercel 자동 배포
  • 설계서: 없음(방식 A 확정 내용은 PR 본문·이슈 #1017)
  • 정본: WorkoutFlow.tsx(진입 자동 저장 effect·종료 확인 팝업), WorkoutFinish.tsx(버튼 카피·안내/오류 배너), workoutWriteController.ts(saveUiWorkoutSession {stayOpen}·연결 장애 표식), 경계 activeWorkoutCommands.finishAndStay/deleteSaved
  • 도구: 로컬 샌드박스 스택 + Playwright 로컬 실행(실패 재현→트레이스의 요청/응답 실측), DB 프로브(잠복 서버 버그 격리)
  • 게이트: 브라우저 e2e 21케이스(CASE-015는 3회 장애 계약으로 갱신) + case015WriteSurvivalContract 계약 테스트
  • 버그리포트: 없음(이 트랙에서 발견된 서버 잠복 버그는 이슈 #1034로 분리 — 수리 시 작성)
  • 계약: CASE-015 case.json 선언 503 창 1..3, USER-JOURNEY.md/README.md 동조

1. 배경

운동 완료 화면이 "저장 전 확인 화면"이라, 유저가 완료 화면까지 가고도 저장 버튼을 안 누르면 기록이 서버에 없었다. 오너 방식 A: 완료 화면을 "저장된 결과의 마무리 화면"으로 전환 — 종료 확인 팝업 1회 → 완료 화면 진입과 동시에 자동 저장, "한 세트만 더" 되돌아가기 제거, 메모·시간을 고치면 나갈 때 변경분만 한 번 더 반영.

2. 문제 제기 (랜딩 국면)

구현 PR #1021은 Actions 결제 차단기에 작성돼 자기 e2e를 한 번도 돌려보지 못한 채 대기했고, 그 사이 main과 충돌이 쌓였다. CI 복구(#1024) 후 첫 실행에서 e2e 5케이스(CASE-001·004·015·021·022)가 실패.

3. 해결 방안

원칙 = 오너 방식 A 유지, 실패는 스펙 완화가 아니라 실원인 수리. 로컬 재현(Playwright 트레이스에서 요청·응답 실측)으로 원인 3건을 가려 각각 수리.

4. 적용한 내용

  1. main 병합 충돌 해소(cf3d5896): eslint 억제 주석 문구는 main 채택, baseline에 이 트랙 신규 억제 1건 등재. force-push 없음.
  2. 시작 시각 0시·0분 오염 수리(main에도 있던 표시 버그): 완료 화면 시각 초기화가 parseInt(...) || 18/30이라 0이 falsy로 버려져 — 자정 넘겨 00:19에 시작한 운동이 18:19로 표시되고, 정각(00분) 시작은 30분으로 표시됐다. 이 트랙에서는 자동 저장값과 달라져 "값이 바뀌었다" 오판 → 불필요한 수정 저장까지 발동(4케이스 400의 뿌리). 정수 판정으로 보존.
  3. 오프라인 자동 저장은 오류가 아니라 안내: 연결 장애로 자동 저장이 실패하면 컨트롤러가 연결 상태 경고로 이미 기록하므로, 화면은 표식(barbelicConnectivityHandled)을 보고 info 배너("연결이 불안정해 아직 저장하지 못했어요…")만 그린다 — 오류 이벤트·오류 표면 0 계약(e2e 완료 게이트) 준수. 저장 버튼 → 대기열 보관 경로는 종전 그대로.
  4. CASE-015 계약 동조: 진입 자동 저장이 앞에 붙어 선언 503이 2→3회(4회째 실성공). case.json·계약 테스트·여정 문서 갱신.

작업 중 드러난 것 — 서버 잠복 버그 분리(이슈 #1034): 완료 세션 수정(update_completed_session_v4)은 세트를 지우고 다시 만드는데, 통계 롤업의 근거 세트 FK(ON DELETE SET NULL)와 CHECK("관측이 있으면 근거 세트 필수")가 충돌해 — 반복수 기록 종목이 든 세션은 통계 반영 후엔 어떤 경로로든 수정이 23514로 영구 거부된다. 저장→통계 처리→수정 순서의 DB 프로브로 main에서도 재현 확정. 이 트랙과 무관한 기존 버그라 분리.

5. 적용 결과

항목
완료 화면 저장저장 버튼을 눌러야 저장진입 즉시 자동 저장(오너 방식 A), 실패 시 수동 저장 폴백
이 트랙 e2e5/21 실패(한 번도 미실행이라 잠복)21/21 PASS(로컬 + CI run 33409877759)
자정 이후·정각 시작 시각완료 화면에 18:30 계열로 오염 표시실제 시각 그대로
오프라인 완료 진입(신규 경로) 오류 배너+오류 이벤트 이중 기록안내 배너 1개, 이벤트는 연결 경고 1건

미검증(자동 증거 범위 밖): 실기기 감각 품질(배너 톤·팝업 문구의 체감)은 시각 판단 영역.

6. 이번 개선으로 향상된 것

  • 유저 A가 운동을 마치고 "운동 종료"를 확인하면 그 순간 기록이 서버에 있다 — 완료 화면에서 앱을 꺼도 기록이 살아 있고 "진행 중인 운동"으로 되살아나지 않는다.
  • CI 차단기에 랜딩·대기한 묶음의 잠복(낡은 기대·미실행 e2e)을 "실원인 수리 우선" 절차로 걷어내는 선례(#1024에 이어 2번째).

남은 것

  • 이슈 #1034: 완료 화면에서 메모·시간을 실제로 고친 유저는 반영 저장이 같은 서버 버그(23514)에 걸릴 수 있다(실패 배너+재시도 안내는 뜸) — 서버 수리 트랙에서 해소.