[Android] 백그라운드 작업 처리 : Coroutines 와 WorkManager 비교
Coroutines 과 WorkManager는 모두 백그라운드 작업 처리와 관련이 있지만, 그 사용 목적과 동작 방식이 다릅니다.
두 기술의 차이를 비교하면서 각 기술이 어떤 상황에서 적합한지 설명하겠습니다.
Coroutines 란?
코루틴은 비동기 작업 처리를 위한 Kotlin 언어의 기능으로 경량화된 스레드를 이용하여 병렬 작업을 수행할 수 있도록 해줍니다.
특히 UI 스레드와 분리하여 백그라운드에서 비동기 작업을 효율적으로 처리할 수 있습니다.
- UI 스레드와 분리
: 코루틴은 기본적으로 UI 스레드와 분리된 작업을 할 수 있어 UI 스레드를 차단하지 않음 - 경량 스레드
: 기존의 스레드에 비해 훨씬 더 경량화된 작업 처리 방식으로 많은 양의 비동기 작업을 효율적으로 처리 가능 - 지속성 없음
: 코루틴은 앱이 종료되거나 액티비티가 파괴되면 종료되며, 백그라운드 작업을 지속적으로 실행하지 못함 - 직접 제어
: 코루틴을 사용하면 작업의 흐름을 코드에서 직접 제어할 수 있어 세밀한 작업 수행이 가능
사용 예시
// 간단한 코루틴 예시 (네트워크 요청을 비동기적으로 처리)
GlobalScope.launch {
val result = fetchDataFromNetwork() // 네트워크 작업
withContext(Dispatchers.Main) {
// UI 업데이트
updateUI(result)
}
}
백그라운드 작업 처리 시 UI와 분리된 비동기 작업을 처리하는데에 유용하며, 앱 종료 후에도 계속 실행되지는 않습니다.
직접 제어가 가능하지만, 작업을 중단하거나 재개하는 등의 복잡한 관리가 필요할 수 있습니다.
WorkManager 란?
WorkManager 는 지속적인 백그라운드 작업을 처리하는 라이브러리로, 앱이 종료되거나 기기 재부팅 후에도 작업을 계속 실행할 수 있도록 보장해줍니다.
작업의 상태와 조건을 설정할 수 있으며, 작업이 완료되거나 실패했을 때 후속 처리르 할 수 있습니다.
- 지속성
: 앱이 종료되거나 기기가 재부팅되더라도 작업이 계속 실행됨 - 백그라운드 작업
: 네트워크 연결 상태나 배터리 상태 등을 조건으로 설정하여 조건에 맞는 백그라운드 작업을 실행 - 간단한 작업 제어
: 작업 상태를 자동으로 관리하며, 중지되었을 경우 onStopped() 메서드를 호출하여 리소스를 정리하거나 재시작할 수 있도록 처리함 - 직접 제어 제한
: 작업을 제어하는 데 있어 코루틴보다 덜 직관적일 수 있으며,
WorkManager 자체가 상태를 관리하므로 작업 흐름을 직접 제어하기보다는 관리하는 방식에 가까움
사용 예시
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // Wi-Fi에서만 실행
.build()
val workRequest = OneTimeWorkRequestBuilder<DownloadWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context).enqueue(workRequest)
지속적인 백그라운드 작업을 실행할 수 있으며, 제약 조건 설정을 통해 환경에 맞는 작업 실행이 가능합니다.
작업 상태 관리와 재시작을 자동으로 처리하며, 직접 제어는 제한적일 수 있습니다.
Coroutines 와 WorkManager 비교
둘 다 백그라운드 작업 처리에 사용되지만, 코루틴은 UI 관련 비동기 작업이나 단기 작업에 적합합니다.
예를 들어, UI 업데이트나 네트워크 요청 처리, 짧은 시간 동안의 백그라운드 작업에 더 유용합니다.
반면, WorkManager 는 지속적인 백그라운드 작업이 필요한 경우, 기기 재부팅 후에도 작업을 유지해야 하는 경우에 적합합니다.
예를 들어, 앱 종료 후에도 계속 파일을 다운로드 하거나, 네트워크 연결 상태에 따라 작업을 재시도해야 할 때는 더 유용합니다.