Experiment
Dote
사용자가 머문 장소를 직접 기록하지 않아도 생활 루틴으로 남길 수 있는지 검증한 위치 기반 모바일 실험입니다. OS 지오펜스 이벤트, 로컬 우선 저장과 서버 동기화 파이프라인을 구현했습니다.
Mobile · Backend · Location · Infrastructure / 2026.02
매번 앱을 열어 체크인하지 않아도 반복해서 찾는 장소와 생활 패턴을 기록할 수 있는지 실험했습니다.
What I explored
Dote는 사용자의 이동과 체류를 자동으로 감지해 일상의 방문 패턴을 기록하는 모바일 서비스로 시작했습니다. 등록된 관심 지점, 새롭게 감지된 후보 지점, 사용자가 제외한 지점을 구분하고, 반복 방문을 날짜별 히트맵으로 보여 주는 것이 목표였습니다.
위치 기록은 앱이 열려 있을 때만 동작해서는 의미가 없었습니다. 포그라운드, 백그라운드와 종료 상태에서도 같은 판정 규칙을 사용하고, 네트워크나 로그인 상태와 관계없이 먼저 기록을 보존하는 구조가 핵심 과제였습니다.
What I built
Expo와 React Native에서 OS 지오펜스의 이탈 이벤트를 받아 현재 위치를 측정하고, 이전 좌표와의 거리·체류 시간을 기준으로 유효한 체류를 판정하는 파이프라인을 구현했습니다. 판정된 지점은 등록 장소, 후보 장소와 제외 장소 순서로 대조하고, 방문 기록 또는 새로운 후보 장소로 저장했습니다.
위치 로그, 장소와 방문 기록은 SQLite를 신뢰 저장소로 사용했습니다. 백그라운드 작업은 로그인 여부와 무관하게 로컬에 먼저 기록하고, 앱이 포그라운드로 돌아오면 미전송 데이터를 묶어 서버로 보낸 뒤 서버의 최신 장소 목록을 다시 받아오도록 구성했습니다. 재시도에는 지수 백오프를 적용하고, 서버가 발급한 후보 장소 ID를 로컬 방문 기록에도 반영했습니다.
NestJS와 Prisma 기반 API에는 카카오 인증, 장소·위치 로그·방문 기록과 배치 동기화 기능을 구현했습니다. API Gateway와 Lambda 배포 구조는 AWS CDK로 정의하고, 모바일과 서버가 같은 위치 데이터 타입을 공유하는 pnpm·Turborepo 모노레포로 구성했습니다.
Where it stopped
백그라운드 수집, 체류 판정, 로컬 저장과 서버 동기화는 실제 기기에서 확인할 수 있는 개발 화면까지 구현했습니다. 다만 사용자가 후보 장소를 검토하고 등록·제외하는 화면, 방문 패턴을 보여 주는 히트맵과 위젯은 제품 화면으로 완성하지 않았습니다.
핵심 데이터 파이프라인을 먼저 검증한 뒤 실험을 멈췄기 때문에, Dote는 출시된 앱보다 모바일 운영체제의 제약 안에서 위치 기록이 얼마나 안정적으로 이어질 수 있는지 확인한 프로토타입에 가깝습니다.
What I learned
백그라운드 기능에서는 화면보다 운영체제가 호출하는 작업의 생명주기가 먼저였습니다. UI 상태에 기대지 않는 단일 처리 경로와 로컬 우선 저장이 있어야 앱이 종료되거나 네트워크가 끊겨도 기록을 이어갈 수 있었습니다.
또한 위치 데이터의 정확도는 한 번의 좌표보다 시간, 거리와 사용자 피드백을 함께 해석해야 높아졌습니다. 후보 지점과 제외 지점을 별도 상태로 둔 이유도 자동 판정을 확정 사실로 취급하지 않고 사용자가 수정할 여지를 남기기 위해서였습니다.