Skip to content

[FIX] 링크 검사 polling 20초 초과 시 강제 중단 처리#73

Merged
kbh0218 merged 3 commits into
devfrom
fix/#67-stop-polling-timeout
May 29, 2026
Merged

[FIX] 링크 검사 polling 20초 초과 시 강제 중단 처리#73
kbh0218 merged 3 commits into
devfrom
fix/#67-stop-polling-timeout

Conversation

@kbh0218

@kbh0218 kbh0218 commented May 27, 2026

Copy link
Copy Markdown
Contributor

Closes #67

개요

링크 검사 중 화면의 최대 대기 시간을 20초로 조정하고, 20초를 초과하면 재검사 가능한 상태로 전환되도록 timeout 처리를 강화했습니다.

기존 app/(tabs)/(home)/scanning.tsx에는 MAX_POLLING_MS = 30_000 기준의 polling 제한이 있었지만, 실제 휴대폰 테스트 중 검사 결과 화면을 여러 번 거치고 뒤로가기를 반복하는 상황에서 보안 검사 중입니다 애니메이션이 무한히 도는 문제가 발생했습니다.

이 문제는 단순히 polling 요청 시작 시점 기준 timeout만으로는 충분히 막기 어려웠습니다. 중복 검사나 뒤로가기 흐름으로 오래된 scanning 화면이 다시 보이는 경우, 사용자 입장에서는 애니메이션이 계속 도는 화면을 보고 있지만 기존 polling timeout 관리 흐름은 이미 정리되었거나 기대한 run과 분리될 수 있기 때문입니다.

따라서 이번 작업에서는 기준을 이중화했습니다.

  1. polling/request 기준 20초 timeout
    분석 요청과 polling loop 자체가 20초를 넘지 않도록 제한합니다.

  2. 화면/애니메이션 기준 20초 watchdog
    화면이 focus되어 있고 Lottie 애니메이션이 도는 상태가 되면, polling 상태와 관계없이 20초 후 반드시 timeout 상태로 전환합니다.

이를 통해 API 요청, polling, 네비게이션 상태가 꼬이더라도 사용자가 검사 중 애니메이션 화면에서 20초 이상 무한 대기하지 않도록 보완했습니다.

주요 구현 내용

  • 기존 MAX_POLLING_MS = 30_000 제거
  • 검사 화면 timeout 정책 상수 SCAN_SCREEN_TIMEOUT_MS = 20_000 추가
  • polling 내부 deadline을 20초 기준으로 변경
  • 검사 화면 단위 20초 timeout 추가
  • 화면 focus 여부를 기준으로 애니메이션 표시 상태 감지
  • Lottie 애니메이션이 보이는 상태 기준 20초 watchdog 추가
  • timeout 발생 시 현재 진행 중인 요청을 AbortController.abort()로 정리
  • timeout 발생 시 error 상태로 전환해 Lottie 애니메이션 중단
  • timeout 후 검사를 완료하지 못했어요, 다시 검사, 돌아가기 표시
  • timeout 이후 늦게 도착한 polling 결과가 결과 화면으로 이동시키지 않도록 guard 추가
  • 정상 결과 화면 이동 시 timeout이 뒤늦게 error 상태를 만들지 않도록 guard 추가
  • retry/unmount 시 기존 timeout과 abort controller 정리

파일별 역할

  • app/(tabs)/(home)/scanning.tsx: polling timeout, 화면 단위 timeout, 애니메이션 visible watchdog, abort/cleanup, 늦은 결과 이동 방어 처리

해결한 이슈 목록

  • app/(tabs)/(home)/scanning.tsx의 현재 polling 흐름 확인
  • 기존 MAX_POLLING_MS = 30_000 기준 제거
  • polling 최대 대기 시간과 검사 중 화면 체류 시간을 20_000ms 기준으로 통일
  • 20초 제한 값을 SCAN_SCREEN_TIMEOUT_MS 상수로 분리
  • 분석 요청 POST /api/v1/analyses가 지연되는 경우에도 20초 후 timeout 처리
  • 분석 조회 GET /api/v1/analyses/{analysisId} polling이 지연되는 경우에도 20초 후 timeout 처리
  • polling 내부 deadline뿐 아니라 화면 단위 timeout 추가
  • 애니메이션이 도는 화면 기준의 20초 watchdog 추가
  • timeout 발생 시 AbortController.abort()로 진행 중인 요청 정리
  • timeout 발생 후 Lottie 애니메이션이 계속 재생되지 않도록 error 상태 전환
  • timeout 발생 후 검사를 완료하지 못했어요 문구와 다시 검사 버튼 표시
  • timeout 발생 후 뒤늦게 도착한 API 응답이 결과 화면으로 이동시키지 않도록 방어
  • 결과 화면으로 이미 정상 이동한 경우 timeout 에러 상태가 뒤늦게 반영되지 않도록 방어
  • 다시 검사 버튼을 누르면 기존 URL로 새 검사가 재시작되도록 기존 retry 흐름 유지
  • 재검사 시 이전 timeout, 이전 abort controller, 이전 polling 요청이 남아 상태를 바꾸지 않도록 cleanup 처리
  • 컴포넌트 unmount 시 timeout과 polling timer 정리
  • Android 에뮬레이터에서 정상 결과 이동 및 20초 timeout 동작 확인
  • Android 실제 휴대폰에서 검사 중 화면이 20초 이상 무한 반복되지 않는지 확인

체크 사항

  • 커밋/코딩 컨벤션에 맞게 작성
  • 기존 정상 결과 화면 이동 흐름 유지
  • 기존 timeout/error 문구 및 재검사 UI 흐름 유지
  • polling 기준 timeout과 애니메이션 기준 watchdog을 함께 적용
  • timeout 이후 늦은 응답으로 인한 결과 화면 이동 방지

참고사항

  • 기준을 이중화한 이유는 polling timeout만으로는 오래된 scanning 화면이 다시 보이는 상황을 완전히 방어하기 어렵기 때문입니다.
  • 사용자가 실제로 보고 있는 것은 polling 상태가 아니라 애니메이션 화면이므로, 화면 focus 및 Lottie 재생 상태를 기준으로 한 watchdog을 추가했습니다.
  • 검사 여러 번 시작으로 인한 중복 입력 문제는 별도 브랜치에서 처리되었고, 이번 PR은 이미 꼬인 상태에서도 검사 중 화면이 20초 이상 지속되지 않도록 하는 안전장치에 집중했습니다.
  • Android 실제 기기 및 에뮬레이터에서의 최종 수동 확인은 추가 확인이 필요합니다.

Screenshots or Video

  • 같은 버그를 재현후, 확인해보니 캡쳐본과 같이 잘 적용되는것을 확인하였습니다.
image

@kbh0218 kbh0218 requested review from minsoo0506 and sunm2n May 27, 2026 08:29
@kbh0218 kbh0218 self-assigned this May 27, 2026
@kbh0218 kbh0218 changed the title fix: 링크 검사 20초 timeout 처리 [FIX] 링크 검사 polling 15초 초과 시 강제 중단 처리 May 27, 2026
@kbh0218 kbh0218 changed the title [FIX] 링크 검사 polling 15초 초과 시 강제 중단 처리 [FIX] 링크 검사 polling 20초 초과 시 강제 중단 처리 May 29, 2026
@kbh0218

kbh0218 commented May 29, 2026

Copy link
Copy Markdown
Contributor Author

추가 수정 사항이 있어 수정하였습니다!

정상 검사 결과가 도착해서 결과 화면으로 이동하는 시점과, 검사 화면의 20초 watchdog timeout이 거의 동시에 실행될 수 있는 레이스 케이스를 보완했습니다.

기존에는 onNavigate에서 정상 결과 화면 이동을 시작하더라도, 화면 전환이 완전히 끝나기 전에 watchdog timeout 콜백이 뒤늦게 실행되면 timeout error state가 다시 세팅될 가능성이 있었습니다.

이를 막기 위해 hasNavigatedRef를 추가했습니다.

  • 검사 시작 시 hasNavigatedRef.current = false로 초기화
  • 정상 결과 화면 이동 시 hasNavigatedRef.current = true로 변경
  • watchdog timeout 콜백 실행 시 이미 결과 화면 이동이 시작된 상태라면 timeout 처리 없이 return

이렇게 해서 PR 의도였던 “정상 결과 화면 이동 시 timeout 에러 상태가 뒤늦게 반영되지 않도록 방어”가 애니메이션 watchdog 쪽에도 적용되도록 했습니다.

@kbh0218 kbh0218 merged commit e3819b0 into dev May 29, 2026
@kbh0218 kbh0218 deleted the fix/#67-stop-polling-timeout branch May 29, 2026 14:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FIX] 링크 검사 polling 15초 초과 시 강제 중단 처리

1 participant