Flutter Background Service 완벽 가이드: 5가지 실전 적용 방법






Flutter Background Service 완벽 가이드: 5가지 실전 적용 방법

Flutter 앱을 개발하면서 백그라운드에서 지속적으로 작업을 수행해야 하는 경우가 있습니다. 위치 추적, 실시간 데이터 동기화, 타이머 같은 기능들이 바로 그것인데요. 이런 기능들을 구현할 때 필수적인 것이 바로 Flutter Background Service입니다. 이번 글에서는 백그라운드 서비스가 정확히 무엇인지, 어떻게 적용하는지, 그리고 실제 프로젝트에서는 어떻게 활용하는지 상세하게 설명해드리겠습니다.


목차

  1. 백그라운드 서비스란?
  2. Flutter Background Service의 기본 개념
  3. Android와 iOS 환경 설정
  4. 서비스 초기화와 시작
  5. 실전 사례 1: 위치 정보 추적 서비스
  6. 실전 사례 2: BLE 데이터 동기화
  7. 성능 최적화와 배터리 관리

1. 백그라운드 서비스란?

먼저 백그라운드 서비스가 정확히 무엇인지 이해해야 합니다. 백그라운드 서비스는 사용자가 앱을 닫았거나 다른 앱을 사용 중일 때도 계속 실행되는 작업을 의미합니다.

포그라운드와 백그라운드의 차이

포그라운드(Foreground)는 사용자가 현재 보고 있는 앱의 상태를 말합니다. 사용자가 화면을 터치하거나 앱과 상호작용할 수 있는 상태죠. 반면 백그라운드(Background)는 사용자가 다른 앱으로 전환했거나 홈 화면으로 나갔을 때의 상태입니다.

중요한 점은, 단순한 앱 상태 변화와 실제 서비스 운영은 다르다는 것입니다. 백그라운드 서비스는 앱이 완전히 닫혀있어도 특정 작업을 계속 수행할 수 있게 해줍니다.

왜 백그라운드 서비스가 필요한가?

  • 위치 추적: 배달 앱이나 운송 앱에서 사용자의 위치를 지속적으로 수집
  • 실시간 알림: 채팅 앱에서 메시지 수신 대기
  • 데이터 동기화: 서버와의 정기적인 데이터 동기화
  • 타이머: 스톱워치나 운동 기록 앱의 시간 측정
  • 센서 모니터링: BLE 기기나 IoT 센서와의 지속적인 연결

2. Flutter Background Service의 기본 개념

Flutter에서 백그라운드 작업을 구현하는 방법은 여러 가지가 있습니다. 가장 널리 사용되는 방법은 flutter_background_service 패키지입니다.

flutter_background_service 패키지 소개

flutter_background_service 패키지는 Flutter 애플리케이션에서 백그라운드 서비스를 제공하기 위해 특별히 설계되었습니다. 이 패키지를 사용하면 Android와 iOS 모두에서 백그라운드 작업을 구현할 수 있습니다.

플랫폼별 제한사항

백그라운드 서비스는 Android와 iOS에서만 지원된다는 점을 기억하세요. 웹이나 데스크톱 플랫폼에서는 사용할 수 없습니다.

또한 각 플랫폼마다 동작 방식이 다릅니다:

  • Android: 포그라운드 서비스를 통해 지속적이고 실시간 백그라운드 실행 가능
  • iOS: 제한적이며 주기적인 백그라운드 작업만 가능 (배경 실행 시간 제약)

Isolate와 독립된 실행 환경

중요한 특징 중 하나는 백그라운드 서비스가 별개의 함수로 실행된다는 것입니다. 이는 위젯 트리와는 완전히 독립된 Isolate(격리된 메모리 공간)에서 실행된다는 의미입니다.

덕분에 백그라운드에서 UI 업데이트를 직접 할 수 없지만, 안정성과 성능 측면에서는 매우 우수합니다.


3. Android와 iOS 환경 설정

백그라운드 서비스를 제대로 동작시키려면 각 플랫폼의 네이티브 설정이 필수적입니다.

Android 설정 (AndroidManifest.xml)

Android에서는 먼저 필요한 권한을 매니페스트에 추가해야 합니다. 위치 추적이 필요하면 위치 권한을, 포그라운드 서비스가 필요하면 포그라운드 서비스 권한을 추가합니다.

포그라운드 서비스를 사용할 때는 특히 주의가 필요합니다. Android 12 이상에서는 FOREGROUND_SERVICE 권한이 필수이며, 어떤 유형의 포그라운드 서비스를 사용할 것인지 명시해야 합니다.

iOS 설정 (Info.plist)

iOS에서는 백그라운드 작업이 매우 제한적입니다. Info.plist 파일에 특정 식별자를 등록하고, AppDelegate.swift에서도 해당 식별자를 등록해야 합니다.

iOS의 경우 지속적인 백그라운드 실행보다는 주기적인 백그라운드 새로고침 작업에 더 적합합니다. 따라서 몇 분마다 한 번씩 작업을 수행해야 하는 경우에 iOS 설정이 유용합니다.

권한 관리의 중요성

특히 위치 정보나 센서 데이터를 다룰 때는 사용자 권한이 매우 중요합니다. 앱이 시작될 때 필요한 권한을 미리 요청하고, 사용자가 거부한 경우에는 해당 기능을 비활성화해야 합니다.


4. 서비스 초기화와 시작

이제 실제로 백그라운드 서비스를 구현하는 방법을 알아봅시다.

초기화 과정

앱이 시작될 때 가장 먼저 해야 할 일은 백그라운드 서비스를 초기화하는 것입니다. 이는 main() 함수에서 runApp()을 호출하기 전에 수행되어야 합니다.

초기화 과정에서는 다음과 같은 설정들을 구성합니다:

  • Android와 iOS별 동작 방식 정의
  • 앱 시작 시 자동 시작 여부 설정
  • 포그라운드 모드 활성화 여부 결정
  • 알림 설정 구성

onStart 콜백 함수

onStart 콜백은 백그라운드 서비스가 시작될 때 실행되는 함수입니다. 이 함수 내에서 실제 백그라운드 작업을 정의합니다.

중요한 것은 @pragma('vm:entry-point') 어노테이션을 반드시 붙여야 한다는 점입니다. 이 어노테이션이 없으면 릴리스 빌드에서 문제가 발생할 수 있습니다.

iOS의 별도 처리

iOS에서는 onIosBackground 콜백이 별도로 필요합니다. 이는 iOS의 제한적인 백그라운드 실행 방식 때문입니다.

WidgetsFlutterBinding.ensureInitialized()DartPluginRegistrant.ensureInitialized()를 반드시 호출해야 iOS에서 제대로 동작합니다.

서비스 제어 명령

초기화 후에는 다양한 명령으로 서비스를 제어할 수 있습니다:

  • startService(): 백그라운드 서비스 시작
  • setAsForeground(): 서비스를 포그라운드 모드로 변경
  • setAsBackground(): 서비스를 백그라운드 모드로 변경
  • stopService(): 서비스 완전히 종료

5. 실전 사례 1: 위치 정보 추적 서비스

이제 실제 프로젝트에서 백그라운드 서비스를 어떻게 활용하는지 살펴봅시다. 첫 번째 사례는 위치 정보를 지속적으로 수집하고 저장하는 시나리오입니다.

위치 추적의 필요성

배달 앱, 운송 서비스, 피트니스 앱 등 많은 앱이 사용자의 위치를 추적해야 합니다. 이런 앱들은 사용자가 앱을 닫았을 때도 계속 위치를 기록해야 합니다.

아키텍처 설계

위치 추적 서비스를 구현할 때는 다음과 같은 구조를 사용합니다:

  1. flutter_background_service로 백그라운드 서비스 실행
  2. geolocator 패키지로 위치 정보 수집
  3. drift 패키지로 로컬 데이터베이스에 저장
  4. 앱이 포그라운드로 복귀할 때 화면에 실시간으로 표시

데이터베이스 관리

위치 데이터는 로컬 데이터베이스에 저장되어야 합니다. drift

중요한 점은 백그라운드 서비스에서도 데이터베이스에 접근할 수 있도록 Isolate를 적절히 구성해야 한다는 것입니다. 이를 위해 DriftIsolate를 사용하면 백그라운드에서도 안전하게 데이터베이스 작업을 수행할 수 있습니다.

스트림을 통한 실시간 업데이트

댓글 남기기