진행 업데이트가 있는 백그라운드 작업: 효과적인 UI 패턴
큐, 상태 모델, UI 메시지, 취소/재시도, 오류 보고를 포함해 진행 업데이트가 있는 백그라운드 작업에 대한 실용적 패턴을 알아보세요.

사용자가 백그라운드 작업 중에 막히는 이유
긴 작업이 UI를 막아서는 안 됩니다. 사람들은 탭을 바꾸거나, 연결을 잃거나, 노트북을 닫거나, 그냥 무슨 일이 일어나고 있는지 궁금해합니다. 화면이 멈추면 사용자는 추측을 하고, 추측은 반복 클릭, 중복 제출, 고객지원 요청으로 이어집니다.
좋은 백그라운드 작업은 결국 신뢰에 관한 것입니다. 사용자는 세 가지를 원합니다:
- 명확한 상태(queued, running, done)
- 시간 감각(대략의 예상 시간이라도)
- 다음 행동이 분명함(기다리기, 계속 작업, 취소, 나중에 돌아오기)
이 중 하나라도 없으면 작업은 잘 돌아가더라도 경험은 끊긴 것처럼 느껴집니다.
흔한 혼동 중 하나는 느린 요청을 실제 백그라운드 작업처럼 다루는 것입니다. 느린 요청은 여전히 사용자가 기다려야 하는 단일 웹 호출입니다. 백그라운드 작업은 다릅니다: 작업을 시작하고 즉시 확인을 받은 뒤, 무거운 처리는 다른 곳에서 이루어져 UI는 계속 사용 가능해야 합니다.
예: 사용자가 고객을 가져오기 위해 CSV를 업로드한다고 합시다. UI가 막히면 새로고침하거나 다시 업로드해서 중복이 생길 수 있습니다. 가져오기가 백그라운드에서 시작되고 UI가 진행과 안전한 취소 옵션이 있는 작업 카드를 보여주면 사용자는 계속 작업하다가 명확한 결과로 돌아올 수 있습니다.
핵심 구성 요소: 작업(job), 큐, 워커, 상태
백그라운드 작업과 진행 업데이트에 대해 말할 때 보통 네 가지가 함께 작동합니다.
작업(job)은 단위 작업입니다: "이 CSV를 가져오기", "이 보고서를 생성하기", "5,000개의 이메일 보내기" 등. 큐는 작업이 처리될 때까지 대기하는 줄입니다. 워커는 큐에서 작업을 가져와 처리합니다(한 번에 하나 또는 병렬로).
UI에서 가장 중요한 것은 작업의 라이프사이클 상태입니다. 상태는 적고 예측 가능하게 유지하세요:
- Queued: 수락되어 워커를 기다리는 중
- Running: 실제로 처리 중
- Done: 성공적으로 완료
- Failed: 오류로 중단됨
모든 작업에는 고유한 참조인 작업 ID가 필요합니다. 사용자가 버튼을 클릭하면 그 ID를 즉시 반환하고 작업 패널에 "작업 시작됨" 행을 보여주세요.
그다음으로는 “지금 무슨 일이 일어나고 있나?”를 묻는 방법이 필요합니다. 보통은 작업 ID를 받아 상태와 진행 세부를 반환하는 상태 엔드포인트(또는 읽기 메서드)가 사용됩니다. UI는 이를 사용해 완료 퍼센트, 현재 단계, 메시지를 표시합니다.
마지막으로 상태는 메모리뿐 아니라 내구성 있는 저장소에 있어야 합니다. 워커가 충돌하거나 앱이 재시작되거나 사용자가 페이지를 새로고침하면 상태가 유지되어야 합니다. 최소한 다음을 저장하세요:
- 현재 상태와 타임스탬프
- 진행 값(퍼센트 또는 카운트)
- 결과 요약(무엇이 생성되거나 변경되었는지)
- 오류 세부(디버깅과 사용자 친화적 메시지를 위해)
플랫폼이 AppMaster 같은 곳이라면 상태 저장소를 다른 데이터 모델처럼 취급하세요: UI는 작업 ID로 읽고 워커는 작업 진행에 따라 이를 업데이트합니다.
워크로드에 맞는 큐 패턴 선택하기
어떤 큐 패턴을 선택하느냐에 따라 앱이 얼마나 "공정하게" 느껴지는지, 예측 가능성이 달라집니다. 작업이 다른 많은 작업 뒤에 쌓이면 사용자에게는 시스템이 불안정한 것처럼 느껴집니다. 따라서 큐 선택은 인프라뿐 아니라 UX 결정입니다.
트래픽이 적고 작업이 짧으며 가끔 재시도를 허용할 수 있다면 단순한 데이터베이스 기반 큐로 충분할 때가 많습니다. 설정이 쉽고 검사도 쉽고 한 곳에 모두 둘 수 있습니다. 예: 관리자 한 명이 소규모 팀을 위해 야간 보고서를 실행하는 경우, 한 번만 재시도해도 큰 문제가 되지 않습니다.
처리량이 증가하거나 작업이 무거워지거나 신뢰성이 필수적이라면 전용 큐 시스템이 필요합니다. 가져오기, 비디오 처리, 대량 알림 등 재시작 시에도 계속 실행되어야 하는 워크플로우는 격리, 가시성, 안전한 재시도 동작이 중요합니다. 이는 사용자에게 보이는 진행에 영향을 줍니다.
큐 구조는 우선순위에도 영향을 줍니다. 하나의 큐는 단순하지만 빠른 작업과 느린 작업을 섞으면 빠른 작업이 느리게 느껴질 수 있습니다. 사용자 트리거 작업이 즉각적으로 느껴져야 하고 예약된 배치 작업이 기다려도 되는 경우 큐를 분리하세요.
동시성 한계를 의도적으로 설정하세요. 병렬성이 너무 높으면 데이터베이스에 과부하가 걸려 진행이 튀어 보일 수 있고, 너무 낮으면 시스템이 답답하게 느껴집니다. 큐별로 작고 예측 가능한 동시성으로 시작하고 완료 시간이 안정적일 때만 늘리세요.
UI에 실제로 보여줄 수 있는 진행 모델 설계
진행 모델이 모호하면 UI도 모호하게 느껴집니다. 시스템이 정직하게 보고할 수 있는 것, 얼마나 자주 바뀌는지, 사용자가 그 정보를 보고 무엇을 해야 하는지 결정하세요.
대부분 작업이 지원할 수 있는 단순 상태 스키마는 다음과 같습니다:
- state: queued, running, succeeded, failed, canceled
- percent: 측정할 수 있을 때 0-100
- message: 사용자가 이해할 수 있는 한 문장
- timestamps: created, started, last_updated, finished
- result_summary: processed, skipped, errors 같은 카운트
다음으로, "진행"이 무엇을 의미하는지 정의하세요.
퍼센트는 분모가 명확할 때(파일의 행 수, 보낼 이메일 수) 유용합니다. 제3자 대기, 가변 연산, 비용이 큰 쿼리처럼 예측할 수 없을 때는 오해를 낳습니다. 그런 경우 단계 기반 진행이 더 신뢰를 줍니다.
실용 규칙:
- 실제로 "X of Y"를 보고할 수 있을 때는 percent 사용
- 지속 시간이 불확실할 때는 steps 사용(예: Validate file, Import, Rebuild indexes, Finalize)
- 둘 다 해당하지 않으면 indeterminate 진행 사용하되 메시지를 자주 갱신
작업이 실행되는 동안 부분 결과를 저장하세요. 그래야 UI가 작업 종료 전에 라이브 오류 카운트나 변경된 미리보기를 보여줄 수 있습니다. CSV 가져오기라면 rows_read, rows_created, rows_updated, rows_rejected와 최근 몇 개의 오류 메시지를 저장하세요.
이것이 사용자들이 신뢰하는 백그라운드 작업의 기초입니다: UI는 침착하게 유지되고 숫자는 움직이며 작업이 끝날 때 "무슨 일이 일어났나" 요약이 준비됩니다.
진행 업데이트 전달 방식: 폴링, 푸시, 하이브리드
백엔드에서 화면으로 진행을 전달하는 부분에서 많은 구현이 실패합니다. 진행이 얼마나 자주 변하는지와 몇 명의 사용자가 지켜볼지를 고려해 전달 방식을 선택하세요.
폴링은 가장 단순합니다: UI가 N초마다 상태를 요청합니다. 좋은 기본값은 사용자가 페이지를 적극적으로 보고 있을 때 2–5초입니다. 작업이 1분보다 길어지면 10–30초로 옮기세요. 탭이 백그라운드면 더 늦추세요.
푸시 업데이트(WebSockets, server-sent events, 모바일 알림)는 진행이 빠르게 변하거나 사용자가 "지금"을 중시할 때 유용합니다. 푸시는 즉시성이 좋지만 연결이 끊겼을 때를 대비한 폴백이 필요합니다.
하이브리드 접근이 종종 최선입니다: 초기에는 빠르게 폴링해 큐에서 실행으로 바뀌는 것을 빠르게 보여주고, 작업이 안정되면 느리게 합니다. 푸시를 추가하면 느린 폴링을 안전망으로 유지하세요.
업데이트가 멈추면 그것을 일급 상태로 취급하세요. "마지막 업데이트 2분 전"을 보여주고 새로고침을 제안하세요. 백엔드에서는 하트비트가 없으면 작업을 stale로 표시하세요.
명확하게 느껴지는 장기 작업을 위한 UI 패턴
명확성은 두 가지에서 옵니다: 작고 예측 가능한 상태 집합, 그리고 다음에 무엇이 일어날지 알려주는 카피.
상태 이름을 백엔드뿐 아니라 UI에도 표시하세요. 작업은 queued(대기), running(처리 중), waiting for input(입력 대기), completed(완료), completed with errors(일부 문제와 함께 완료), failed(실패)처럼 구분될 수 있습니다. 사용자가 이들을 구분하지 못하면 앱이 멈췄다고 가정합니다.
진행 표시 옆에는 평범하고 유용한 문구를 사용하세요. "Importing 3,200 rows (1,140 processed)"는 그냥 "Processing."보다 낫습니다. 한 문장으로: 떠나도 되나요, 무슨 일이 일어나나요? 예: "이 창을 닫아도 됩니다. 백그라운드에서 계속 가져오며 준비되면 알려드립니다."
진행 위치는 사용자의 맥락과 맞아야 합니다:
- 즉시 다음 단계가 막힐 때는 모달이 적당합니다(예: 지금 필요한 송장 PDF 생성).
- 방해하지 말아야 하는 빠른 작업은 토스트가 적합합니다.
- 항목별 작업에는 테이블 행 안의 인라인 진행이 적절합니다.
1분 이상 걸리는 작업에는 결과를 나중에 찾을 수 있도록 간단한 Jobs 페이지(또는 Activity 패널)를 추가하세요.
명확한 장기 작업 UI는 보통 상태 라벨(마지막 업데이트 시간 포함), 진행 바(또는 단계), 한 줄 요약, 안전한 취소 동작, 요약 및 다음 행동을 포함합니다. 완료된 작업은 쉽게 찾을 수 있게 유지하세요.
"오류와 함께 완료"를 사용자 혼란 없이 보고하기
"완료"가 항상 성공을 의미하지는 않습니다. 백그라운드 작업이 9,500건을 처리해 120건이 실패한 경우 사용자는 로그를 보지 않고도 무슨 일이 일어났는지 알아야 합니다.
부분 성공을 일급 결과로 처리하세요. 메인 상태 라인에서 양쪽을 모두 보여주세요: "Imported 9,380 of 9,500. 120 failed." 이렇게 하면 시스템이 정직하게 보이고 작업이 저장되었다는 것을 확인시켜 줍니다.
그다음 사용자에게 조치 가능한 작은 오류 요약을 보여주세요: "필수 필드 누락(63)", "날짜 형식 오류(41)" 등. 최종 상태에서 "Completed with issues"는 "Failed"보다 더 명확할 때가 많습니다. 실패가 전체 실패를 의미하지 않기 때문입니다.
내보낼 수 있는 오류 보고서는 혼란을 할 일 목록으로 바꿉니다. 간단하게 유지하세요: 행 또는 항목 식별자, 오류 범주, 사람이 읽을 수 있는 메시지, 관련 필드 이름.
다음 행동을 요약 근처에 명확히 두세요: 데이터를 수정하고 실패한 항목만 재시도, 오류 보고서 다운로드, 시스템 문제 같으면 지원에 연락.
사용자가 신뢰할 수 있는 취소와 재시도 동작
취소와 재시도는 단순해 보이지만 UI와 시스템이 다르게 동작하면 신뢰를 빠르게 잃습니다. 각 작업 유형에 대해 취소가 무슨 의미인지 정의하고 인터페이스에 정직하게 반영하세요.
일반적으로 두 가지 유효한 취소 모드가 있습니다:
- "지금 중단": 워커가 취소 플래그를 자주 확인하고 빠르게 종료
- "이 단계 이후 중단": 현재 단계는 끝내고 다음 단계 시작 전에 중단
UI에서는 "취소 요청됨" 같은 중간 상태를 보여줘 사용자가 계속 누르지 않게 하세요.
취소를 안전하게 만들려면 작업을 반복 실행 가능하게 설계하세요. 작업이 데이터를 쓴다면 멱등(두 번 실행해도 안전)한 작업을 선호하고 필요한 정리를 하세요. 예: CSV 가져오기가 레코드를 생성하면 작업 실행 ID를 저장해 run #123에서 무엇이 변경되었는지 검토할 수 있게 하세요.
재시도도 동일한 명확성이 필요합니다. 같은 작업 인스턴스를 재개하는 것이 합리적일 때가 있고, 새 타임스탬프와 감사 추적이 있는 새 작업 인스턴스를 만드는 것이 더 안전할 때가 있습니다. 어떤 방식이든 무엇이 재실행되고 무엇이 재실행되지 않는지 설명하세요.
취소와 재시도를 예측 가능하게 유지하는 가드레일:
- 재시도 횟수 제한 및 카운트 표시
- 작업이 실행 중일 때 Retry 비활성화
- 이메일, 결제, 내보내기 등 부작용이 중복될 수 있는 경우 확인 요청
- 세부 패널에 마지막 오류와 마지막 성공 단계 표시
단계별: 클릭에서 완료까지의 엔드투엔드 흐름
좋은 엔드투엔드 흐름의 규칙 하나: UI는 작업 자체를 기다리지 말아야 합니다. UI는 오직 작업 ID만 기다려야 합니다.
흐름(사용자 클릭부터 최종 상태까지)
-
사용자가 작업을 시작하면 API가 빠르게 응답합니다. 사용자가 Import 또는 Generate report를 클릭하면 서버는 즉시 작업 레코드를 생성하고 고유 작업 ID를 반환합니다.
-
작업을 큐에 넣고 첫 상태를 설정합니다. 작업 ID를 큐에 넣고 상태를 queued로, 진행 0%로 설정하세요. 워커가 잡기 전에도 UI에 보여줄 실체를 제공합니다.
-
워커가 실행하고 진행을 보고합니다. 워커가 시작되면 상태를 running으로 설정하고 시작 시간을 저장하며 작은 정직한 증가 단위로 진행을 업데이트하세요. 퍼센트를 측정할 수 없으면 Parsing, Validating, Saving 같은 단계를 보여주세요.
-
UI는 사용자의 방향 감각을 유지합니다. UI는 폴링하거나 구독하고 명확한 상태를 렌더링합니다. 현재 상황을 짧게 설명하고 지금 허용되는 동작만 표시하세요.
-
내구성 있는 결과로 마무리합니다. 완료 시 종료 시간, 출력(다운로드 참조, 생성된 ID, 요약 카운트), 오류 세부를 저장하세요. 오류와 함께 완료된 경우를 별도의 결과로 지원하세요.
취소 및 재시도 규칙
취소는 명시적이어야 합니다: 취소 요청은 취소를 요청하고 워커가 이를 확인해 canceled로 표시합니다. 재시도는 새 작업 ID를 생성해 원본은 기록으로 남기고 무엇이 재실행될지 설명하는 것이 좋습니다.
예시 시나리오: 진행과 부분 실패가 있는 CSV 가져오기
백그라운드 작업과 진행 업데이트가 중요한 흔한 예는 CSV 가져오기입니다. 판매 운영 담당자가 8,420행이 들어 있는 customers.csv를 업로드한다고 가정해 보겠습니다.
업로드 직후 UI는 "버튼을 눌렀음"에서 "작업이 생성되었고 떠나도 된다"로 전환해야 합니다. Imports 페이지에 간단한 작업 카드가 잘 맞습니다:
- 업로드 수신: "파일 업로드됨. 열 검증 중..."
- 대기 중: "사용 가능한 워커를 기다리는 중(앞에 2개 작업)"
- 실행 중: "고객 가져오는 중: 3,180 of 8,420 처리(38%)"
- 마무리: "결과 저장 및 보고서 생성 중..."
실행 중에는 사용자가 신뢰할 수 있는 하나의 진행 숫자(처리된 행 수)와 현재 수행 중인 짧은 상태 라인을 보여주세요. 사용자가 떠나면 Recent jobs 영역에서 작업을 계속 볼 수 있게 하세요.
이제 부분 실패를 추가합니다. 작업이 완료될 때 대부분의 행이 정상이라면 겁나는 Failed 배너를 피하세요. 대신 Finished with issues와 명확한 분리 문구를 사용하세요:
Imported 8,102 customers. Skipped 318 rows.
일반적 원인을 평이한 말로 설명하세요: 잘못된 이메일 형식, 회사 같은 필수 필드 누락, 중복 외부 ID 등. 오류 테이블을 다운로드하거나 행 번호, 고객 이름, 수정해야 할 필드를 보여주는 뷰를 제공하세요.
재시도는 안전하고 구체적으로 느껴져야 합니다. 주요 액션은 "실패한 행만 재시도"가 될 수 있고, 사용자가 CSV를 수정한 뒤 318개 건만 재처리하는 새 작업을 만듭니다. 원본 작업은 읽기 전용으로 남겨 기록이 진실되게 유지되도록 하세요.
마지막으로 결과를 나중에 찾기 쉽게 만드세요. 각 가져오기는 누가 언제 실행했는지, 파일명, 카운트(가져온 수, 건너뛴 수), 오류 보고서 열기 방법 같은 안정된 요약을 가져야 합니다.
혼란스러운 진행과 재시도로 이어지는 흔한 실수
신뢰를 가장 빨리 잃는 방법은 실제와 맞지 않는 숫자를 보여주는 것입니다. 2분 동안 0%에 머물다가 90%로 뛰는 진행 바는 추측처럼 느껴집니다. 진짜 퍼센트를 모르면 단계(Queued, Processing, Finalizing) 또는 "X of Y items processed"를 보여주세요.
또 다른 흔한 문제는 진행을 메모리에만 저장하는 것입니다. 워커가 재시작되면 UI가 작업을 "잊어버리거나" 진행을 리셋합니다. 작업 상태를 내구성 있는 저장소에 저장하고 UI가 그 단일 진실의 원천을 읽도록 하세요.
재시도 UX는 사용자가 같은 작업을 여러 번 시작할 수 있을 때도 망가집니다. Import CSV 버튼이 계속 활성화되어 누군가가 두 번 클릭하면 중복이 발생합니다. 이제 어떤 실행을 수정해야 할지 불명확해집니다.
자주 반복되는 실수들:
- 실제 작업과 맞지 않는 가짜 퍼센트
- 최종 사용자에게 보이는 기술적 오류 덤프(스택 트레이스, 코드)
- 타임아웃, 중복, 멱등성 처리 부족
- 무엇이 재실행되는지 설명 없이 새 작업을 생성하는 재시도
- UI만 바뀌고 워커 동작은 바뀌지 않는 취소
작은 디테일 하나: 사용자 메시지와 개발자 상세를 분리하세요. 사용자에게는 "12행이 검증 실패" 같은 간단한 메시지를 보여주고 기술적 추적은 로그에 보관하세요.
사용자에게 작업을 공개하기 전에 체크리스트
배포 전 사용자가 눈치채는 부분에 대해 빠르게 점검하세요: 명확성, 신뢰, 복구.
모든 작업은 어디서든 보여줄 수 있는 스냅샷을 노출해야 합니다: 상태(queued, running, succeeded, failed, canceled), 진행(0-100 또는 단계), 짧은 메시지, 타임스탬프(created, started, finished), 결과 포인터(출력이나 보고서 위치).
UI 상태를 분명하고 일관되게 만드세요. 사용자는 현재 및 과거 작업을 찾을 수 있는 신뢰할 수 있는 한 곳이 필요합니다. Recent jobs 패널은 반복 클릭과 중복 작업을 예방해 줍니다.
취소와 재시도 규칙을 평이한 언어로 정의하세요. 각 작업 유형에 대해 취소가 무엇을 의미하는지, 재시도가 허용되는지, 무엇을 재사용하는지(같은 입력 또는 새 작업 ID) 결정하세요. 그런 다음 취소 직전 같은 엣지 케이스를 테스트하세요.
부분 실패를 진짜 결과로 취급하세요. "97개 가져옴, 3개 건너뜀" 같은 짧은 요약을 제공하고 사용자가 즉시 사용할 수 있는 조치 가능한 보고서를 제공하세요.
복구 계획을 세우세요. 작업은 재시작을 견뎌야 하고, 멈춘 작업은 명확한 상태로 타임아웃되어 안내("다시 시도" 또는 "작업 ID와 함께 지원에 문의")를 제공해야 합니다.
다음 단계: 하나의 워크플로를 구현하고 확장하세요
사용자 불만이 이미 있는 워크플로 하나를 고르세요: CSV 가져오기, 보고서 내보내기, 대량 이메일 전송, 이미지 처리 등. 작게 시작해 기본을 증명하세요: 작업이 생성되고, 실행되고, 상태를 보고하고, 사용자가 나중에 찾을 수 있게 하세요.
간단한 작업 기록 화면이 가장 큰 품질 향상을 가져오는 경우가 많습니다. 사람들은 스피너를 바라보지 않고 결과를 다시 찾을 장소가 생깁니다.
먼저 하나의 진행 전달 방식을 선택하세요. 버전 1에는 폴링이면 충분합니다. 백엔드에 부담을 주지 않도록 새로고침 간격을 적절히 두되 생동감 있게 느껴지도록 하세요.
재작성 없이 실용적으로 빌드하는 순서:
- 먼저 작업 상태와 전환 구현(queued, running, succeeded, failed, finished-with-errors)
- 기본 필터(지난 24시간, 내 작업만)로 작업 기록 화면 추가
- 정직하게 유지할 수 있을 때만 진행 숫자 추가
- 일관된 정리 보장이 가능해진 후에만 취소 추가
- 작업이 멱등하다고 확신할 때만 재시도 추가
코드를 쓰지 않고 이 작업을 빌드한다면 AppMaster 같은 노코드 플랫폼이 작업 상태 테이블(PostgreSQL)을 모델링하고 워크플로에서 이를 업데이트한 뒤 웹/모바일 UI에 해당 상태를 렌더링하는 데 도움이 됩니다. 백엔드, UI, 백그라운드 로직을 한 곳에서 구축하려는 팀에는 AppMaster (appmaster.io)가 전체 애플리케이션을 위한 설계입니다.
자주 묻는 질문
백그라운드 작업은 빠르게 시작되고 즉시 작업 ID를 반환하므로 UI가 계속 사용 가능해집니다. 반면 느린 요청은 같은 웹 호출이 끝날 때까지 사용자를 기다리게 하며, 이는 새로고침, 더블클릭, 중복 제출을 유발합니다.
단순하게 유지하세요: queued, running, done, failed(취소를 지원하면 canceled 추가). 대부분 작업이 성공했지만 일부 항목이 실패한 경우에는 사용자가 모든 것이 사라졌다고 생각하지 않도록 “done with issues(문제 있음)” 같은 별도의 결과 상태를 추가하세요.
사용자가 작업을 시작하면 서버가 즉시 고유한 작업 ID를 반환하고, 그 ID로 작업 행이나 카드를 렌더링하세요. UI는 작업 ID로 상태를 읽어 새로고침하거나 탭을 바꿔도 작업을 잃지 않게 됩니다.
작업 상태는 메모리가 아닌 내구성 있는 데이터베이스 테이블에 저장하세요. 현재 상태, 타임스탬프, 진행값, 짧은 사용자 메시지, 결과 또는 오류 요약을 저장하면 재시작 후에도 동일한 뷰를 재구성할 수 있습니다.
정직하게 “X 중 Y”를 보고할 수 있을 때만 퍼센트를 사용하세요. 실측 분모가 없으면 Validating, Importing, Finalizing 같은 단계 기반 진행을 보여주고 메시지를 자주 갱신해 사용자가 전진을 느끼게 하세요.
폴링이 가장 단순하며 대부분의 앱에 충분합니다. 사용자가 보고 있을 때는 2–5초 간격으로 시작하고 작업이 길어지면 간격을 늘리세요. 푸시는 더 즉각적이지만 연결이 끊길 때 대체 수단이 필요합니다. 보통 하이브리드 접근(초기 빠른 폴링 → 느린 폴링 + 푸시 백업)이 가장 좋습니다.
업데이트가 멈추면 가짜로 활성 상태를 유지하지 말고 “마지막 업데이트 2분 전”처럼 오래된 상태를 표시하고 수동 새로고침을 제안하세요. 백엔드에서는 하트비트가 없으면 작업을 stale로 표시해 재시도 또는 지원에 문의하라는 안내로 옮기세요.
다음 행동을 분명히 하세요: 사용자가 계속 작업할 수 있는지, 페이지를 떠나도 되는지, 안전하게 취소할 수 있는지. 1분 이상 걸리는 작업에는 별도의 Jobs 또는 Activity 뷰를 만들어 사용자가 결과를 나중에 찾을 수 있게 하세요.
부분 실패를 일급 결과로 취급하고 양측 모두 표시하세요: 예: “9,380 of 9,500이 가져와졌습니다. 120개 실패.” 그런 다음 사용자가 즉시 조치할 수 있는 간단한 오류 요약을 제공하고 기술적 세부사항은 내부 로그에 보관하세요.
작업별로 취소의 의미를 정의하고 UI에 정직하게 반영하세요. 중간 상태(예: “취소 요청됨”)를 보여줘 사용자가 계속 누르지 않게 하세요. 작업을 멱등하게 설계하고 재시도 횟수를 제한하며, 재시도 시 동일 작업을 재개할지 새 작업을 만들지 명확히 설명하세요.


