Skip to content

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

Description

@kbh0218

📝 기능 설명

링크 검사 중 화면에서 polling 또는 애니메이션 대기 상태가 20초를 초과하면, 어떤 상황에서도 반드시 검사를 중단하고 재검사 가능한 상태로 전환합니다.

현재 app/(tabs)/(home)/scanning.tsx에는 MAX_POLLING_MS = 30_000 기준으로 polling 제한이 구현되어 있습니다.
하지만 실제 휴대폰에서 테스트한 결과, 검사가 끝났음에도 검사 중 애니메이션이 계속 돌고, 30초가 지나도 화면이 무한 반복되는 상황이 발생했습니다.

따라서 단순히 polling 요청의 최대 시간만 제한하는 것이 아니라, 사용자가 링크 검사 중 화면에서 애니메이션을 보며 기다리는 전체 시간을 20초로 강제 제한합니다.

20초 안에 분석 결과가 정상적으로 도착하면 기존처럼 안전/주의/위험 결과 화면으로 이동합니다.
반대로 20초가 지나도 결과 화면으로 이동하지 못한 경우에는 API 요청 상태, polling 상태, 네비게이션 상태와 관계없이 반드시 검사 중 애니메이션을 멈추고 다시 검사 버튼이 보이는 재검사 상태로 전환합니다.

📋 구현할 Task

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

📎 우선 확인 대상

  • 링크 검사 중 화면

    • app/(tabs)/(home)/scanning.tsx
    • POLLING_INTERVAL_MS
    • MAX_POLLING_MS
    • runAnalysisPolling
    • handleAnalysisResult
    • wait
    • AbortController
    • Promise.race timeout 처리
  • 분석 API

    • api/analyses.ts
    • requestAnalysis
    • fetchAnalysis
  • 결과 화면 이동

    • /(tabs)/(home)/scan-result
    • /(tabs)/(home)/scan-result-caution
    • /(tabs)/(home)/scan-result-block

📎 해결 방향

현재 구조에서는 runAnalysisPolling 내부 deadline과 외부 Promise.race timeout이 모두 30초 기준으로 동작합니다.
이 값을 20초로 줄이는 것만으로는 실기기에서 발생한 무한 애니메이션 상황을 완전히 막지 못할 수 있습니다.

따라서 scanning 화면이 보여진 뒤 20초가 지나면 반드시 실행되는 화면 단위 timeout을 추가합니다.

구현 방향은 다음과 같습니다.

  • 검사 중 화면의 최대 체류 시간을 20_000ms로 정의한다.
  • polling 제한 시간도 동일하게 20_000ms로 맞춘다.
  • 화면 진입 시 20초짜리 timeout을 시작한다.
  • 20초 안에 결과 화면으로 이동하면 timeout을 정리한다.
  • 20초가 지나도 결과 화면으로 이동하지 못하면:
    • 진행 중인 API 요청을 abort한다.
    • polling loop를 중단한다.
    • Lottie 애니메이션을 멈춘다.
    • error 상태를 설정한다.
    • 다시 검사 버튼이 보이는 상태로 전환한다.
  • timeout 이후 늦게 도착한 API 응답이나 polling 결과가 화면 상태를 다시 바꾸지 못하도록 isMounted, hasNavigated, didTimeout 같은 ref 기반 방어 로직을 둔다.

📎 추가 내용

  • 이번 이슈에서는 검사 중 화면의 최대 대기 시간을 20초로 강제하는 것을 목표로 합니다.
  • 사용자가 애니메이션 화면에서 20초 이상 기다리는 상황은 어떤 경우에도 발생하지 않도록 처리합니다.
  • 기존 30초 기준은 제거하고, 기본 정책을 20초로 변경합니다.
  • 정상적으로 20초 안에 분석 결과가 도착하는 경우 기존 결과 화면 이동 흐름은 유지합니다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions