WorkManager — 지연 가능·보장되는 백그라운드 작업
"앱이 닫혀도, 재부팅돼도 반드시 실행돼야 하는" 백그라운드 작업 — 사진 업로드, 로그 동기화, 주기적 백업 — 은 그냥 코루틴이나 Service로는 위태롭다(앱이 죽으면 사라짐, OS가 백그라운드를 제한). WorkManager는 이런 지연 가능하고(deferrable) 보장이 필요한(guaranteed) 작업의 공식 해법이다 — 앱·기기 재시작에도 살아남고, Doze·배터리 제약을 알아서 다룬다. (출처: Android — WorkManager.)
언제 WorkManager인가
백그라운드 작업의 세 갈래를 구분해야 한다.
WorkManager는 *"지금 당장은 아니어도 되지만, 언젠가 반드시"*인 작업에 쓴다 — *내부적으로 적절한 스케줄러(JobScheduler 등)*를 쓰고 작업을 DB에 영속화해 앱이 죽거나 기기가 재부팅돼도 실행을 보장한다.
Worker 정의와 실행
class SyncWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
override suspend fun doWork(): Result {
return try {
repository.sync() // suspend 작업
Result.success()
} catch (e: IOException) {
Result.retry() // 백오프 후 재시도
}
}
}
// 제약 + 1회 작업 예약
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 네트워크 있을 때만
.setRequiresCharging(true) // 충전 중일 때만
.build()
val request = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context).enqueue(request)
CoroutineWorker—doWork()가 suspend라 코루틴을 자연스럽게. 결과는success/retry/failure.- 제약(Constraints) — 네트워크·충전·유휴·저장공간 조건이 맞을 때만 실행.
- 백오프(backoff) — 실패 시 재시도 간격(선형/지수).
주기적 작업·체이닝·고유 작업
// 주기적 (최소 15분 간격)
val daily = PeriodicWorkRequestBuilder<BackupWorker>(1, TimeUnit.DAYS).build()
// 체이닝 — 압축 → 업로드 순차
WorkManager.getInstance(ctx)
.beginWith(compressWork)
.then(uploadWork)
.enqueue()
// 고유 작업 — 같은 이름은 중복 예약 방지
WorkManager.getInstance(ctx).enqueueUniqueWork(
"sync", ExistingWorkPolicy.KEEP, request)
PeriodicWorkRequest— 반복 작업(최소 주기 15분).- 체이닝 —
beginWith().then()으로 순차·병렬 의존을 구성. - 고유 작업(unique work) — 같은 이름의 중복 예약 방지(KEEP/REPLACE).
진행 상태 관찰·긴 작업
WorkInfo를 Flow/LiveData로 관찰해 진행·완료·실패를 UI에 반영한다. 오래 걸리는 작업은 setForeground()로 포그라운드 서비스로 승격(알림 표시)해 OS가 덜 죽이게 한다.
정리 — 지연 가능·보장 작업의 표준
WorkManager의 핵심 — 지연 가능하고 반드시 실행돼야 하는 작업(동기화·업로드·백업)을 앱·재부팅에도 보장, CoroutineWorker.doWork()(success/retry/failure), 제약(네트워크·충전)·백오프·주기·체이닝·고유 작업, Doze·배터리 제한을 알아서 처리. "즉시·화면 동안"은 코루틴, "즉시·사용자 인지"는 포그라운드 서비스, "지연·보장"은 WorkManager — 이 구분이 백그라운드 작업의 출발점이다.
한 줄 요약 — WorkManager=지연 가능+보장 백그라운드(앱·재부팅 생존, Doze 처리).
CoroutineWorker.doWork()→success/retry/failure. Constraints(네트워크·충전)·backoff·PeriodicWorkRequest(≥15분)·체이닝(beginWith/then)·고유 작업(KEEP/REPLACE). 즉시·화면 동안은 코루틴, 즉시·인지는 포그라운드 서비스.
(출처: Android — WorkManager / Define work requests / Background work overview / Background tasks guide.)