WorkManager — 개념, API 및 작업 스케줄링

저자: IT Sectr 게시일: 2026-03-27 읽는 시간: 8 분

WorkManager는 지연 및 백그라운드 작업을 보장된 실행으로 수행하도록 설계된 Android Jetpack 라이브러리입니다. Service나 JobScheduler와 달리 WorkManager는 작업 수명 주기를 관리합니다. 실패 시 다시 시작하고, Android 버전에 적응하며, 기기 제약 조건을 고려합니다. Android Developers, 2026에 따르면 WorkManager는 최신 Android 개발에서 대부분의 백그라운드 작업에 선호되는 솔루션입니다.

주요 포인트

  • WorkManager는 Android 버전에 관계없이 보장된 실행으로 백그라운드 작업을 위한 Jetpack 라이브러리입니다.
  • Worker는 백그라운드 작업 로직을 정의하는 기본 클래스로, 라이브러리가 별도 스레드에서 실행합니다.
  • WorkRequest는 일회성(OneTimeWorkRequest) 및 정기적(PeriodicWorkRequest, 최소 15분 간격)이 있습니다.
  • 작업 체인을 통해 여러 Worker를 순차적 또는 병렬로 실행할 수 있습니다.
  • 제약 조건은 시작 조건(배터리 충전, 네트워크 연결, 저장소 상태)을 정의합니다.

WorkManager란?

WorkManager는 Android Jetpack의 일부로, 앱이 포그라운드에 있거나 사용자가 닫았는지에 관계없이 보장된 실행이 필요한 백그라운드 작업을 관리하기 위한 라이브러리입니다. 이 라이브러리는 API 14+를 지원하며 적절한 실행 메커니즘을 자동으로 선택합니다: Android 5+에서는 JobScheduler, 이전 버전에서는 BroadcastReceiver + AlarmManager.

WorkManager의 주요 기능은 보장된 실행입니다. 기기 재부팅, 앱 종료 또는 충돌로 인해 작업이 완료되지 않은 경우 WorkManager는 다음 기회에 다시 시작합니다.这使得 라이브러리를 실행 중요한 작업(분석 전송, 데이터베이스 동기화, 로그 업로드)에 이상적인 선택으로 만듭니다.

Background Service와 달리 WorkManager는 스레드 및 수명 주기 관리가 필요하지 않습니다. 라이브러리 자체가 스레드 풀을 만들고, Doze Mode를 처리하며, Android 버전을 고려하고, API 수준에 관계없이 통합된 API를 제공합니다. Coroutine 및 RxJava 지원은 각각 CoroutineWorker 및 RxWorker를 통해 사용할 수 있습니다.

LiveData를 통한 상태 관찰

WorkManager는 작업 상태를 추적하기 위한 기본 제공 LiveData 지원을 제공합니다. getWorkInfoByIdLiveData 메서드는 LiveData<WorkInfo>를 반환하며, ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED와 같은 상태 변경 시 업데이트됩니다. 이를 통해 UI 구성 요소는 Lifecycle-aware 구성 요소 덕분에 스케줄러를 수동으로 폴링하거나 메모리 누수 없이 변경 사항에 반응할 수 있습니다.

kotlin
WorkManager.getInstance(context)
    .getWorkInfoByIdLiveData(syncRequest.id)
    .observe(viewLifecycleOwner) { workInfo ->
        when (workInfo.state) {
            WorkInfo.State.SUCCEEDED ->
                showSuccess()
            WorkInfo.State.FAILED ->
                showError(workInfo.outputData)
            else ->
                showProgress()
        }
    }

WorkManager 작동 방식

WorkManager의 아키텍처는 Worker, WorkRequest 및 WorkManager의 세 가지 기본 클래스를 중심으로 구축됩니다. Worker는 작업 로직을 포함하고, WorkRequest는 실행 매개변수를 설명하며, WorkManager는 큐와 스케줄링을 관리합니다. 라이브러리는 내부 Room 데이터베이스를 사용하여 모든 작업의 상태를 저장합니다.

Worker 및 WorkRequest

Worker는 백그라운드 스레드에서 호출되는 단일 메서드 doWork를 가진 추상 클래스입니다. 메서드는 ListenableWorker.Result — SUCCESS, FAILURE 또는 RETRY를 반환합니다. WorkRequest는 Worker를 매개변수(타임아웃, 태그, 초기 지연, 제약 조건)와 연결합니다.

kotlin
class SyncWorker(
    context: Context,
    params: WorkerParameters
) : Worker(context, params) {

    override fun doWork(): Result {
        return try {
            val api = RetrofitClient.api
            val response = api.syncData()
            Result.success()
        } catch (e: Exception) {
            Result.retry()
        }
    }
}

WorkManager를 통한 스케줄링

WorkManager는 Android 버전에 관계없이 작업을 균일하게 예약합니다. enqueue를 호출하면 라이브러리는 작업을 Room에 저장하고, 현재 조건을 평가하며, 최적의 실행 시간을 선택합니다. 내부적으로 JobScheduler, AlarmManager 또는 자체 스케줄러를 사용할 수 있으며 개발자는 이에 대해 걱정할 필요가 없습니다.

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

WorkRequest 유형

WorkManager는 일회성 및 정기적 두 가지 유형의 실행 요청을 지원합니다. 유형 선택은 시나리오에 따라 다릅니다: 작업을 한 번 실행해야 하거나 지정된 간격으로 반복해야 합니다.

OneTimeWorkRequest

OneTimeWorkRequest는 한 번만 실행해야 하는 작업을 위해 설계되었습니다. 로그 제출, 인증 후 데이터 동기화, 첫 실행 시 구성 다운로드 등이 해당됩니다. 지연은 setInitialDelay를 통해, 제약 조건은 setConstraints를 통해 설정됩니다.

PeriodicWorkRequest

PeriodicWorkRequest는 최소 15분 간격의 반복 작업에 적합합니다. 라이브러리는 실행 간 간격이 지정된 것보다 짧지 않음을 보장하지만, 기기 제약 조건으로 인해 더 길어질 수 있습니다. 15분 미만의 빈도가 필요한 작업은 Foreground Service에서 Handler 또는 Timer를 사용하세요.

매개변수OneTimeWorkRequestPeriodicWorkRequest
빈도일회성반복(최소 15분)
횟수1회 실행취소까지
지연setInitialDelaysetInitialDelay
체인지원불가
용도다운로드, 동기화모니터링, 폴링

제약 조건 설정 및 작업 체인

WorkManager의 제약 조건을 통해 작업을 시작할 수 있는 조건을 설정할 수 있습니다: 네트워크 연결(NetworkType), 배터리 수준(batteryNotLow), 저장소 상태(StorageNotLow) 및 유휴 모드(DeviceIdle). 모든 제약 조건이 충족될 때까지 작업이 시작되지 않습니다.

kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
    .setConstraints(constraints)
    .build()

체인을 통해 작업의 순차적 또는 병렬 실행을 구성할 수 있습니다. beginWith가 체인을 시작하고, then이 이전 작업의 성공적인 완료 후 실행될 다음 Worker를 추가합니다. 병렬 실행을 위해서는 workManager.enqueue(listOf(request1, request2))를 사용하세요.

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup 순차적으로

JobScheduler에서 WorkManager로 마이그레이션

JobScheduler는 Android 5(API 21)에서 백그라운드 작업을 예약하기 위한 시스템 서비스로 도입되었습니다. WorkManager는 이를 대체하여 자동 마이그레이션과 추가 기능(체인, 실행 보장, 태그, LiveData를 통한 상태 관찰)을 갖춘 크로스 플랫폼 API를 제공합니다.

JobScheduler에서 WorkManager로 마이그레이션할 때는 JobService를 Worker로 변환하고, JobInfo를 WorkRequest로, Context.getSystemService를 WorkManager API로 교체해야 합니다. WorkManager는 호환성 문제를 자동으로 처리하고 수동 JobScheduler 구현보다 Doze Mode를 더 정확하게 처리합니다. 마이그레이션 단계: 1) Worker 클래스 생성, 2) 동일한 조건으로 WorkRequest 구축, 3) 코드와 매니페스트에서 JobService 및 JobInfo 제거.

고유 작업을 위한 UniqueWork

WorkManager는 ExistingWorkPolicy를 통해 고유 작업 개념을 지원합니다. 지정된 이름의 작업이 이미 존재하는 경우 정책이 동작을 결정합니다: KEEP(새로 생성하지 않음), REPLACE(기존 작업 교체), APPEND(체인 끝에 추가), APPEND_OR_REPLACE. UniqueWorkRequest는 중복되어서는 안 되는 작업(데이터베이스 동기화, 구성 다운로드, 분석 배치 전송)에 편리합니다.

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

진행 및 중간 결과 처리

CoroutineWorker는 setProgress 메커니즘을 지원하여 중간 실행 결과를 전달할 수 있습니다. 이는 장기 실행 작업(대용량 파일 다운로드, 배치 이미지 처리, 데이터베이스 마이그레이션)에 유용합니다. UI는 getWorkInfosByTagLiveData를 통해 업데이트를 구독하고 실시간 진행 상황을 표시할 수 있습니다. 작업이 사용자에게 표시되어야 하는 경우 ForegroundInfo 메서드를 사용하여 알림과 함께 Worker를 Foreground Service로 실행할 수도 있습니다.

kotlin
class ProgressWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        val total = 100
        for (i in 1..total) {
            setProgress(
                workDataOf("progress" to i)
            )
        }
        return Result.success()
    }
}

데이터 전송을 위한 InputData 및 OutputData

WorkManager는 InputDataOutputData를 통해 Worker 간 데이터 전송을 지원합니다. InputData는 Data.Builder를 통해 WorkRequest 생성 중에 만들어지고 inputData를 통해 Worker에 전달됩니다. 실행 후 Worker는 workDataOf 또는 Data.Builder를 통해 OutputData를 만들고 Result.success(outputData)와 함께 반환합니다. 체인의 다음 Worker는 이전 Worker의 outputData를 자신의 inputData로 받습니다. 데이터는 기본 유형(String, Int, Long, Boolean, Double)을 지원하는 키-값 형식으로 저장됩니다. 최대 데이터 크기는 10KB입니다.

실제로 많은 프로젝트에서 WorkManager를 유일한 백그라운드 작업 스케줄러로 사용합니다. Google은 특히 JobScheduler를 사용할 수 없고 WorkManager가 AlarmManager 및 BroadcastReceiver를 통해 폴백 메커니즘을 사용하는 Android 4.4(API 19) 이하를 지원하는 앱에서 기존의 모든 JobService를 WorkManager로 마이그레이션할 것을 권장합니다. 테스트를 위해 WorkManager는 TestListenableWorkerBuilder 및 TestWorkerBuilder를 제공하여 실제 스케줄러 없이 JUnit 테스트에서 Worker를 테스트할 수 있습니다.

WorkManager를 테스트하려면 AndroidX Test의 TestListenableWorkerBuilder를 사용하여 격리된 환경에서 Worker를 실행하고 반환된 Result를 확인하세요. 라이브러리는 실제 스케줄러 없이 단위 테스트를 위한 완전한 JUnit 및 Robolectric 지원을 제공합니다. 전반적으로 WorkManager는 이전에 Service나 JobScheduler가 사용되었던 작업의 80%에 적합합니다.

자주 묻는 질문

WorkManager는 기기 재부팅 후 작업 실행을 보장하나요?

네, WorkManager는 재부팅 후에도 실행을 보장합니다. 라이브러리는 모든 미완료 작업을 Room 데이터베이스에 저장하고 시스템 부팅 후 트리거되는 BroadcastReceiver를 사용하여 복원합니다.

Worker, CoroutineWorker 및 RxWorker의 차이점은?

Worker는 coroutine이나 RxJava 지원 없이 백그라운드 스레드에서 실행됩니다. CoroutineWorker는 Kotlin coroutine을 사용하며 suspend 함수 및 coroutine 범위를 통한 취소를 지원합니다. RxWorker는 Observable 및 Single로 작동하며 반응형 체인에 적합합니다.

WorkManager에서 작업을 취소하려면?

workManager.cancelWorkById(id) 또는 workManager.cancelAllWorkByTag("tag")를 사용하세요. 라이브러리는 지정된 이름의 고유 작업을 취소하기 위한 cancelUniqueWork("name") 메서드도 제공합니다.

PeriodicWorkRequest의 최소 간격은?

PeriodicWorkRequest의 최소 간격은 15분입니다. 이 제한은 과도한 배터리 소모를 방지하기 위해 Google이 설정했습니다. 작업을 더 자주 실행해야 하는 경우 Foreground Service 또는 타이머가 있는 Handler를 사용하세요.

WorkManager는 Android 4.4 이하를 지원하나요?

네, WorkManager는 API 14+를 지원합니다. JobScheduler가 없는 기기(API 21 미만)에서는 라이브러리가 AlarmManager와 BroadcastReceiver의 조합을 사용하여 작업을 예약합니다.这使得 WorkManager를 백그라운드 작업을 위한 범용 솔루션으로 만듭니다.

요약

  • WorkManager는 모든 Android 버전에서 보장된 실행으로 백그라운드 작업을 위한 최신 Jetpack 라이브러리입니다.
  • 세 가지 기본 클래스 — Worker, WorkRequest 및 WorkManager — 모든 스케줄링 및 실행 시나리오를 다룹니다.
  • 두 가지 요청 유형 — OneTimeWorkRequest 및 PeriodicWorkRequest — 일회성 및 반복 작업용.
  • 제약 조건(네트워크, 배터리, 저장소)은 불리한 조건에서 작업이 실행되지 않도록 보호합니다.
  • 작업 체인은 결과 전달과 함께 Worker의 순차적 실행을 보장합니다.
  • CoroutineWorker 및 RxWorker는 coroutine과 RxJava를 통한 비동기 프로그래밍을 지원합니다.
  • WorkManager는 대부분의 백그라운드 작업 시나리오에서 JobScheduler, Service 및 AlarmManager를 대체합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기