본문 바로가기
Android/Open Source

[Open Source] WorkManager 소개

by 준그래머 2023. 7. 19.
반응형

본 게시물은 Medium에 2018년 12월 20일에 게시된 내용을 번역한 글입니다. 오역이 있을 수 있으니 원문을 읽고 싶으신 분들은 아래 링크를 이용해 주세요.

Introducing WorkManager

 

Introducing WorkManager

This series of blog posts will introduce WorkManager, explaining what it is, when to use it and how…

medium.com

 

시작

WorkManager에 대한 첫 번째 게시물에 오신 것을 환영합니다.

WorkManagerAndroid Jetpack 라이브러리로 작업의 제약 조건이 충족되면 작업을 지연 시킬 수 있고 안전한 백그라운드 작업을 수행할 수 있도록 설계되었습니다.

이러한 작업에 대해서는 WorkManager가 가장 적합하다고 볼 수 있습니다. (2018년 12월 20일 기준)

이 포스팅에서 다룰 내용은 아래와 같습니다.

  • WorkManager란 무엇이며 WorkManager를 사용해야 하는 시기(이 문서)
  • 어떻게 작업을 스케줄 하기 위해 WorkManger를 사용해야 하는지
  • WorkManager와 Kotlin
  • WorkManager의 주기성
  • WorkManager 커스터 마이징 - 기초
  • Dagger를 이용한 WorkManger 커스터 마이징

 

WorkManager 소개

Google의 파워 블로그 포스트 시리즈 에는 백그라운드를 처리하기 위해 많은 고려 사항과 모범 사례들이 정리되어 있습니다.

WorkManager는 Android Jetack 라이브러리에 존재하며 프레임워크 API인 JobScheduler 기능을 확장하여 Android 4.0, API 14 이상에서 지원하고 있습니다.

 

WorkManager는 무엇인가?

WorkManager는 안드로이드 아키텍처의 요소 중 하나이며 Android Jetpack의 한 부분입니다. 이것은 최신 Android 애플리케이션을 구축하기 위해 새롭고 확실한 방법입니다.

WorkManager는 제약 조건이 충족된다면 백그라운드 작업을 연기할 수 있는 Android 라이브러리입니다.

WorkManager는 앱이 종료되더라도 시스템이 이 작업을 실행하도록 보장해야 하는 작업을 대상을 위해 사용됩니다.

 

다른 말로 하면, WorkManager는 배터리 친화적인 API를 제공하고 있다고 할 수 있으며 이 API는 수년 간의 Android의 백그라운드 동작 제한을 캡슐화한 API입니다. 백그라운드 작업을 수행해야 하는 애플리케이션에게는 매우 중요한 것입니다.

 

언제 WorkManager를 사용해야 하는가?

WorkManager는 어플리케이션 프로세스의 활성화 여부와 관계없이 다양한 제약 조건이 충족될 때, 실행되어야 하는 백그라운드 작업을 처리합니다.

백그라운드 작업은

  1. 앱이 백그라운드에 있을 때
  2. 앱이 포그라운드에 있을 때
  3. 앱이 포그라운드에서 시작됐지만 백그라운드로 이동할 때

시작될 수 있습니다.

 

애플리케이션의 동작과 관계없이 백그라운드 작업은 계속 진행되어야 하거나 Android가 이 프로세스를 죽였을 때, 다시 실행됩니다.

 

WorkManager에 대해 일반적으로 프로세스가 죽으면 같이 죽어야 하는 “백그라운드” 스레드 작업(Kotlin의 코루틴, ThreadPools 또는 RxJava 라이브러리)으로 혼동하는데, 사실 WorkManager는 그렇지 않습니다. 혼동되는 쓰레드 처리 사례에 대해 자세한 내용은 백그라운드 처리 안내서를 참조하시면 됩니다.

 

백그라운드 작업을 실행해야 하는 상황은 매우 다양하기 때문에 여러 가지 방법이 존재합니다. 백그라운드 처리에 대한 블로그 게시물은 WorkManager에 대해 좋은 정보들을 많이 제공하고 있습니다. 아래 다이어그램은 이 블로그에서 제공하고 있습니다.

Diagram from  Modern background execution in Android

WorkManager의 경우 무조건 처리해야 하고 지연될 수 있는 백그라운드 작업에 적합한 것임을 알 수 있습니다.

 

스스로 질문해 볼 것:

 

1. 작업이 완료되어야 하는가?

  • 만약 사용자에 의해 애플리케이션이 종료되었다면 여전히 필수적으로 작업을 완료해야 하나요? 
    한 가지 예로 원격 동기화를 이용해 애플리케이션을 기록하는 것이 있습니다. 노트 작성을 마치면 앱이 사용자의 노트를 백엔드 서버와 동기화할 것입니다. 이 작업은 사용자가 다른 앱으로 전환 시킨 뒤 OS가 메모리를 회수하기 위해 앱을 종료해야 하는 경우에도 진행될 것입니다. 또한 디바이스가 종료된 뒤 다시 시작되는 경우에도 WorkManager는 이 작업이 완료되도록 보장할 것 입니다.

2. 작업이 연기될 수 되는가?

  • 작업을 후에 처리할 수 있어야 하거나 아니면 지금 바로 처리하는 것이 유용한가요? 만약 작업을 후에 처리해야 한다면 이것은 연기할 수 있습니다. 방금 전의 예를 다시 들면 사용자의 노트에 즉시 업로드 하는 것이 가장 좋은 방법이겠지만 만약 그게 불가능하다면 동기화는 나중에 처리돼야 할 것입니다. WorkManager에서는 이건 큰 문제가 아닙니다. WorkManager는 OS 백그라운드 제약들을 준수하고 배터리 효율이 좋은 방식으로 추후에 작업을 실행하려 할 것입니다.

아무튼 가이드라인에 따르면 앱이 종료되더라도 WorkManager는 시스템이 작업들이 실행되는 것을 보장하기 위해 사용되는 것입니다. 이 것은 즉시 실행되어야 하거나 특정한 시간에 작업 실행을 요구하는 백그라운드 작업을 위한 것은 아닙니다. 만약 여러분의 작업이 정확한 시간에 동작해야 한다면 (시계 알람, 캘린더 리마인더 등) AlarmManager를 사용하시면 됩니다. 즉시 실행되어야 하지만 실행 기간이 길어야 하는 작업이라면 포그라운드로 실행해서 확실히 해주는 게 좋습니다. 대신 실행을 포그라운드로 제한함으로써 더 이상 백그라운드 작업이 아닙니다. 따라서 포그라운드 서비스를 사용하세요.

 

WorkManager는 보다 복잡한 시나리오에서 일부 백그라운 작업의 트리거가 필요할 때 다른 API들과 쌍을 이뤄 처리할 수 있습니다.

  • 만약 여러분의 서버가 그 작업을 실행시키면 WorkManager는 Firebase Cloud Messaging과 함께 처리하도록 할 수 있습니다.
  • 만약 여러분들이 브로드 캐스트들을 브로드 캐스트 리시버로 수신 중이고 긴 작업을 실행시켜야 한다면 WorkManager를 사용하세요. 일반적으로 브로드 캐스트를 통해 발생되는 많은 제약들에 대해 WorkManager는 지원하고 있습니다. 따라서 이런 경우 따로 브로드 캐스트 리시버를 등록할 필요 없습니다.

 

왜 WorkManager를 사용해야 하는가?

WorkManager는 백그라운드 작업을 실행하는 동시에 호환성 문제와 배터리 및 시스템 상태에 대해 가장 최적의 방법으로 처리합니다.

 

게다가 WorkManager를 사용하며 주기적인 작업과 복잡한 종속적인 작업들을 스케줄 할 수 있습니다. 실행 순서가 명시되어 있다면 백그라운드 작업은 병렬 또는 순차적으로 수행될 수 있습니다. WorkManager는 작업 간의 입출력을 원활하게 처리할 것입니다.

 

백그라운드 작업을 실행할 시기에 대해 기준을 정할 수도 있습니다. 예를 들면, 장치에 네트워크 연결이 없다면 HTTP 요청을 할 이유가 없습니다. 그래서 네트워크 연결이 존재할 때에만 작업이 수행되도록 제약을 설정할 수 있습니다.

 

마지막으로 WorkManager는 작업 요청 상태를 관찰하여 UI를 업데이트할 수도 있습니다.

 

요약하자면, WorkManager는 다음과 같은 장점이 있습니다:

  • 다양한 OS 버전과의 호환성 처리
  • 가장 최적의 시스템 상태를 따르도록 함
  • 비동기식 일회성 및 주기적 작업 지원
  • 입출력으로 연결된 작업 지원
  • 작업 실행 시간에 대한 제약 조건을 설정할 수 있음
  • 앱, 디바이스가 다시 시작되는 경우에도 작업의 수행을 보장함

이미지 필터 라인을 적용하기 위해 동시 작업 파이프라인을 구축하는 구체적인 예를 살펴보겠습니다. 결과 값은 압축 작업을 진행하고 다시 업로드 작업으로 전달됩니다.

Sample chain of tasks with constraints

이 모든 작업들은 정확한 순서를 정의합니다: 우리는 이미지가 어떤 순서로 필터 처리됐는지 알 수 없지만 압축 작업은 모든 필터 작업들이 끝난 후에 시작된다는 것은 알 수 있습니다.

 

 

어떻게 WorkManager가 작업을 스케줄 처리하는가?

API 레벨 14로의 호환성을 보장하기 위해, WorkManager는 장치 API 수준에 따라 백그라운드 작업을 스케줄 하기 위한 적절한 방법을 선택합니다. WorkManager는 JobSchedule를 사용하거나 또는 BroadcastReceiver와 AlarmManager를 조합해서 사용할 수 있습니다.

How WorkManager determines which scheduler to use

 

WorkManager는 사용할 수 있는 단계인가요?

WorkManager는 지금 beta 단계입니다. 이것은 주요한 API의 변화는 없을 것이라는 이야기입니다. (2018년 12월 20일 기준)

WorkManager가 안정화되면 백그라운드 작업을 수행할 수 있는 가장 좋은 방법이 될 것입니다. 이런 이유로 지금은 WorkManager를 사용해 문제들을 개선해 보세요. (문제가 발생하면 버그 리포트에 업로드하라는 이야기인 듯)

 

WorkManager’s Resources

반응형