Skip to content

앱 복귀 갱신·검정 바탕 — 중복 인증 처리와 표면 계약 분리 (2026-09-07)

  • 기간: 2026-09-07. 오너 요청: “실제 앱 코드까지 수정”.
  • 랜딩: fix/1344-resume-stability에서 로컬 검증 완료, PR·원격 CI 확인 대상. Production·네이티브 배포와 실기기 시각 결함 해결은 미확인.
  • 설계서: 없음(수리 건). 이슈 #1344의 진단·계획을 근거에 맞게 정정했다.
  • 정본: Native Bridge 표면·관측 계약, authResumePolicy.ts, remoteDataController.ts.
  • 도구: 실제 React controller를 격리 브라우저에서 구동하는 authResume.browser.mjs, iOS Debug의 [barbelic surface] 로그.
  • 게이트: 정책 행동 검사·브라우저 controller 검사·기존 부팅 계약. 브라우저 검사는 test:persistence-browser로 기존 full CI와 ci:local 단계에 포함된다.
  • 버그리포트: 이슈 #1344. 깜빡임의 실제 출처는 아직 확정되지 않았다.
  • 계약: WebView 배경과 검정 부팅 커버를 분리하며, 일반 복귀에서 커버를 추가하지 않는다.

Phase 현황

Phase내용상태
0auth 실제 controller 재현·iOS 관측 준비auth 실패 재현 및 관측 코드 준비. iPhone 계측 미실행
1중복 SIGNED_IN 무동작 처리구현·대상 검증 완료
2네이티브 표면 공급 분리코드·설정 계약 검사 완료. native 컴파일/실기기 미확인
3통합 검증·랜딩로컬 통합 검증 완료. 원격 CI·랜딩은 PR에 기록

1. 배경

메인 화면에서 iPhone 앱을 백그라운드로 내렸다 복귀할 때 검게 한 번 번쩍인다는 보고가 있었다. 리포트·기록·피드에서는 같은 증상이 없다는 관찰이다. 최초 진단은 검정 WebView 바탕과 로그인 이벤트의 반복을 원인으로 확정했으나, 코드상 사실과 시각적 인과가 섞여 있었다.

2. 문제 제기

중복 로그인 이벤트가 사용자 객체뿐 아니라 조회 수명도 바꿨다

Supabase의 세션 복구는 같은 사용자 JSON을 새 객체로 만들고 SIGNED_IN을 다시 보낼 수 있다. controller는 중복 판정 전에 lifecycle 상태를 증가시키고 PR·볼륨 조회를 취소했다. 사용자 채택 앞의 return만 옮기는 수정으로는 이 갱신이 남는다.

배경 설정과 실제 깜빡임의 출처는 다른 검증 대상이다

Capacitor 8.4.0은 최초 opacity를 보관하고 로드 완료에서 복구한다. 따라서 앱 코드의 isOpaque = false 한 줄만으로 복귀 시 투명하다고 확정할 수 없다. 웹 프로세스 종료 후 reload와 네이티브 커버 재등장 경로도 있다. 원형 프로필 마스크는 꺼진 옛 홈 헤더의 코드였다.

3. 해결 방안

원칙

오너는 진단 검토 뒤 실제 코드 수정을 요청했다. 구현은 유효한 인증·복구 의미를 유지하면서 중복 이벤트의 상태 변경만 제거하고, 네이티브 표면 정리와 시각 결함 해결 증거를 구분한다.

접근

선택근거
정상 상태의 동일 user SIGNED_IN만 건너뛰기계정 ID만 비교하면 metadata 변경을 놓칠 수 있어 전체 JSON 의미를 비교한다
WebView 바탕을 공유 설정의 흰색으로 공급실제 모바일 .screen 기본 --surface에 맞추고 부팅 검정과 분리한다
lifecycle 이벤트·커버의 Debug 로그배경/웹 로딩/프로세스 종료 복구 중 실제 검정 출처를 기기에서 구분한다
임시 복귀 커버·추정에 의한 홈 경량화 미도입관측 없는 새 화면 전환이나 UI 변경을 추가할 근거가 없다

4. 적용한 내용

  • authResumePolicy.ts: 정상 auth/data 상태, 프로필·앱 데이터 준비, 동일 owner와 user JSON, 부트스트랩·처리 중인 auth 이벤트 부재를 함께 확인한다. JSON 객체 키 순서는 무시하되 metadata·identities 등의 값 변경은 보존한다.
  • remoteDataController.ts: 판정을 lifecycle 증가보다 앞에서 수행한다. auth/data 상태 ref는 setter에서 동기 갱신하고, 대기 중인 인증 이벤트를 세어 같은 tick의 SIGNED_OUT→SIGNED_IN을 누락하지 않는다.
  • capacitor.config.json: backgroundColor: #ffffff를 공급한다. iOS의 검정/투명 덮어쓰기를 제거하고 Android custom builder도 이 공유 값을 읽는다. Android 창·시스템바는 기존 검정이다.
  • iOS navigation delegate는 완료·프로세스 종료를 기존 Capacitor handler로 전달한다. Debug에서 복귀·navigation·커버 이벤트를 기록한다. Release 로그·사용자·URL·토큰 기록은 없다.
  • 기존 검정 부팅 계약에서 WebView 구문 고정을 제거하고 공유 표면 설정을 별도 검사한다. 정책 테스트와 실제 React hook을 이용한 브라우저 검사를 추가한다.

작업 중 드러난 것

  • React 재렌더와 DOM 재마운트·검정 프레임은 같은 현상이 아니다. 이 테스트는 iOS 프레임을 측정하지 않는다.
  • #eef5f8은 모든 화면의 최종 색이 아니다. 실제 화면 기본색은 흰색이며 홈 히어로는 어둡다.
  • USER_UPDATED·TOKEN_REFRESHED·계정 전환·degraded 복구와 오래된 응답 차단을 유지해야 한다.

5. 적용 결과

항목결과
중복 SIGNED_IN 5회, 실제 controller commit수정 전 4→5로 실패 재현. 수정 후 증가 없음
진행 중인 볼륨 조회중복 SIGNED_IN에 취소되지 않고 정상 완료 결과가 반영됨
유효한 인증 변화metadata 변경·USER_UPDATED·TOKEN_REFRESHED·동일 tick 로그아웃/로그인·부트스트랩·degraded·이전 owner 지연 응답 검증
네이티브 기존 계약관련 59개 통과. native 바이너리 컴파일·실기기 프레임 검증과 구분
정적 검사·웹 빌드최신 main 4e713cc2 통합 후 ci:local verify 6단계 재통과. 일반 테스트 2,944 통과·기존 조건부 23 skip·실패 0
DB·저장 통합schema snapshot 일치, pgTAP 109파일·1,900 assert, 동시 저장 9/9, CRUD 11 통과/기존 1 skip, 빈 계정 7 통과/기존 1 skip, cardio 6/6, persistence/auth browser 4/4
브라우저·화면 크기38/38 및 14/14 통과. 실패·flaky·skip 0
문서·장부VitePress build, coverage inventory strict 및 행동 검사 7/7 통과
iPhone 깜빡임·TestFlight/Production미확인·미배포

로컬 full CI 범위는 단계별로 실행했다. Docker 기본 주소 풀이 소진되어 이번 샌드박스 전용 네트워크를 배정했고, 다른 작업이 4173 포트를 사용 중이라 브라우저·viewport는 45134에서 새 앱을 빌드했다. 저장소 설정을 가져오는 작업용 어댑터로 경로·포트만 바꾸었으며 테스트 발견, 단언, CI=true, 재시도·flaky 실패, 서버 재사용 금지 기준은 같다. 어댑터의 최종 요약 출력에서 예외가 나서 두 Playwright JSON 원본의 통과 수·실패·flaky·전역 오류를 직접 확인했다. 기존 skip은 노트 엔트리 상세(#321), 빈 계정 PR alias 함수 미생성 및 일반 검사의 조건부 항목이며 추가하지 않았다.

첫 head 0a04c1c3의 원격 full CI는 통과했다. 대기 중 B01 인증/API 개선이 main에 먼저 병합되어 landing queue가 최신화를 요구했다. main 4e713cc2를 통합하며 장부 충돌 두 개를 최신 규칙과 실제 추적 파일 목록으로 재생성했고 문서 목록은 양쪽 항목을 보존했다. 새 네이티브 거래 처리의 세션 저장은 controller listener보다 먼저 실행되므로 중복 guard와 독립적임을 확인했다. 통합 후 전체 verify 6단계(2분 36초), 일반 검사 2,944/실패 0/기존 23 skip, persistence·실제 controller 4/4, 네이티브 auth 관련 20/20, docs/admin build를 다시 통과했다. DB·브라우저/viewport의 위 로컬 full 결과는 첫 head 기준이며, 최종 head의 전체 원격 CI는 PR에 기록한다.

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

같은 세션으로 복귀할 때 인증 처리 자체가 추가 commit과 조회 취소를 만들지 않는다. 정상적인 사용자 정보 갱신·재인증은 유지하며 실제 controller 행동 검사가 CI에 남는다. WebView 바탕의 공급처와 검정 부팅 커버의 역할을 분리하여 네이티브 설정을 명확히 했다.

남은 것

Mac에서 iOS 빌드 후 동일 기기·화면·복귀 조건의 수정 전후를 비교해야 한다. 관측 로그와 영상으로 실제 검정의 출처, 밝은색 빈 프레임의 잔존 여부, 커버 해제·입력 상태를 확인한다. Android 변경도 새 빌드에서 시스템바·WebView 표면을 확인해야 한다. 이 기록은 시각 결함 해결 완료 선언이 아니다.