시리즈 개요
이 시리즈는 이론적인 아키텍처 설계를 실제 동작하는 애플리케이션으로 구현하는 과정을 다룹니다. Supabase를 백엔드로 사용하여 서버 구축 없이 빠르게 개발하고, 배송 기사가 실제 업무에 사용할 수 있는 수준의 앱을 완성합니다. 주문자 앱은 제외하고 배송 기사 앱에만 집중하여, 핵심 기능인 위치 추적과 배송 관리를 완벽하게 구현합니다.
| 시리즈 특징 | 설명 |
|---|---|
| 구현 범위 | 배송 기사 앱만 구축 (주문자 앱 제외) |
| 백엔드 | Supabase (PostgreSQL, Realtime, Storage, Auth) |
| 핵심 기능 | 실시간 위치 추적, 배송 목록 관리, 상태 업데이트 |
| 난이도 | 중급 이상 (Platform Channels, 백그라운드 서비스 포함) |
| 예상 시리즈 | 총 8편 (기초 → 고급 → 최적화) |
시리즈 전체 구성
1편: 프로젝트 기초 설정과 Supabase 구성
시리즈의 첫 단계로 개발 환경을 구축하고 Supabase 프로젝트를 설정합니다. Flutter 프로젝트를 생성하고 필요한 의존성을 추가한 후, Supabase 콘솔에서 데이터베이스 테이블을 설계합니다. 배송 기사가 사용할 핵심 테이블 구조를 정의하고, Row Level Security 정책을 설정하여 각 기사가 자신의 데이터만 접근하도록 보안을 구성합니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| 환경 설정 | Flutter 프로젝트 생성, 의존성 추가, 폴더 구조 |
| Supabase 테이블 | riders, deliveries, delivery_locations, delivery_status_history |
| 인증 설정 | Supabase Auth 연동, 이메일 로그인, 세션 관리 |
| 기본 UI | 로그인 화면, 메인 레이아웃, 네비게이션 구조 |
2편: 배송 목록 조회와 상태 관리
배송 기사가 할당받은 배송 건을 조회하고 관리하는 기능을 구현합니다. Supabase에서 배송 목록을 가져와 화면에 표시하고, 각 배송의 상태를 업데이트할 수 있도록 합니다. Riverpod을 사용하여 상태를 관리하고, Supabase Realtime을 활용하여 새로운 배송이 할당되면 자동으로 목록이 업데이트되도록 구현합니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| 데이터 조회 | Supabase 쿼리, 필터링, 정렬 |
| 상태 관리 | Riverpod Provider 구성, AsyncValue 처리 |
| Realtime 연동 | Supabase Realtime 구독, 자동 UI 업데이트 |
| UI 구현 | 배송 목록 화면, 상세 정보, 상태 변경 버튼 |
3편: 네이티브 위치 수집 구현 (Android)
Android에서 백그라운드 위치 수집을 구현합니다. Foreground Service를 생성하여 앱이 백그라운드에 있어도 위치를 계속 수집하고, FusedLocationProviderClient를 사용하여 배터리 효율적인 위치 추적을 구현합니다. Platform Channels를 설정하여 네이티브에서 수집한 위치를 Flutter로 전달하는 구조를 만듭니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| Foreground Service | 서비스 생성, 알림 표시, 생명주기 관리 |
| 위치 수집 | FusedLocationProviderClient, LocationRequest 설정 |
| 권한 처리 | 위치 권한, 백그라운드 위치 권한 요청 |
| MethodChannel | 위치 추적 시작/중지 명령 전달 |
| EventChannel | 위치 데이터 스트리밍 |
4편: 네이티브 위치 수집 구현 (iOS)
iOS에서 백그라운드 위치 수집을 구현합니다. CLLocationManager를 사용하여 위치를 추적하고, Background Modes를 활성화하여 백그라운드 동작을 보장합니다. Android와 동일한 Platform Channels 인터페이스를 사용하여 플랫폼 간 일관된 API를 제공하며, iOS 특유의 권한 처리와 제약사항을 다룹니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| CLLocationManager | 위치 관리자 설정, Delegate 구현 |
| Background Modes | Info.plist 설정, Background Location Updates |
| 권한 처리 | 위치 권한, Always 권한 요청 흐름 |
| 배터리 최적화 | 정확도 조절, 거리 필터, Significant Location Changes |
| 플랫폼 통합 | Android와 동일한 채널 인터페이스 |
5편: Flutter와 Supabase 위치 동기화
네이티브에서 수집한 위치를 Flutter로 받아 Supabase에 저장합니다. EventChannel로 위치 스트림을 구독하고, 배치 처리를 통해 효율적으로 서버에 전송합니다. 네트워크 오류 발생 시 로컬 데이터베이스에 저장했다가 재시도하는 로직을 구현하고, 배송 상태에 따라 위치 수집 주기를 동적으로 조절합니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| 스트림 처리 | EventChannel 구독, 위치 데이터 파싱 |
| 배치 전송 | 여러 위치를 묶어서 Supabase에 저장 |
| 오프라인 대응 | Drift (SQLite) 로컬 저장, 자동 동기화 |
| 동적 주기 조절 | 배송 상태별 위치 수집 빈도 변경 |
| 에러 처리 | 재시도 로직, 지수 백오프 |
6편: 배송 상태 관리와 워크플로우
배송의 전체 생명주기를 관리하는 워크플로우를 구현합니다. 배송 시작, 픽업 완료, 배송 중, 배송 완료 등 각 단계를 상태 머신으로 관리하고, 상태 변경 시 Supabase에 히스토리를 기록합니다. 낙관적 업데이트를 적용하여 즉각적인 UI 반응을 제공하고, 서버 동기화 실패 시 롤백하는 로직을 구현합니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| 상태 머신 | 배송 상태 정의, 유효한 전이 규칙 |
| 상태 업데이트 | Supabase RPC 함수, 트랜잭션 처리 |
| 히스토리 기록 | 상태 변경 이력 저장, 타임스탬프 관리 |
| 낙관적 업데이트 | 즉시 UI 변경, 서버 실패 시 롤백 |
| 알림 | 배송 시작/완료 시 관리자에게 알림 |
7편: 지도 통합과 경로 표시
Google Maps를 통합하여 배송 경로를 시각화합니다. 현재 위치를 실시간으로 지도에 표시하고, 배송지까지의 경로를 그립니다. 수집된 위치 히스토리를 폴리라인으로 표시하여 이동 경로를 보여주고, 배송지 마커와 거리 정보를 함께 제공합니다. 지도 성능 최적화를 위해 마커와 폴리라인을 효율적으로 관리하는 방법을 다룹니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| Google Maps | google_maps_flutter 패키지, API 키 설정 |
| 실시간 위치 | 현재 위치 마커, 부드러운 이동 애니메이션 |
| 경로 표시 | Polyline으로 이동 경로 그리기 |
| 배송지 마커 | 목적지 표시, 거리 계산 |
| 성능 최적화 | 마커 클러스터링, 폴리라인 간소화 |
8편: 성능 최적화와 배포
앱의 성능을 측정하고 최적화합니다. 배터리 소모를 분석하여 위치 수집 전략을 조정하고, 메모리 누수를 찾아 수정합니다. 네트워크 사용량을 줄이기 위한 압축과 캐싱 전략을 적용하고, 앱 크기를 최적화합니다. 마지막으로 Play Store와 App Store 배포를 위한 준비 과정과 주의사항을 다룹니다.
| 다룰 내용 | 세부 항목 |
|---|---|
| 배터리 측정 | Android Profiler, Xcode Instruments 사용 |
| 메모리 최적화 | DevTools로 누수 탐지, 스트림 정리 |
| 네트워크 최적화 | gzip 압축, 이미지 최적화, 캐싱 |
| 앱 크기 감소 | 코드 난독화, 미사용 리소스 제거 |
| 배포 준비 | 서명, 권한 설명, 스토어 메타데이터 |
시리즈 연결 구조
| 편 | 핵심 주제 | 이전 편과의 연결 | 다음 편 준비 |
|---|---|---|---|
| 1편 | 프로젝트 초기 설정 | 없음 (시작점) | 테이블 구조가 2편의 기반 |
| 2편 | 배송 목록 관리 | 1편의 테이블 사용 | 상태 관리가 6편의 기반 |
| 3편 | Android 위치 수집 | 독립적 (네이티브) | 5편에서 Flutter와 연결 |
| 4편 | iOS 위치 수집 | 3편과 동일 인터페이스 | 5편에서 Flutter와 연결 |
| 5편 | 위치 동기화 | 3, 4편의 채널 활용 | 6편에서 상태와 통합 |
| 6편 | 상태 워크플로우 | 2편의 상태 관리 확장 | 7편에서 지도와 결합 |
| 7편 | 지도 통합 | 5편의 위치 데이터 사용 | 8편에서 성능 검증 |
| 8편 | 최적화와 배포 | 전체 시리즈 통합 | 완결 |
기술 스택 정리
| 영역 | 기술 | 사용 목적 |
|---|---|---|
| Flutter | 3.24+ (최신 안정 버전) | 크로스 플랫폼 개발 |
| 상태 관리 | Riverpod 2.5+ | 상태 관리, 의존성 주입 |
| 백엔드 | Supabase (PostgreSQL, Realtime) | 데이터 저장, 실시간 업데이트 |
| 로컬 DB | Drift (SQLite) | 오프라인 데이터 저장 |
| 지도 | google_maps_flutter | 위치 시각화 |
| Android 위치 | FusedLocationProviderClient | 효율적인 위치 수집 |
| iOS 위치 | CLLocationManager | iOS 위치 추적 |
| Platform Channels | MethodChannel, EventChannel | 네이티브-Flutter 통신 |
학습 전제 조건
이 시리즈는 중급 이상의 Flutter 개발자를 대상으로 합니다. 시작하기 전에 다음 내용을 이해하고 있어야 원활하게 따라올 수 있습니다.
| 필수 선행 지식 | 수준 |
|---|---|
| Flutter 기본 | 위젯, 상태, 비동기 프로그래밍 |
| Dart 언어 | 클래스, Future, Stream, async/await |
| 상태 관리 | Provider 또는 Riverpod 기초 |
| REST API | HTTP 통신, JSON 파싱 |
| 네이티브 기초 | Android (Kotlin/Java), iOS (Swift) 읽기 수준 |
| Git | 버전 관리 기본 명령어 |
시리즈 완료 후 성과
이 시리즈를 완료하면 실무에 바로 적용할 수 있는 배송 추적 앱을 구축할 수 있습니다. Platform Channels를 통한 네이티브 통합 능력, Supabase를 활용한 백엔드 연동 경험, 백그라운드 위치 추적 구현 능력을 갖추게 됩니다. 또한 성능 최적화와 배포 과정까지 경험하여 엔터프라이즈급 앱 개발의 전체 흐름을 이해하게 됩니다.
| 성과 | 구체적인 역량 |
|---|---|
| 완성된 앱 | 실제 배송 업무에 사용 가능한 기사용 앱 |
| 네이티브 통합 | Android/iOS 백그라운드 위치 수집 구현 |
| Platform Channels | MethodChannel, EventChannel 실전 활용 |
| Supabase 활용 | Auth, Database, Realtime 전체 기능 사용 |
| 성능 최적화 | 배터리, 메모리, 네트워크 최적화 경험 |
| 배포 경험 | Play Store, App Store 배포 준비 |
마무리
이 시리즈는 이론에서 실전으로 나아가는 완전한 학습 경로를 제공합니다. 앞서 작성된 아키텍처 가이드에서 제시한 설계 원칙을 실제 코드로 구현하면서, 엔터프라이즈급 앱 개발의 모든 단계를 경험하게 됩니다. 각 편은 독립적으로 학습할 수 있지만, 순서대로 따라가면 자연스럽게 완성된 앱을 만들 수 있도록 구성했습니다. 시리즈를 통해 배운 내용은 배송 앱뿐만 아니라 위치 기반 서비스, 실시간 추적이 필요한 모든 앱에 적용할 수 있습니다.