깨알 개념/Android

[Android] WorkManager - 개요

interfacer_han 2024. 6. 14. 19:07

#1 WorkManager는 '지연 가능한 백그라운드 작업'의 관리자

WorkManager를 사용한 백그라운드 작업 - Kotlin  |  Android Developers

Android에는 보장된 백그라운드 작업을 위한 다수의 옵션이 있으며, 이러한 옵션에는 각각 다양한 장단점이 있습니다. Android용 WorkManager API는 백그라운드 작업을 간편하게 만듭니다. WorkManager는 예

developer.android.com

WorkManager는 Android Jetpack에 속하는 백그라운드 작업 관리 시스템 라이브러리다. 모든 백그라운드는 아니고, '지연 가능한 백그라운드 작업'를 관리한다. '지연 가능한 작업'이란, 즉시 실행하지 않아도 되는 작업을 의미한다. 예를 들어, 서버와의 데이터 동기화, 앱 사용 로그를 서버에 전송하기, 주기적으로 데이터를 백업하기 등의 작업은 분명 필요는 하지만 당장 완료를 기대하지 않아도 되는 것들이다.
 
지연이 가능하기 때문에, WorkManager는 가용한 자원이 충분할 때까지 기다렸다가 실행된다. 예를 들어, 스마트폰의 RAM이나 CPU의 이용률이 충분히 낮을 때, 배터리가 충분히 많을 때, 충분히 빠른 속도의 네트워크와 연결되어있을 때 등이 그 시점이다.
 
또 지연이 가능해야만 하기에, 사용자가 앱에서 벗어나거나 앱을 강제 종료시켜도 심지어 스마트폰이 재부팅되더라도 WorkManager는 반드시 살아있음이 보장된다. WorkManager는 Android 운영체제의 Application Framework 수준에서 작동되기에 이러한 보장이 가능하다.
 

#2 이전 시스템과의 비교

WorkManager 출범 전엔 Firebase JobDispatcher, JobScheduler, AlarmManager, BroadcastReceiver를 사용해 WorkManager의 역할을 수행했었다고 한다. 이전 시스템들은 수행할 작업의 예약 과정이 복잡했고 많은 요구 사항들을 명시적으로 처리해주어야했다고 한다. 반면, WorkManager는 Jetpack에 속하는 라이브러리다운 간편하고 직관적인 사용성에 다양한 Android 버전과의 호환성도 갖췄다. 작업을 WorkManager에 예약해놓으면 알아서 최적의 방식으로 작업을 수행하고, 백그라운드 작업을 수행하기 위한 여러 제약들도 자동으로 처리해 명시적으로 관리할 여지가 적다.
 
그렇다고 WorkManager가 이전 시스템들과 완전히 독립적인 라이브러리라는 것은 아니다. 반대로 오히려 깊은 연관이 있다. WorkManager의 내부 동작을 살펴보면, API 레벨 23 미만은 BroadcastReceiver와 AlarmManager의 조합, API 23 이상은 JobScheduler, Firebase를 사용하는 앱은 Firebase JobDispatcher를 알아서 선택해 동작한다. WorkManager는 이 이전 시스템들의 추상화 계층(= 복잡성을 감추고, 일관된 API를 제공하는 것)인 것이다.
 

#3 다른 라이브러리들과의 비교

#3-1 Corutines (코루틴)

코루틴은 작업의 병렬 처리를 위해 백그라운드 스레드를 활용할 수 있는 라이브러리다. 하지만, 앱이 종료되면 코루틴은 WorkManager와는 달리 종료된다. 물론 1회성 작업인 경우에도, 꼭 완료시켜야하는 중요한 작업이라면 WorkManager로 예약해두는 것이 Corutines보다 더 안정적이며, 그 중에서도 특히 주기적 작업이라면 반드시 WorkManager에 작업을 맡겨야 한다. 앱을 앞으로도 계속 켜둘 것이라는 보장이 당연히 없기 때문이다.
 

#3-2 AlarmManager

WorkManager가 내부적으로 AlarmManager 라이브러리를 가져다 쓰는 경우(#2 참조)도 있지만, 프로그래머 입장에서 AlarmManager를 WorkManager의 대체제로 사용할 생각은 말아야 한다. 왜냐하면, AlarmManager는 앱이 종료되어도 작동하지만, 스마트폰이 Doze 모드(기기가 일정 시간 동안 사용되지 않아 절전 모드로 전환된 상태)일 때 WorkManager와는 달리 기기를 깨워버리기 때문이다. 따라서 배터리 효율 및 컴퓨팅 자원 절약 면에서 비효율적이다. 한 마디로 AlarmManager는 오직 Alarm을 위해서만 사용하자.
 

#4 작업의 유형

#4-1 작업의 3가지 종류

https://developer.android.com/topic/libraries/architecture/workmanager/#types

WorkManager에 작업을 맡길 때는 크게 Immediate(즉시), Long Running(장기 실행), Deferrable(지연 가능)의 3가지 작업 스타일을 설정할 수 있다. 먼저, Immediate(즉시)는 말 그대로 즉시 수행될 것을 기대하는 작업이다. 지도 앱을 예로 들면, '내 위치를 실시간으로 표시' 기능이나 '목적지 근처에 도착하면 알려주기' 기능 따위를 Immediate로 설정할 만하다.
 
Long Running(장기 실행) 또한 말 그대로 시간이 오래 걸리거나, 사용자의 대기(Stand by)를 요하는 작업이다. 예를 들어, 대용량 파일을 다운로드하는 작업 혹은 달리기 측정 앱에서 30분 타이머의 종료 알림이 울리도록하는 작업 등을 Long Running으로 설정할 만하다.
 
Deferrable(지연 가능)은 특정 조건을 충족할 때까지 '지연 가능'한 작업을 의미한다. 예를 들어, 인터넷이 연결될 때까지 기다렸다가 데이터를 업로드하는 작업 등이다. 조건이 충족될 때까지 WorkManager가 계속 확인하기 때문에 인터넷을 영원히 연결하지 않는 경우가 아니라면 언젠간 수행되고 말 것이다.
 

#4-2 작업의 주기성

WorkManager에 작업을 맡길 땐, 해당 작업이 한 번만(One Time) 수행되면 그만인지 아니면 주기적으로(Periodic) 수행되어야 하는 지를 정해줄 수 있다. 전자의 경우 설문 조사 앱에서 사용자가 설문 조사를 완료하면 해당 데이터를 서버로 업로드 하는 경우를 예로 들 수 있고, 후자의 경우 회사 재고 관리 앱에서 30분마다 재고 정보를 서버로부터 받아오는 경우를 예로 들 수 있다.
 

#4-3 작업 유형 정리

Immediate1회성 수행 (One Time)
Long Running1회성 수행 (One Time)
Long Running주기적 수행 (Periodic)
Deferrable1회성 수행 (One Time)
Deferrable주기적 수행 (Periodic)

#4-1의 작업 스타일에 더해 #4-2의 주기성까지 고려하면 위의 표와 같이 작업을 유형화할 수 있다. Immediate 스타일의 경우는 옵션이 1회성 수행밖에는 없다. Immediate는 즉시 수행될 것을 기대하는 작업이기에, 주기적으로 실행되는 작업과는 그 목적이 동떨어져 있기 때문이다.
 

#5 요약

WorkManager는 작업 Traffic을 교통 정리한다.