프로덕션 빌드와 OTA 업데이트를 구분한 이유
핵심 요약
- Expo/EAS는 Android 앱 빌드와 배포 과정을 단순하게 만든다.
- preview와 production은 이름보다 환경과 배포 대상의 설정이 중요하다.
- 최초 출시에는 production 빌드가 필요하고, JavaScript·스타일 수정은 OTA로 반영할 수 있다.
- 네이티브 의존성, 권한, SDK 변경은 OTA만으로 처리할 수 없다.
처음 겪은 문제
처음에는 preview 프로필을 사용해 실행했지만 앱이 연결되지 않았다. 확인 결과 preview라는 이름 자체가 문제라기보다, 빌드 환경과 실제 앱이 바라보는 업데이트 설정이 일치하는지가 중요했다. 프로필 이름은 사람이 이해하기 위한 이름이고, 실제 동작은 environment, runtime version, update URL 같은 설정이 결정한다.
production을 먼저 올리는 이유
스토어에 제출할 앱은 production 빌드로 만드는 것이 관리하기 쉽다. 최초 설치 파일에는 앱 식별자, 권한, 광고 SDK, 네이티브 설정이 포함된다. 이후 화면이나 퍼즐 데이터처럼 JavaScript로 처리되는 변경은 OTA로 배포할 수 있다.
반대로 앱 아이콘, 권한, 네이티브 모듈, SDK 버전이 바뀌면 새 바이너리를 다시 빌드해야 한다. OTA를 모든 변경에 사용할 수 있다고 생각하면 업데이트가 적용되지 않거나 스토어 정책과 어긋날 수 있다.
버전 관리
Android 스토어 제출에는 versionCode가 이전보다 커야 한다. 같은 versionCode를 다시 올리면 이미 사용된 코드라는 오류가 발생한다. 따라서 빌드 전에 앱 버전과 versionCode를 확인하고, 새 스토어 빌드마다 증가시키는 규칙을 둔다.
운영 순서
- production 프로필로 최초 앱 빌드
- 실제 기기에서 광고, 이미지 저장, 백키, 업데이트를 확인
- 스토어 제출
- 이후 JavaScript 변경은 OTA로 배포
- 네이티브 변경이 생기면 versionCode를 올리고 새 빌드
결론 한 줄
최초 배포는 production 빌드로 고정하고, 이후 작은 화면·콘텐츠 수정은 OTA로 줄이는 방식이 유지보수에 맞다.
※ Expo와 Google Play 정책 및 SDK 동작은 변경될 수 있으므로 실제 배포 전 공식 문서를 다시 확인한다.
preview라는 이름과 production 환경
빌드 프로필의 이름을 preview로 유지하면서 environment를 production으로 지정하는 것은 가능하다. 다만 이름이 preview라서 테스트용이라는 의미가 자동으로 생기는 것은 아니다. 중요한 것은 해당 프로필이 어떤 API, 업데이트 채널, 광고 식별자, 앱 설정을 사용하는지다. 운영 앱에 연결할 프로필은 이름과 관계없이 한 곳으로 고정하고 문서에 명시해야 한다.
실행이 되지 않았던 경우에는 Metro 서버 연결과 EAS 업데이트 연결을 구분해야 한다. 로컬 개발 빌드는 Metro 서버가 실행 중이어야 하며, production 설치 앱은 로컬 Metro가 없어도 실행되어야 한다. 두 환경을 섞으면 흰 화면이나 연결 실패처럼 보일 수 있다.
OTA 적용 전 체크
OTA를 올리기 전에는 현재 설치된 바이너리의 runtime version과 배포 대상 채널을 확인한다. OTA에 포함할 수 있는 것은 JavaScript, 화면, 스타일, 일부 콘텐츠 변경이다. 네이티브 코드와 권한 설정은 새 바이너리를 요구한다. OTA가 실패했을 때 이전 버전으로 돌아갈 수 있도록 작은 단위로 배포하고, 실제 기기에서 결과 화면과 광고 흐름을 확인한다.
스토어 준비
스토어에는 앱 이름, 아이콘, 스크린샷, 짧은 설명, 전체 설명, 개인정보처리방침 주소가 필요하다. 광고를 사용하는 경우 광고 포함 여부를 정확히 표시해야 한다. 앱 이름은 출시 후 변경할 수 있지만 검색 노출과 브랜드 인식에 영향을 주므로 Linkting과 한글 설명을 함께 검토한 뒤 고정하는 편이 안전하다.
'개발 오답노트 > ReactNative' 카테고리의 다른 글
| [ReactNative] 알림 액션을 앱 실행 없이 처리하기 (0) | 2026.10.15 |
|---|---|
| [React Native] 두 프로젝트 동시에 실행하기: Metro 포트 변경과 0.78에서 로그가 안 보이는 이유 (0) | 2025.03.21 |
| [React Native] AGP 8.8.0 incompatible 에러: 안드로이드 스튜디오 버전이 낮은 경우 (0) | 2025.03.21 |
| [React Native] 배포된 앱을 수정하지 않고 WebView에서 특정 URL로 이동시키기: window.location.href (1) | 2024.11.27 |
| [React Native] Android Gradle 7.4.2에서 8.2로 업데이트: namespace와 buildConfig 에러 해결 (1) | 2024.11.11 |