Flutter 앱을 개발하다 보면 백그라운드에서도 꾸준히 작업을 처리해야 하는 상황이 자주 발생합니다. GPS 위치 추적, 음악 재생, 타이머 운영 등 사용자 경험이 중요한 기능들 말이죠. 이런 경우에 포그라운드 서비스(Foreground Service)를 사용하면 앱이 백그라운드 상태에서도 안정적으로 동작하도록 유지할 수 있습니다.
오늘은 Flutter에서 포그라운드 서비스를 구현하는 방법과 실무에서 자주 사용되는 플러그인들을 자세히 살펴보겠습니다.
목차
- 포그라운드 서비스와 백그라운드 서비스의 차이점
- 왜 포그라운드 서비스가 필요할까?
- flutter_background_service 플러그인 소개
- flutter_foreground_task 플러그인이란?
- 포그라운드 상태 관리와 생명주기
- 실제 구현 시 주의사항
1. 포그라운드 서비스와 백그라운드 서비스의 차이점
Flutter 앱을 운영할 때 서비스는 크게 두 가지 형태로 나뉩니다. 먼저 이 둘의 차이를 정확히 이해하는 것이 중요합니다.
포그라운드 서비스(Foreground Service)의 특징
포그라운드 서비스는 사용자에게 지속적으로 알려야 하는 작업을 처리할 때 사용됩니다. 음악 재생 앱에서 재생 중인 곡 정보를 상단 바에 표시하거나, 운동 기록 앱에서 GPS를 통해 현재 위치를 추적하는 경우가 대표적입니다.
- 항상 상단 알림 표시줄에 알림 메시지 노출
- Android 운영체제가 앱을 절대 종료하지 않음
- 배터리 소모가 크므로 필요한 경우에만 사용
- 사용자가 명확히 인지할 수 있는 작업에만 사용
백그라운드 서비스(Background Service)의 특징
반면 백그라운드 서비스는 사용자 몰래 조용히 처리하는 작업을 담당합니다. 이메일 동기화, 데이터 백업, 주기적인 상태 확인 같은 것들이 여기에 해당합니다.
- 알림 표시줄에 지속적인 알림이 없음
- 메모리 부족 시 운영체제에 의해 종료될 수 있음
- 배터리 소모가 상대적으로 적음
- 한정된 시간만 작업 수행 가능
2. 왜 포그라운드 서비스가 필요할까?
많은 개발자들이 처음에는 백그라운드 서비스만으로 충분할 거라고 생각합니다. 하지만 실제 프로덕션 환경에서는 그렇지 않습니다.
Android 운영체제의 메모리 관리 정책
특히 Android 환경에서 문제가 심합니다. 기기의 메모리가 부족해지면 Android는 상대적으로 중요도가 낮은 백그라운드 서비스부터 자동으로 종료하는 ‘메모리 킬(Memory Kill)’ 정책을 적용합니다. 따라서 사용자가 앱을 열지 않은 상태에서도 계속 실행되어야 하는 기능이 있다면, 포그라운드 서비스를 통해 운영체제에 이 앱의 중요성을 알려야 합니다.
포그라운드 서비스가 필수적인 상황
- GPS 위치 추적 – 하이킹 기록 앱, 택시 앱, 배달 앱
- 음악 및 팟캐스트 재생 – 음악 스트리밍 앱
- 실시간 채팅 수신 – 메시징 앱, 소셜 커뮤니티 앱
- 타이머 작동 – 피트니스 앱, 명상 앱, ASMR 타이머 앱
- BLE 비콘 통신 – 실내 위치 기반 서비스
이런 기능들은 모두 ‘앱이 백그라운드에 있어도 반드시 작동해야 하는’ 특성을 가지고 있습니다.
3. flutter_background_service 플러그인 소개
Flutter에서 가장 널리 사용되는 포그라운드 서비스 플러그인이 바로 flutter_background_service입니다. 이 플러그인은 Android와 iOS 양쪽에서 모두 작동하며, 비교적 사용하기 쉽다는 장점이 있습니다.
플러그인 설치 방법
flutter_background_service는 두 가지 방식으로 설치할 수 있습니다. 첫 번째는 커맨드 라인을 통한 설치이고, 두 번째는 pubspec.yaml 파일에 직접 추가하는 방식입니다.
커맨드 라인으로 설치할 경우 다음 명령어를 사용합니다:
“`bash
flutter pub add flutter_background_service
“`
또는 pubspec.yaml 파일에 다음과 같이 직접 추가하면 됩니다:
“`yaml
dependencies:
flutter_background_service: ^5.0.5
“`
기본 구조 이해하기
flutter_background_service를 사용할 때 이해해야 할 핵심 개념은 서비스 인스턴스(Service Instance)입니다. 이는 백그라운드에서 실제로 작동하는 격리된 실행 환경을 의미합니다.
중요한 점은 이 서비스가 메인 앱과 완전히 분리된 별도의 프로세스에서 실행된다는 것입니다. 따라서 메인 앱에서 사용하는 상태 관리나 전역 변수에 직접 접근할 수 없습니다.
Android와 iOS의 설정 차이
flutter_background_service는 Android와 iOS의 차이를 고려해서 설계되었습니다. 플러그인을 초기화할 때는 각 플랫폼별로 다른 콜백 함수를 등록해야 합니다.
Android 설정의 특징:
- 포그라운드 모드(isForegroundMode: true)와 백그라운드 모드를 선택 가능
- 포그라운드 모드일 때 알림 표시줄에 항상 알림이 표시됨
- 자동 시작(autoStart) 옵션으로 기기 재부팅 후 자동 실행 가능
iOS 설정의 특징:
- 백그라운드 작업을 위해 별도의 callback 함수(onIosBackground) 필요
- iOS에서는 제한적인 백그라운드 모드만 지원
- 위치 서비스나 음악 재생 같은 특정 용도로만 백그라운드 실행 가능
서비스 제어 명령어
플러그인을 설치하고 초기화한 후에는 서비스를 제어해야 합니다. flutter_background_service는 명령어 기반의 제어 방식을 사용합니다.
- startService() – 서비스 시작
- invoke(‘setAsForeground’) – 서비스를 포그라운드 상태로 전환
- invoke(‘setAsBackground’) – 서비스를 백그라운드 상태로 전환
- invoke(‘stopService’) – 서비스 정지
이 명령어들을 조합하면 사용자의 인터랙션에 따라 유동적으로 서비스를 관리할 수 있습니다.
4. flutter_foreground_task 플러그인이란?
flutter_background_service 외에도 flutter_foreground_task라는 또 다른 인기 있는 플러그인이 있습니다. 이 플러그인은 특히 타이머나 주기적인 작업을 처리할 때 더 간편하다는 평가를 받고 있습니다.
두 플러그인의 선택 기준
어떤 플러그인을 선택할지는 여러분이 구현하려는 기능에 따라 달라집니다.
flutter_background_service를 선택해야 할 때:
- GPS 위치 추적처럼 복잡한 데이터 처리가 필요할 때
- 로컬 데이터베이스와 서비스의 상호작용이 필요할 때
- Android와 iOS에서 모두 고도화된 기능이 필요할 때
flutter_foreground_task를 선택해야 할 때:
- ASMR 타이머처럼 단순한 주기적 작업만 필요할 때
- 빠른 구현과 안정성이 중요할 때
- Handler 클래스를 통한 명확한 구조를 선호할 때
flutter_foreground_task의 특징
이 플러그인은 Handler 클래스 기반의 아키텍처를 사용합니다. 백그라운드에서 실행될 함수들을 Handler 클래스에 정의하면, 별도의 작업 없이 자동으로 포그라운드 서비스로 실행되는 방식입니다.
구조가 더 직관적이기 때문에 처음 포그라운드 서비스를 다루는 개발자들이 배우기 쉬운 편입니다.
5. 포그라운드 상태 관리와 생명주기
Flutter 앱의 생명주기를 정확히 이해하는 것은 포그라운드 서비스를 제대로 사용하기 위한 필수 조건입니다.
AppLifecycleState의 네 가지 상태
Flutter는 앱의 상태를 네 가지로 구분합니다.
1. resumed
앱이 현재 화면에 표시되고 있는 상태입니다. 사용자가 활발히 앱을 사용 중인 순간이죠. 이