위치 기반 기능은 에뮬레이터/시뮬레이터만으로는 충분히 검증하기 어렵다. 실제 GPS 칩, 센서 퓨전, 배터리 상태, OS의 위치 권한 동작이 시뮬레이터와 다르기 때문이다. 그렇다고 매번 실제로 이동하면서 테스트할 수는 없다. 그래서 실기기에 가상(mock) GPS 좌표를 주입해 테스트하는 방법이 필요하다.
먼저 위치를 읽어오는 라이브러리를 확인한다. Bare React Native에서 주로 쓰이는 선택지는 두 가지다.
@react-native-community/geolocation — RN 코어에서 분리된 공식 라이브러리다. TurboModules(신아키텍처)와 구아키텍처를 모두 지원하고, TypeScript 타입을 기본 제공하며, Android에서 최신 Play Services Location API를 사용할 수 있다.
react-native-geolocation-service — Android에서 FusedLocationProviderClient를 사용해 위치 타임아웃 문제를 해결하려고 만들어진 라이브러리다. 여전히 널리 쓰이지만, 메인테이너가 유지보수 여력이 부족하다고 공지한 상태이므로 신규 프로젝트라면 위 커뮤니티 모듈을 우선 검토하는 편이 좋다.
두 라이브러리 모두 가상 GPS 테스트 방식 자체는 동일하다. OS 레벨에서 위치를 가짜로 주입하면, 어떤 라이브러리를 쓰든 그 좌표를 그대로 읽어오기 때문이다. 즉 가상 GPS 테스트는 앱 코드가 아니라 OS/툴 레벨에서 이뤄진다는 점이 핵심이다.
기본적인 위치 조회 코드 예시는 다음과 같다.
import Geolocation from '@react-native-community/geolocation';
type Coords = {
latitude: number;
longitude: number;
accuracy: number;
};
const getCurrentLocation = (): Promise<Coords> =>
new Promise((resolve, reject) => {
Geolocation.getCurrentPosition(
(position) => {
const { latitude, longitude, accuracy } = position.coords;
resolve({ latitude, longitude, accuracy });
},
(error) => reject(error),
{ enableHighAccuracy: true, timeout: 15000, maximumAge: 0 },
);
});
maximumAge: 0으로 두면 캐시된 위치를 쓰지 않고 항상 새 위치를 요청한다. 가상 GPS로 좌표를 바꿔가며 테스트할 때 캐시 때문에 옛 좌표가 나오는 것을 막아준다.
Android는 OS 차원에서 mock location 기능을 공식 제공한다. 별도 루팅 없이 개발자 옵션만 켜면 된다.
설정 > 휴대전화 정보(또는 소프트웨어 정보)로 이동한다.MIUI 버전을 탭한다.)설정 > 개발자 옵션에서 USB 디버깅도 함께 켜둔다. (ADB 사용 시 필요하다.)Android는 가짜 위치를 "주입하는 주체"로 별도의 앱을 지정해야 한다. Play 스토어의 GPS 모킹 앱(예: Fake GPS, GPS Joystick 등)을 설치한 뒤 지정한다.
이 방식이 가장 간단하지만, 좌표를 바꿀 때마다 모킹 앱을 직접 조작해야 해서 반복 테스트에는 번거롭다.
CI나 반복 테스트에서는 ADB로 좌표를 명령어로 주입하는 방식이 훨씬 편하다.
먼저 모킹 앱에 mock location 권한을 부여한다. <package-name>은 모킹 앱의 패키지명이다.
# mock location 권한 허용
adb shell appops set <package-name> android:mock_location allow
# (일부 환경) secure 설정으로 mock location 활성화
adb shell settings put secure mock_location 1
좌표를 직접 broadcast로 주입하는 방식도 있다. 예를 들어 android-mock-location-for-development 같은 헬퍼 앱을 설치하면 ADB 한 줄로 좌표를 바꿀 수 있다.
adb -s <device-id> shell am broadcast -a send.mock \
-e lat 37.5665 -e lon 126.9780 -e alt 38 -e accurate 5
위 예시는 서울 시청 좌표다.
-s <device-id>는adb devices로 확인할 수 있으며, 여러 기기가 연결돼 있을 때 특정 기기를 지정하는 옵션이다.
이렇게 하면 테스트 스크립트에서 좌표를 순차적으로 바꿔가며 "특정 지점 진입 시 알림", "경로 추적", "지오펜싱" 같은 시나리오를 자동 검증할 수 있다.
iOS는 Android처럼 OS 설정에서 mock location을 켜는 기능이 없다. 대신 Xcode를 통해 실기기에 위치를 시뮬레이션할 수 있다. Mac과 Xcode, 그리고 USB로 연결된 iOS 기기가 필요하다.
정지된 한 지점이 아니라 이동 경로를 테스트하려면 GPX(GPS Exchange Format) 파일을 사용한다. GPX는 XML 기반의 표준 GPS 데이터 포맷이다.
GPX 파일 예시:
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode"
xmlns="http://www.topografix.com/GPX/1/1">
<wpt lat="37.5665" lon="126.9780">
<time>2026-06-06T09:00:00Z</time>
</wpt>
<wpt lat="37.5700" lon="126.9820">
<time>2026-06-06T09:00:10Z</time>
</wpt>
<wpt lat="37.5750" lon="126.9870">
<time>2026-06-06T09:00:20Z</time>
</wpt>
</gpx>
적용 방법은 다음과 같다.
각 <wpt>의 <time> 값 간격에 따라 Xcode가 지점 사이를 순차적으로 이동시킨다. 즉 <time> 간격을 조절해 이동 속도를 흉내 낼 수 있다. 경로가 끝나면 다시 시작점으로 돌아간다.
팁: waypoint를 수작업으로 만들기 번거롭다면 gpxgenerator.com 같은 웹 도구나 RocketSim 같은 Xcode 보조 툴로 출발지/도착지만 지정해 GPX를 자동 생성할 수 있다.
주의: 기기를 Mac에서 분리해도 시뮬레이션된 위치가 한동안 유지될 수 있다. 즉시 해제하려면 시뮬레이션 앱을 종료하고 기기를 재시작한다.
위치 기반 앱 중에는 보안상 mock location을 차단하는 경우가 있다. 따라서 내 앱이 가짜 위치를 거부하도록 만들어져 있다면, 테스트 시 그 로직을 우회하거나 디버그 빌드에서만 허용하도록 처리해야 한다.
Android의 위치 객체는 가짜 위치 여부를 알려주는 mocked 플래그를 포함한다(API 18 이상). 라이브러리에 따라 position.mocked 형태로 노출된다.
Geolocation.getCurrentPosition((position) => {
// Android: 가짜 위치로 주입된 경우 true
// @ts-ignore — 라이브러리에 따라 타입에 없을 수 있다
const isMocked = position.mocked === true;
if (isMocked && !__DEV__) {
// 프로덕션에서는 가짜 위치 거부
return;
}
// 정상 처리
});
__DEV__ 플래그로 분기하면 개발/테스트 빌드에서는 가짜 위치를 허용하고, 프로덕션 빌드에서는 차단하는 구조를 만들 수 있다.
플랫폼 통합 감지가 필요하다면 react-native-turbo-mock-location-detector가 Android와 iOS(15.0 이상)를 모두 지원하고, 신/구 아키텍처와 호환된다. iOS 15 미만에서는 감지가 불가능(CantDetermine)하다는 점은 한계로 알아둔다.
| 항목 | Android | iOS |
|---|---|---|
| OS 차원 mock 지원 | O (개발자 옵션) | X |
| 필요 환경 | 기기 단독 / ADB | Mac + Xcode + USB 연결 |
| 단일 좌표 | 모킹 앱 또는 ADB | Custom Location |
| 경로(이동) | ADB broadcast 반복 | GPX 파일 |
| 자동화 적합성 | 높음 (ADB) | 중간 (스킴 설정 필요) |
실무에서는 다음 순서를 권장한다.
mocked 플래그와 __DEV__ 분기로 테스트 빌드에서만 가짜 위치를 허용하도록 한다.가상 GPS 테스트의 본질은 "앱 코드를 바꾸는 것"이 아니라 "OS에 주입되는 위치를 제어하는 것"이다. 이 점만 분명히 이해하면, 어떤 geolocation 라이브러리를 쓰든 동일한 방식으로 안정적인 위치 기반 기능 검증이 가능하다.