지연 작업을 백그라운드에서 처리하기 위한 서비스에 대해서 살펴보자.
만약 백그라운드에서 작업을 처리할 필요가 없으면 코루틴과 스레드 같은 비동기 수행 기능을 사용하면 된다 :)
Job Scheduler
잡 스케줄러는 백그라운드에서 실행할 작업을 예약하는 서비스이다.
Job Info
예약된 작업에 대한 상세한 정보
Job Service
예약된 작업을 실제로 실행하는 서비스
즉, 스케줄러를 통해 예약한 작업을 타이밍에 맞게 실행하는 역할을 담당한다.
❗️ 작업을 예약 또는 실행하는 함수, 작업을 완료했음을 알리는 함수 등 다양한 함수를 제공한다.
하지만 잡 스케줄러는 짧은 시간 안에 너무 많은 작업을 예약하거나 앱의 프로세스가 종료되면, 예약된 작업의 실행을 보장하지 않는다.
이에 안정적인 백그라운드의 작업 수행을 보장하고자 WorkManager가 2018년에 등장하게 되었다.
WorkManager
WorkManager는 백그라운드에서의 작업 실행을 보장하는 아키텍처 구성요소이다.
기기를 재부팅하여도 작업이 유지되며, 절전 기능을 사용하므로 배터리 소모를 걱정할 필요가 없다!
대표적으로 서버에서 주기적으로 데이터를 가져올 경우, 센서 데이터를 가져올 경우 WorkManager를 사용한다.

WorkManager가 처리하는 지속적인 작업의 유형이다.
- Immediate(즉시): 즉시 시작하고 곧 완료되어야 하는 작업이다.
- Android 12 미만 버전에서는 OneTimeWorkRequest에서 setExpedited()를 제약없이 사용할 수 있다.
(※ 단, 해당 경우에는 Worker 클래스에 getForegroundInfoAsync() 또는 getForegroundInfo()를 구현해야 한다.) - Android 버전이 12 이상이면 실행 시간이 길어질 경우 작업이 안정적으로 완료된다는 보장이 없다.
- Android 12 미만 버전에서는 OneTimeWorkRequest에서 setExpedited()를 제약없이 사용할 수 있다.
- Long Running(장기 실행): 작업의 수행이 길어질 경우 Worker 내 setForeground()를 호출하여 알림을 처리한다.
- Defferable(지연 가능): 지연 가능한 작업을 PeriodicWorkRequest 또는 OneTimeWorkRequest로 예약한다.
이제, WorkManager의 구성 요소에 대해 살펴보자.
WorkManager
처리해야하는 작업을 예약하고 실행하는 클래스이다.
WorkManager의 인스턴스를 가져온 후, 예약 또는 실행할 작업을 큐에 추가할 수 있다.(enqueue)
또한 여러 작업들을 체이닝하여 순차적으로 또는 동시에 예약 또는 실행할 수 있는 기능을 제공한다.
WorkRequest request1 = new OneTimeWorkRequest.Builder(FooWorker.class).build();
WorkRequest request2 = new OneTimeWorkRequest.Builder(BarWorker.class).build();
WorkRequest request3 = new OneTimeWorkRequest.Builder(BazWorker.class).build();
workManager.beginWith(request1, request2).then(request3).enqueue();
위 예시는 request1과 request2는 병렬로 동시에 실행되며,
그 다음 request3이 순차적으로 실행되도록 queue에 추가하는 코드이다.
WorkRequest
실제 예약 또는 실행할 작업 요청을 나타낸다.
1. 작업의 유형은 OneTimeWorkRequest와 PeriodicWorkRequest 두 가지이다.
OneTimeWorkRequest는 일회성 작업을 예약하는데 유용하고,
PeriodicWorkRequest는 일정 간격으로 반복되는 작업을 예약하는데 더 적합하다.
일회성 작업 실행은 위 코드에서 예제를 살펴보았으니, 주기적 작업 예약인 PeriodicWorkRequest의 예시를 보자.
val workRequest =
PeriodicWorkRequestBuilder<SaveImageToFileWorker>(1, TimeUnit.HOURS)
// Additional configuration
.build()
위 예시는 1시간 간격으로 예약되는 작업을 정의한 것이다.
(1, TimeUnit.Hours)는 작업의 반복 간격(repeat Interval)을 나타내는데, 추가적으로 flex Interval이 지정되면
다음 작업은 repeatInterval - flexInterval 시점부터 repeatInterval 시점 사이의 임의 시점에 트리거된다.
val myUploadWork = PeriodicWorkRequestBuilder<SaveImageToFileWorker>(
1, TimeUnit.HOURS, // repeatInterval
15, TimeUnit.MINUTES) // flexInterval
.build()
즉, 다음 작업은 45분(60-15)부터 60분 사이 어느 때든 실행될 수 있다!
최소 반복 간격은 JobScheduler와 같은 15분이다.
2. WorkRequest에 제약 사항을 추가할 수 있다.
제약 사항이 설정된 WorkRequest는 특정 조건이 충족될 때까지 작업의 실행이 지연된다.
사용할 수 있는 제약 사항은 다음과 같다.
NetworkType, BatteryNotLow, RequiresCharging, DeviceIdle, StorageNotLow
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.build()
위 예시는 네트워크와 충전에 대한 제약 사항으로, 네트워크가 연결된 상태 + 기기가 충전 중일 때만 작업이 실행된다.
Worker
백그라운드에서 실행할 작업을 담는 추상 클래스이다. doWork()를 오버라이딩하여 해야할 작업을 구현하면 된다.
작업을 완료한 후에는 작업 결과를 Result 타입인 success(), failure(), retry() 중 하나로 반환해야 한다.
예제 코드는 다음과 같다.
class UploadWork(appContext: Context, workerParams: WorkerParameters)
: CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
val imageUriInput =
inputData.getString("IMAGE_URI") ?: return Result.failure()
return try {
uploadFile(imageUriInput)
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
...
}
지금까지 WorkManager와 JobScheduler에 대해서 알아보았다.
현재는 안정성을 이유로 JobScheduler보다 WorkManager를 개발에 더 많이 사용한다.
하지만, 두 기능 모두 백그라운드에서 지연 작업을 예약하고 실행할 수 있는 중요한 역할을 한다!
:)
출처
https://developer.android.com/develop/background-work/background-tasks?hl=ko#asynchronous-work
https://developer.android.com/codelabs/android-workmanager?hl=ko#0
https://jtm0609.tistory.com/229
https://dev-baik.tistory.com/300
https://android-developer.tistory.com/16
'Android' 카테고리의 다른 글
| [Android] Hilt- Hilt를 사용하는 이유 (1) (1) | 2025.08.12 |
|---|---|
| [Android] 클린 아키텍처(Clean Architecture) (2) | 2025.08.11 |
| [Android] 안드로이드 권장 아키텍처 (4) | 2025.07.31 |
| [Android] Fragment의 데이터 통신 (1) | 2025.06.16 |
| [Android] 스레드(Thread) (0) | 2025.06.12 |