React Native에서 실기기에 가상 GPS로 위치 테스트 하기

eeennsu·2026년 7월 8일

React Native

목록 보기
64/93

개요

위치 기반 기능은 에뮬레이터/시뮬레이터만으로는 충분히 검증하기 어렵다. 실제 GPS 칩, 센서 퓨전, 배터리 상태, OS의 위치 권한 동작이 시뮬레이터와 다르기 때문이다. 그렇다고 매번 실제로 이동하면서 테스트할 수는 없다. 그래서 실기기에 가상(mock) GPS 좌표를 주입해 테스트하는 방법이 필요하다.



1. 사전 준비 — Geolocation 라이브러리

먼저 위치를 읽어오는 라이브러리를 확인한다. 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로 좌표를 바꿔가며 테스트할 때 캐시 때문에 옛 좌표가 나오는 것을 막아준다.



2. Android 실기기에서 가상 GPS 주입하기

Android는 OS 차원에서 mock location 기능을 공식 제공한다. 별도 루팅 없이 개발자 옵션만 켜면 된다.

1) 개발자 옵션 활성화

  1. 설정 > 휴대전화 정보(또는 소프트웨어 정보)로 이동한다.
  2. 빌드 번호(Build Number)를 연속 7번 탭한다. (Xiaomi/MIUI는 MIUI 버전을 탭한다.)
  3. "개발자 모드가 켜졌습니다" 메시지가 뜨면 완료다.
  4. 설정 > 개발자 옵션에서 USB 디버깅도 함께 켜둔다. (ADB 사용 시 필요하다.)

2) Mock Location 앱 설치 및 지정

Android는 가짜 위치를 "주입하는 주체"로 별도의 앱을 지정해야 한다. Play 스토어의 GPS 모킹 앱(예: Fake GPS, GPS Joystick 등)을 설치한 뒤 지정한다.

  1. 개발자 옵션 안에서 "모의 위치 앱 선택(Select mock location app)" 항목을 찾는다.
  2. 설치한 모킹 앱을 선택한다.
  3. 모킹 앱을 열어 원하는 좌표를 지정하면, 해당 좌표가 OS의 위치 서비스로 흘러 들어간다.

이 방식이 가장 간단하지만, 좌표를 바꿀 때마다 모킹 앱을 직접 조작해야 해서 반복 테스트에는 번거롭다.


3) ADB로 좌표 주입 자동화 (권장)

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로 확인할 수 있으며, 여러 기기가 연결돼 있을 때 특정 기기를 지정하는 옵션이다.

이렇게 하면 테스트 스크립트에서 좌표를 순차적으로 바꿔가며 "특정 지점 진입 시 알림", "경로 추적", "지오펜싱" 같은 시나리오를 자동 검증할 수 있다.



3. iOS 실기기에서 가상 GPS 주입하기

iOS는 Android처럼 OS 설정에서 mock location을 켜는 기능이 없다. 대신 Xcode를 통해 실기기에 위치를 시뮬레이션할 수 있다. Mac과 Xcode, 그리고 USB로 연결된 iOS 기기가 필요하다.

1) 단일 좌표 시뮬레이션

  1. Xcode에서 앱을 실기기에 빌드/실행한다.
  2. 디버그 세션이 활성화된 상태에서, Xcode 하단 디버그 영역의 위치 화살표 아이콘을 누른다.
  3. 미리 정의된 도시 목록에서 선택하거나, Custom Location을 골라 위도/경도를 직접 입력한다.

2) GPX 파일로 경로(이동) 시뮬레이션

정지된 한 지점이 아니라 이동 경로를 테스트하려면 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>

적용 방법은 다음과 같다.

  1. Edit Scheme > Run > Options 탭에서 "Allow Location Simulation"을 체크한다.
  2. Xcode 메뉴에서 Debug(또는 Run) > Simulate Location > Add GPX File to Workspace를 선택한다.
  3. 위에서 만든 GPX 파일을 추가한다.
  4. 다시 Simulate Location 메뉴를 열면 추가한 GPX 파일이 목록에 보인다. 선택하면 시뮬레이션이 시작된다.

<wpt><time> 값 간격에 따라 Xcode가 지점 사이를 순차적으로 이동시킨다. 즉 <time> 간격을 조절해 이동 속도를 흉내 낼 수 있다. 경로가 끝나면 다시 시작점으로 돌아간다.

팁: waypoint를 수작업으로 만들기 번거롭다면 gpxgenerator.com 같은 웹 도구나 RocketSim 같은 Xcode 보조 툴로 출발지/도착지만 지정해 GPX를 자동 생성할 수 있다.

주의: 기기를 Mac에서 분리해도 시뮬레이션된 위치가 한동안 유지될 수 있다. 즉시 해제하려면 시뮬레이션 앱을 종료하고 기기를 재시작한다.



4. 가짜 위치(mock) 감지 — 앱이 막을 수 있다

위치 기반 앱 중에는 보안상 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)하다는 점은 한계로 알아둔다.




5. 정리

항목AndroidiOS
OS 차원 mock 지원O (개발자 옵션)X
필요 환경기기 단독 / ADBMac + Xcode + USB 연결
단일 좌표모킹 앱 또는 ADBCustom Location
경로(이동)ADB broadcast 반복GPX 파일
자동화 적합성높음 (ADB)중간 (스킴 설정 필요)

실무에서는 다음 순서를 권장한다.

  1. 개발 초기 빠른 확인 — Android는 모킹 앱, iOS는 Xcode Custom Location으로 즉시 확인한다.
  2. 경로/지오펜싱 테스트 — Android는 ADB broadcast 스크립트, iOS는 GPX 파일로 이동 시나리오를 재현한다.
  3. 반복/회귀 테스트 — Android ADB를 CI 스크립트에 통합해 좌표 시퀀스를 자동 주입한다.
  4. mock 차단 로직 점검mocked 플래그와 __DEV__ 분기로 테스트 빌드에서만 가짜 위치를 허용하도록 한다.

가상 GPS 테스트의 본질은 "앱 코드를 바꾸는 것"이 아니라 "OS에 주입되는 위치를 제어하는 것"이다. 이 점만 분명히 이해하면, 어떤 geolocation 라이브러리를 쓰든 동일한 방식으로 안정적인 위치 기반 기능 검증이 가능하다.

profile
이력서 https://resume.eunsu.pro

0개의 댓글