0Pricing
Android Academy · 강의

WorkManager와 백그라운드 작업

WorkManager로 백그라운드 작업을 확실하게 예약합니다. OneTimeWorkRequest, PeriodicWorkRequest, 제약 조건, 데이터 전달, 작업 연결을 사용합니다.

WorkManager와 백그라운드 작업은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 6개 중 5번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.

Android의 백그라운드 작업

Android는 배터리를 절약하기 위해 백그라운드 작업을 엄격하게 제한합니다. WorkManager가 나오기 전에는 개발자가 다음을 사용했습니다.

  • AsyncTask(사용 중단됨)
  • AlarmManager(재부팅 또는 Doze 모드에서 안정적이지 않음)
  • JobScheduler(복잡한 API)
  • 서비스(종료될 수 있고 다시 시도 기능이 없음)

WorkManager는 지연 실행이 가능하고 실행이 보장되는 백그라운드 작업에 권장되는 솔루션입니다.

WorkManager란 무엇입니까?

WorkManager는 앱이 종료되거나 기기가 재부팅되어도 작업이 실행되도록 보장합니다. 주요 기능은 다음과 같습니다.

  • 재부팅 후에도 작업 유지
  • 실패 시 자동 재시도
  • 제약 조건 지원(WiFi만 사용, 충전 중에만 실행 등)
  • API 14 이상에서 작동
  • CoroutineWorker를 통해 Kotlin 코루틴과 통합

설정

app/build.gradle에 WorkManager를 추가합니다.

dependencies {
    implementation 'androidx.work:work-runtime-ktx:2.9.0'
}

Worker 만들기

CoroutineWorker를 상속하고 doWork()를 구현합니다. Result.success(), Result.failure() 또는 Result.retry()를 반환합니다.

class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // This runs on a background coroutine
            val repo = UserRepository(applicationContext)
            repo.syncFromNetwork()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry()
            else Result.failure()
        }
    }
}

OneTimeWorkRequest

일회성 작업을 예약하고 큐에 추가합니다.

val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(10, TimeUnit.MINUTES)  // optional delay
    .build()

WorkManager.getInstance(context).enqueue(syncWork)

// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
    "sync_work",
    ExistingWorkPolicy.KEEP,   // don't enqueue if already pending
    syncWork
)

PeriodicWorkRequest

반복 작업을 예약합니다. 최소 간격은 15분입니다.

val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
    repeatInterval = 1, TimeUnit.HOURS
).build()

WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "hourly_sync",
    ExistingPeriodicWorkPolicy.KEEP,
    periodicSync
)

제약 조건

배터리가 부족하지 않고 WiFi에 연결되어 있는 등 조건이 충족될 때만 작업을 실행합니다.

val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)  // WiFi only
    .setRequiresBatteryNotLow(true)
    .setRequiresCharging(false)
    .build()

val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(constraints)
    .build()

WorkManager.getInstance(context).enqueue(work)

입력 및 출력 데이터

Data 객체를 사용하여 Worker에 데이터를 전달하고 Worker에서 데이터를 받습니다.

// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInputData(inputData)
    .build()

// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
    override suspend fun doWork(): Result {
        val userId = inputData.getInt("user_id", -1)

        // Pass output data back:
        val output = workDataOf("synced_count" to 10)
        return Result.success(output)
    }
}

작업 상태 관찰하기

getWorkInfoByIdLiveData를 사용하여 작업 진행 상황을 관찰합니다.

val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)

WorkManager.getInstance(this)
    .getWorkInfoByIdLiveData(workRequest.id)
    .observe(this) { info ->
        when (info?.state) {
            WorkInfo.State.RUNNING   -> binding.tvStatus.text = "Syncing..."
            WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
            WorkInfo.State.FAILED    -> binding.tvStatus.text = "Failed"
            else                     -> {}
        }
    }

작업 연결하기

작업 체인을 사용하여 작업을 순차적으로 또는 병렬로 실행합니다.

val downloadWork  = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork   = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork    = OneTimeWorkRequestBuilder<UploadWorker>().build()

// Sequential: download → process → upload
WorkManager.getInstance(context)
    .beginWith(downloadWork)
    .then(processWork)
    .then(uploadWork)
    .enqueue()

// Parallel then merge:
WorkManager.getInstance(context)
    .beginWith(listOf(downloadWork, processWork))  // both run in parallel
    .then(uploadWork)                              // runs after both finish
    .enqueue()

WorkManager와 대안 비교

상황에 따른 사용 방법은 다음과 같습니다.

  • WorkManager — 지연 실행이 가능하고 실행이 보장되며 제약 조건을 기반으로 하는 작업입니다. 동기화, 업로드, 정리에 적합합니다.
  • Coroutines / ViewModel — 앱이 열려 있는 동안 앱과 연결된 작업입니다. 앱이 종료되면 중지됩니다.
  • AlarmManager — 정확한 시간에 울리는 알람입니다(캘린더 알림). 배터리를 신중하게 관리해야 합니다.
  • Foreground Service — 사용자가 인지하고 있는 장시간 실행 작업입니다(음악 재생, 내비게이션).

빠른 확인

PeriodicWorkRequest의 최소 반복 간격은 얼마입니까?

복습: WorkManager

WorkManager는 실행이 보장되는 백그라운드 작업에 적합한 도구입니다.

  • CoroutineWorker를 상속하고 doWork()를 구현합니다.
  • Result.success(), .failure() 또는 .retry()를 반환합니다.
  • 한 번만 실행하려면 OneTimeWorkRequest를, 반복 실행하려면 PeriodicWorkRequest를 사용합니다.
  • WiFi 전용, 배터리 상태 등의 조건에는 Constraints를 추가합니다.
  • workDataOf()로 데이터를 전달합니다.
  • beginWith().then().enqueue()로 작업을 연결합니다.

다음 내용에서는 아름다운 UI를 위한 Material Design 구성 요소를 알아봅니다.

자주 묻는 질문

“WorkManager와 백그라운드 작업” 강의는 무료인가요?

네 — “WorkManager와 백그라운드 작업” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.

“WorkManager와 백그라운드 작업”에서 뭘 배우나요?

WorkManager로 백그라운드 작업을 확실하게 예약합니다. OneTimeWorkRequest, PeriodicWorkRequest, 제약 조건, 데이터 전달, 작업 연결을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 6개 중 5번째 강의입니다.

“WorkManager와 백그라운드 작업” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Retrofit과 REST API
  2. Coil로 이미지 로드하기
  3. 오류 처리와 사용자 경험
  4. 푸시 알림
  5. WorkManager와 백그라운드 작업
  6. Play Store에 게시하기
← Android Academy(으)로 돌아가기