안드로이드 프레임워크·시스템 학습 노트 목차

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)
  • CoroutineWorkerdoWork()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).

진행 상태 관찰·긴 작업

WorkInfoFlow/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.)

Room — 로컬 DB·DAO·관계·마이그레이션Navigation — 화면 이동·백스택·타입 안전 경로