배경
신규 기능 개발 과정에서 유저의 이동 경로를 수집해야 하는 요구사항이 생겼다. 단순히 앱을 켰을 때 위치를 한 번 가져오는 게 아니라, 앱이 완전히 종료된 Terminated 상태에서도 위치 데이터가 끊기지 않아야 한다는 조건이 핵심이었다.
Flutter 앱이기 때문에 pub.dev에서 라이브러리를 찾기 시작했고, 선택지가 생각보다 복잡하다는 걸 바로 깨달았다.
앱 상태 3가지를 먼저 이해해야 한다
모바일 앱의 실행 상태는 크게 세 가지로 나뉜다.
상태설명위치 수집 난이도
| 상태 | 설명 | 위치 수집 난이도 |
| Foreground | 앱이 화면에 보이고 사용 중 | 쉬움 |
| Background | 앱이 열려 있으나 화면 밖 (홈 화면 등) | 보통 |
| Terminated | 앱 프로세스가 완전히 종료된 상태 | 어려움 |
이동 경로 수집에서 Terminated가 문제다. 유저가 앱을 꺼도 데이터가 쌓여야 하기 때문이다. geolocator나 location 같은 일반적인 패키지는 이 상태에서 작동하지 않는다.
Flutter가 불리한 건가?
처음엔 "네이티브로 짜면 그냥 되는 거 아닌가?"라는 의문이 들었다. 결론은 Flutter 때문이 아니라 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, // 재부팅 후 자동 시작
),
));
세 가지 케이스로 정리
요구사항과 예산에 따라 선택지는 세 갈래다.
만보계 리워드 방식
앱 실행 중에만 위치 수집. 잼핏포인트처럼 앱을 켜야 보상을 받는 구조. geolocator로 충분하고 비용도 없다.
상시 수집 (유료)
앱 종료 후에도 연속 수집. flutter_background_geolocation 사용. 데이터 품질 최고, 라이선스 $499.
상시 수집 (무료)
Tracelet 사용. 동일한 구조로 무료지만 2026년 신생 라이브러리. 참여자 환경 통제가 필요하다.
Case ACase BCase C
| Case A | Case B | Case C | |
| 데이터 연속성 | 낮음 | 완전 | 조건부 |
| 비용 | 무료 | $499 | 무료 |
| 구현 난이도 | 쉬움 | 중간 | 중간 |
| 팁스 과제 적합도 | 중간 | 최고 | 중상 |
최종 선택 — Case C (Tracelet)
팁스 과제 예산으로 $499 라이선스를 집행하기 어려웠다. 네이티브 직접 구현은 사실상 라이브러리를 새로 만드는 수준의 작업량이라 일정상 불가능했다.
Tracelet은 2026년 2월에 나온 신생 라이브러리지만, 팁스 과제가 일반 사용자 대상 서비스가 아니라 통제된 연구 환경이라는 점이 핵심이었다.
DECISION
Tracelet으로 백그라운드 위치 수집 구현.
앱 최초 실행 시 배터리 최적화 예외 설정을 필수 절차로 포함.
데이터 수집 이상 감지 시 flutter_background_geolocation 전환 검토. 과제 예산 확보되면 라이선스 구매 우선 고려.
회고
이번 고민에서 배운 것은 "Flutter라서 못 한다"는 게 아니라 "OS가 막는다"는 사실이다. Flutter는 Dart VM 오버헤드라는 추가 복잡도가 있을 뿐, 근본적인 제약은 네이티브와 동일하다.
라이브러리 선택은 기술 스펙보다 프로젝트 맥락이 더 중요했다. 상용 서비스였다면 Case B가 정답이지만, 통제된 연구 환경에서는 Case C가 현실적인 선택이 될 수 있다.
Tracelet이 실전에서 어떻게 동작하는지는 구현 후 별도 포스팅으로 정리할 예정이다.
'flutter' 카테고리의 다른 글
| Flutter WebView net::ERR_UNKNOWN_URL_SCHEME (0) | 2025.05.06 |
|---|---|
| flutter, js_interop 사용 후기 및 언제 사용할까 (0) | 2025.04.30 |
| infinity_scroll_shell 오픈소스 배포 과정 기록 (6) | 2024.09.18 |
| Flutter - toss payment결제 페이지 webView 연동 (0) | 2024.05.09 |
| flutter Understanding constraints (0) | 2024.05.08 |
댓글