React Native와 Expo에서 OTA 업데이트를 이해하는 방법
작성자 홍서진
듀오랩스 대표·2분 읽기
OTA(Over-The-Air) 업데이트는 앱 스토어 심사를 거치지 않고 설치된 앱의 JavaScript 코드와 에셋을 갱신하는 방식입니다. React Native와 Expo 환경에서는 빠른 버그 수정과 작은 기능 개선에 매우 유용합니다.
OTA로 가능한 것
OTA 업데이트는 네이티브 바이너리를 바꾸지 않는 변경에 적합합니다.
가능한 예시는 다음과 같습니다.
- JavaScript 로직 수정
- React 컴포넌트와 화면 변경
- 스타일 수정
- 문구 변경
- JS 번들에 포함된 이미지 교체
- 기능 플래그 변경
OTA로 불가능한 것
네이티브 앱 자체가 바뀌어야 하는 변경은 OTA로 처리할 수 없습니다.
예를 들어 다음은 스토어 재배포가 필요합니다.
- 네이티브 모듈 추가
- 권한 추가
- Expo SDK 버전 변경
- app.json의 네이티브 설정 변경
- iOS/Android 빌드 설정 변경
runtimeVersion이 중요한 이유
OTA 업데이트는 설치된 앱의 네이티브 런타임과 호환되어야 합니다. 호환되지 않는 JS 번들을 내려보내면 앱이 깨질 수 있습니다.
그래서 Expo에서는 runtimeVersion 또는 SDK 정책을 통해 어떤 앱 버전이 어떤 업데이트를 받을 수 있는지 구분합니다.
배포 전략
안전한 OTA 전략은 다음과 같습니다.
- 작은 변경부터 OTA로 배포한다.
- 네이티브 변경은 반드시 새 빌드로 배포한다.
- 채널을 나누어 staging에서 먼저 검증한다.
- 문제가 생기면 이전 업데이트로 롤백할 수 있게 한다.
- 앱 시작 시 업데이트 확인 타이밍을 사용자 경험에 맞게 조절한다.
실무에서 유용한 경우
- 긴급 문구 수정
- API 응답 처리 버그 수정
- 화면 스타일 미세 조정
- 특정 기능 임시 비활성화
- 작은 비즈니스 로직 변경
듀오랩스가 보는 관점
OTA는 모바일 앱 운영의 속도를 크게 높여줍니다. 하지만 모든 것을 OTA로 해결하려고 하면 위험합니다. “JS 변경은 OTA, 네이티브 변경은 스토어 배포”라는 원칙을 명확히 두는 것이 안정적인 운영의 핵심입니다.
우리 서비스에 적용할 계획이 있으신가요?
모바일 앱 개발 살펴보기 →함께 읽기
- Expo SDK 56 앱을 App Store와 Google Play에 배포하기Expo 앱을 배포한다고 하면 보통 eas build 명령 하나를 떠올립니다. 실제 운영 배포는 빌드, 앱 서명, 스토어 업로드, 베타 테스트, 심사, 공개 출시, OTA 업데이트가 서로 다른 단계입니다. 이 구분을 놓치면 CI가 성공했는데 스토어에는 앱이 없거나, JavaScript 수정이라고 생각해 OTA를 발행했는…
- Expo에서 app.json 수정이 OTA 업데이트에 반영되지 않는 이유Expo 앱의 app.json을 고친 뒤 저장소에 푸시했습니다. production 채널의 OTA 작업도 평소처럼 실행됐습니다. 배포 작업이 성공하면 변경 사항이 앱에 들어간 것처럼 느껴집니다. 이번에는 그렇지 않았습니다.
- Metro 포트 충돌로 배운 것: RN이 OTA 업데이트를 할 수 있는 이유새로 만든 앱을 아이폰에 설치했습니다. 빌드는 성공했고 설치도 됐는데, 앱을 열자 빨간 에러 화면이 떴습니다. 그런데 에러가 가리키는 파일이 이상했습니다.
- Expo OTA 배포: Git 푸시와 프로덕션 릴리스를 분리한 이유앱 아이콘을 바꾸고 커밋하려다가 아주 기본적인 질문 앞에서 멈췄습니다.
- Watchman은 React Native 개발에서 왜 필요할까React Native나 Expo로 개발하다 보면 코드를 고쳤는데 앱에 바로 반영되지 않는 경우가 있습니다. 이때 원인 중 하나가 파일 변경 감시 도구인 Watchman 문제일 수 있습니다.