본문 바로가기
flutter

Flutter에서 백그라운드 위치 수집,어떤 방법을 골랐나

by Rogan_Kim 2026. 3. 19.
728x90

배경

신규 기능 개발 과정에서 유저의 이동 경로를 수집해야 하는 요구사항이 생겼다. 단순히 앱을 켰을 때 위치를 한 번 가져오는 게 아니라, 앱이 완전히 종료된 Terminated 상태에서도 위치 데이터가 끊기지 않아야 한다는 조건이 핵심이었다.

Flutter 앱이기 때문에 pub.dev에서 라이브러리를 찾기 시작했고, 선택지가 생각보다 복잡하다는 걸 바로 깨달았다.

앱 상태 3가지를 먼저 이해해야 한다

모바일 앱의 실행 상태는 크게 세 가지로 나뉜다.

상태설명위치 수집 난이도

상태 설명 위치 수집 난이도
Foreground 앱이 화면에 보이고 사용 중 쉬움
Background 앱이 열려 있으나 화면 밖 (홈 화면 등) 보통
Terminated 앱 프로세스가 완전히 종료된 상태 어려움

이동 경로 수집에서 Terminated가 문제다. 유저가 앱을 꺼도 데이터가 쌓여야 하기 때문이다. geolocator나 location 같은 일반적인 패키지는 이 상태에서 작동하지 않는다.

Flutter가 불리한 건가?

처음엔 "네이티브로 짜면 그냥 되는 거 아닌가?"라는 의문이 들었다. 결론은 Flutter 때문이 아니라 OS 때문이다.

Android도 네이티브 Kotlin으로 짜도 Foreground Service나 JobScheduler 없이는 백그라운드 실행이 막힌다. 삼성·Xiaomi의 배터리 킬러는 네이티브라고 봐주지 않는다.
iOS는 더 엄격하다. 네이티브 Swift로 짜도 CLLocationManager의 significant location change API 외에는 Terminated 상태에서 실행할 방법이 없다. Apple이 OS 레벨에서 막아놓은 것이다.

다만 Flutter는 Dart VM 기동 오버헤드가 있어서, OS가 앱을 깨울 때 네이티브보다 수백ms 늦게 처리 가능한 상태가 된다. 이게 Headless 모드가 필요한 이유다.

Flutter네이티브

  Flutter 네이티브
OS 제약 동일 동일
OEM 배터리 킬러 동일 동일
Dart VM 기동 오버헤드 있음 없음
Headless 처리 별도 구현 필요 자연스럽게 가능

라이브러리 후보 비교

Terminated 상태까지 지원하는 Flutter 라이브러리를 추려보면 현실적인 선택지는 두 개다.

라이브러리TerminatedOEM 대응비용검증 수준

라이브러리 Terminated OEM 대응 비용 검증 수준
geolocator 무료 성숙
background_locator_2 △ iOS 불안정 미흡 무료 방치됨
flutter_background_geolocation 10년치 누적 $499 최고
Tracelet 미지수 무료 2026년 신생

flutter_background_geolocation이 왜 Terminated를 해결하나

이 라이브러리가 $499인 이유는 Flutter/Dart 레이어를 우회해서 네이티브 OS API를 직접 다루기 때문이다. iOS에서는 CLLocationManager의 significant location change를 통해 OS가 직접 앱 프로세스를 재시작시키고, Dart 없이 네이티브 코드만으로 위치를 처리한 뒤 SQLite에 저장한다. 이걸 Headless 모드라고 부른다.

bg.BackgroundGeolocation.ready(bg.Config(
  app: bg.AppConfig(
    stopOnTerminate: false,  // 앱 종료 후에도 계속
    startOnBoot: true,       // 재부팅 후 자동 시작
  ),
));

세 가지 케이스로 정리

요구사항과 예산에 따라 선택지는 세 갈래다.

CASE A

만보계 리워드 방식

앱 실행 중에만 위치 수집. 잼핏포인트처럼 앱을 켜야 보상을 받는 구조. geolocator로 충분하고 비용도 없다.

CASE B

상시 수집 (유료)

앱 종료 후에도 연속 수집. flutter_background_geolocation 사용. 데이터 품질 최고, 라이선스 $499.

CASE C

상시 수집 (무료)

Tracelet 사용. 동일한 구조로 무료지만 2026년 신생 라이브러리. 참여자 환경 통제가 필요하다.

Case ACase BCase C

  Case A Case B Case C
데이터 연속성 낮음 완전 조건부
비용 무료 $499 무료
구현 난이도 쉬움 중간 중간
팁스 과제 적합도 중간 최고 중상

최종 선택 — Case C (Tracelet)

팁스 과제 예산으로 $499 라이선스를 집행하기 어려웠다. 네이티브 직접 구현은 사실상 라이브러리를 새로 만드는 수준의 작업량이라 일정상 불가능했다.

Tracelet은 2026년 2월에 나온 신생 라이브러리지만, 팁스 과제가 일반 사용자 대상 서비스가 아니라 통제된 연구 환경이라는 점이 핵심이었다.

피험자 환경 통제로 OEM 이슈 우회 가능. 배터리 최적화 예외 설정을 연구 참여 안내문에 포함시키면, 일반 서비스에서 문제가 되는 삼성·Xiaomi 배터리 킬러 이슈를 회피할 수 있다.
더보기

DECISION

Tracelet으로 백그라운드 위치 수집 구현.

앱  최초 실행 시 배터리 최적화 예외 설정을 필수 절차로 포함.

데이터 수집 이상 감지 시 flutter_background_geolocation 전환 검토. 과제 예산 확보되면 라이선스 구매 우선 고려.


회고

이번 고민에서 배운 것은 "Flutter라서 못 한다"는 게 아니라 "OS가 막는다"는 사실이다. Flutter는 Dart VM 오버헤드라는 추가 복잡도가 있을 뿐, 근본적인 제약은 네이티브와 동일하다.

라이브러리 선택은 기술 스펙보다 프로젝트 맥락이 더 중요했다. 상용 서비스였다면 Case B가 정답이지만, 통제된 연구 환경에서는 Case C가 현실적인 선택이 될 수 있다.

Tracelet이 실전에서 어떻게 동작하는지는 구현 후 별도 포스팅으로 정리할 예정이다.

728x90

댓글