백그라운드 작업 개요

앱에서는 종종 두 가지 이상의 작업을 동시에 처리해야 합니다. Android API에서는 이를 실행할 수 있는 다양한 방법이 있습니다. 적합한 옵션을 선택하는 것은 매우 중요합니다. 어떤 옵션이 상황에 따라 적합할 수도 있지만 또 다른 상황에서는 매우 잘못된 선택일 수 있기 때문입니다. 잘못된 API를 선택하면 앱의 성능이나 리소스 효율성이 저하되어 배터리가 소모되고 사용자 기기 전체의 성능이 저하될 수 있습니다. 경우에 따라 잘못된 접근 방식을 선택하면 앱이 Play 스토어에 등록되지 않을 수 있습니다.

이 문서에서는 사용 가능한 다양한 옵션을 설명하고 상황에 맞는 옵션을 선택하는 데 도움이 됩니다.

용어

백그라운드 작업과 관련된 일부 중요한 용어는 서로 상충하는 여러 가지 방식으로 사용될 수 있습니다. 따라서 용어를 정의하는 것이 중요합니다.

앱이 백그라운드에서 실행 중이면 시스템은 앱에 여러 가지 제한을 적용합니다. 예를 들어 대부분의 경우 백그라운드의 앱은 포그라운드 서비스를 실행할 수 없습니다.

이 문서의 목적상 '작업'이라는 용어는 앱이 기본 워크플로 외부에서 실행하는 작업을 의미합니다. 이해의 일관성을 보장하기 위해 이를 비동기 작업, 백그라운드 작업, 포그라운드 서비스라는 세 가지 유형의 태스크 유형으로 분류했습니다.

적절한 옵션 선택

대부분의 시나리오에서 작업이 속하는 카테고리 (비동기 작업, 백그라운드 작업 또는 포그라운드 서비스)를 파악하여 작업에 사용할 적절한 API를 파악할 수 있습니다.

확실하지 않다면 결정에 뉘앙스를 더하는 플로우 차트를 사용할 수 있습니다. 이러한 각 옵션은 이 문서의 뒷부분에서 자세히 설명합니다.

백그라운드 작업을 위해 고려할 두 가지 주요 시나리오는 다음과 같습니다.

이 두 시나리오에는 자체적인 결정 트리가 있습니다.

비동기 작업

대부분의 경우 앱은 포그라운드에서 실행되는 동안 동시 작업만 실행하면 됩니다. 예를 들어 앱에서 시간이 오래 걸리는 계산을 해야 할 수 있습니다. UI 스레드에서 계산을 실행하면 계산이 완료될 때까지 사용자가 앱과 상호작용할 수 없습니다. 이로 인해 ANR 오류가 발생할 수 있습니다. 이 경우 앱은 비동기 작업 옵션을 사용해야 합니다.

일반적인 비동기 작업 옵션에는 Kotlin 코루틴과 자바 스레드가 포함됩니다. 자세한 내용은 비동기 작업 문서를 참고하세요. 백그라운드 작업과 달리 비동기 작업은 앱이 유효한 수명 주기 단계에 있지 않으면 (예: 앱이 포그라운드를 벗어남) 완료되지 않을 수 있습니다.

백그라운드 작업

백그라운드 작업은 사용자가 앱을 종료해도 계속되어야 하는 작업을 실행해야 할 때 더 유연한 옵션입니다. 대부분의 경우 백그라운드 작업의 가장 좋은 옵션은 WorkManager를 사용하는 것이지만, 경우에 따라 플랫폼 JobScheduler API를 사용하는 것이 적절할 수도 있습니다.

WorkManager는 필요에 따라 간단하거나 복잡한 작업을 설정할 수 있는 강력한 라이브러리입니다. WorkManager를 사용하여 작업을 특정 시간에 실행하도록 예약하거나 작업을 실행해야 하는 조건을 지정할 수 있습니다. 작업 체인을 설정하여 각 작업이 차례로 실행되고 결과를 다음 작업으로 전달하도록 할 수도 있습니다. 사용 가능한 모든 옵션을 알아보려면 WorkManager 기능 목록을 참고하세요.

백그라운드 작업의 가장 일반적인 시나리오는 다음과 같습니다.

  • 주기적으로 서버에서 데이터 가져오기
  • 센서 데이터 가져오기 (예: 걸음수 측정기 데이터)
  • 주기적인 위치 데이터 가져오기 (Android 10 이상에서는 ACCESS_BACKGROUND_LOCATION 권한을 부여받아야 함)
  • 카메라에서 만든 사진과 같은 콘텐츠 트리거를 기반으로 콘텐츠 업로드

포그라운드 서비스

포그라운드 서비스는 중단되어서는 안 되는 작업을 즉시 실행할 수 있는 강력한 방법을 제공합니다. 그러나 포그라운드 서비스는 기기에 과도한 부하를 유발할 수 있으며 개인 정보 보호 및 보안에 영향을 줄 수도 있습니다. 이러한 이유로 시스템은 앱이 포그라운드 서비스를 사용할 수 있는 방법과 시기에 많은 제한을 둡니다. 예를 들어 포그라운드 서비스는 사용자가 알아볼 수 있어야 하며 대부분의 경우 앱은 백그라운드에 있는 경우 포그라운드 서비스를 실행할 수 없습니다. 자세한 내용은 포그라운드 서비스 문서를 참조하세요.

포그라운드 서비스를 만드는 방법에는 두 가지가 있습니다. 자체 Service를 선언하고 Service.startForeground()를 호출하여 서비스가 포그라운드 서비스임을 지정할 수 있습니다. 또는 장기 실행 worker 지원에 설명된 대로 WorkManager를 사용하여 포그라운드 서비스를 만들 수도 있습니다. 그러나 WorkManager에서 만든 포그라운드 서비스는 다른 포그라운드 서비스와 동일한 제한을 모두 준수해야 합니다. WorkManager는 포그라운드 서비스를 더 간단하게 만들 수 있도록 몇 가지 편의 API를 제공합니다.

대체 API

시스템은 좀 더 구체적인 사용 사례에서 더 나은 성능을 발휘하도록 설계된 대체 API를 제공합니다. 사용 사례에 맞는 대체 API가 있다면 포그라운드 서비스 대신 해당 API를 사용하는 것이 좋습니다. 이렇게 하면 앱 성능을 개선하는 데 도움이 됩니다. 포그라운드 서비스 유형 문서에서는 특정 포그라운드 서비스 유형 대신 사용할 수 있는 좋은 대체 API가 있는 경우를 언급합니다.

대체 API를 사용하는 가장 일반적인 시나리오는 다음과 같습니다.

  • 데이터 동기화 포그라운드 서비스를 만드는 대신 사용자 시작 데이터 전송을 사용하여 대량 다운로드 또는 업로드
  • 연결된 기기 포그라운드 서비스를 사용하는 대신 호환 기기 관리자를 블루투스 페어링 및 데이터 전송에 사용
  • 미디어 재생 포그라운드 서비스를 만드는 대신 PIP 모드를 사용하여 동영상 재생

사용자가 시작한 작업

적절한 API를 선택하는 방법을 보여주는 플로우 차트 이 차트에는 '사용자가 시작한 작업' 섹션의 자료가 요약되어 있습니다.
그림 1: 사용자가 시작한 백그라운드 작업을 실행하는 데 적합한 API를 선택하는 방법

앱이 백그라운드 작업을 실행해야 하고 앱이 표시되는 동안 사용자가 작업을 시작했다면 다음 질문에 답하여 올바른 접근 방식을 찾으세요.

앱이 백그라운드에 있는 동안 작업을 계속 실행해야 하나요?

앱이 백그라운드에 있는 동안 작업을 계속할 필요가 없다면 비동기 작업을 사용해야 합니다. 비동기식 작업을 실행하는 옵션에는 여러 가지가 있습니다. 여기서 중요한 점은 앱이 백그라운드로 전환되면 이러한 옵션이 모두 작동을 중지한다는 것입니다. (앱이 종료된 경우에도 중지됩니다.) 예를 들어 소셜 미디어 앱에서 콘텐츠 피드를 새로고침하려고 하지만 사용자가 화면을 떠난 경우 작업을 완료할 필요가 없습니다.

작업이 지연되거나 중단되면 사용자 경험이 저하되나요?

작업이 연기되거나 취소되어도 사용자 환경이 저하되지 않는지 고려하는 것이 중요합니다. 예를 들어 앱에서 애셋을 업데이트해야 하는 경우 작업이 즉시 발생하는지, 아니면 기기가 충전 중인 한밤중에 발생하는지 사용자가 알아차리지 못할 수 있습니다. 이 경우 백그라운드 작업 옵션을 사용해야 합니다.

짧고 중요한 작업인가요?

작업을 지연할 수 없고 빠르게 완료된다면 shortService 유형의 포그라운드 서비스를 사용할 수 있습니다. 이러한 서비스는 다른 포그라운드 서비스보다 만들기 쉬우며 많은 권한이 필요하지 않습니다. 단, 짧은 서비스는 3분 이내에 완료해야 합니다.

이 용도로만 사용할 수 있는 대체 API가 있나요?

작업이 사용자에게 표시되지 않는다면 올바른 솔루션은 포그라운드 서비스를 사용하는 것일 수 있습니다. 이러한 서비스는 시작되면 지속적으로 실행되므로 작업을 중단하면 사용자 환경이 저하될 때 유용합니다. 예를 들어 운동 추적 앱은 위치 센서를 사용하여 사용자가 지도에 조깅 경로를 기록하도록 허용할 수 있습니다. 백그라운드 작업 옵션을 사용하면 이 작업을 하지 않는 것이 좋습니다. 작업이 일시중지되면 추적이 즉시 중지되기 때문입니다. 이러한 상황에서는 포그라운드 서비스가 가장 적합합니다.

그러나 포그라운드 서비스는 잠재적으로 많은 기기 리소스를 사용할 수 있으므로 시스템은 사용할 수 있는 경우와 방법에 많은 제한을 둡니다. 많은 경우 포그라운드 서비스를 사용하는 대신 덜 문제 없이 작업을 처리하는 대체 API를 사용할 수 있습니다. 예를 들어 사용자가 특정 위치에 도착했을 때 앱에서 조치를 취해야 하는 경우 가장 좋은 방법은 포그라운드 서비스로 사용자의 위치를 추적하는 대신 지오펜싱 API를 사용하는 것입니다.

이벤트에 대한 응답의 작업

적절한 API를 선택하는 방법을 보여주는 플로우 차트 이 차트에는 '이벤트에 대한 작업 응답' 섹션의 자료가 요약되어 있습니다.
그림 2: 이벤트로 트리거되는 백그라운드 작업을 실행하는 데 적합한 API를 선택하는 방법

앱이 트리거에 대한 응답으로 백그라운드 작업을 실행해야 할 때가 있습니다. 예를 들면 다음과 같습니다.

이는 외부 트리거 (예: FCM 메시지)이거나 앱 자체에서 설정한 알람에 대한 응답일 수 있습니다. 예를 들어 게임은 일부 애셋을 업데이트하라는 FCM 메시지를 수신할 수 있습니다.

작업이 몇 초 내에 완료될 수 있는 경우 비동기 작업을 사용하여 작업을 실행하세요. 시스템은 앱이 백그라운드에 있더라도 몇 초 안에 이러한 작업을 실행할 수 있도록 허용합니다.

작업에 몇 초 이상 걸리는 경우 작업을 처리하기 위해 포그라운드 서비스를 시작하는 것이 적절할 수 있습니다. 실제로 앱이 현재 백그라운드에 있더라도 작업이 사용자에 의해 트리거되고 백그라운드 시작 제한에서 승인된 예외 중 하나에 해당하는 경우 포그라운드 서비스 시작이 허용될 수 있습니다. 예를 들어 앱이 우선순위가 높은 FCM 메시지를 수신하면 앱이 백그라운드에 있더라도 포그라운드 서비스를 시작할 수 있습니다.

작업이 몇 초 이상 걸리는 경우 백그라운드 작업을 사용하세요.