
저희 팀에서는 React Native OTA 업데이트로 CodePush를 주로 사용하고 있어요.
하지만 CodePush 기술 지원이 종료되어 긴급히 대체할 수 있는 다른 서비스를 알아보다 EAS Update를 알게 되었습니다.
처음엔 조금 낯설고 설정이 좀 복잡해 보이지만, 한 번 세팅해두면 CodePush보다 훨씬 편리하고 빠르더라구요.
CodePush에서 있는 기능들은 모두 포함되어 있고, 유료 플랜을 사용하면 고급 분석 및 모니터링, 브랜치 롤백 등 다양한 기능도 지원하니 좋았어요.
아래는 EAS Update를 적용하면 겪었던 것들을 순차적으로 정리해 보았습니당
먼저 내 프로젝트에 EAS CLI를 설치하고 로그인을 해야 해요.
npm install -global eas-cli
eas login
로그인 할 때 organization 계정에서 미리 초대받아서 멤버가 되어 있어야 합니다.
Expo 콘솔에서 아래처럼 여러개의 채널을 구성할 수 있어요.

이후 app.config.ts 파일을 열어서 아래처럼 수정해 주세요.
// 환경에 따라 채널을 자동으로 선택하는 함수
const channelName = (environment: string) => {
switch (environment) {
case "dev":
return "preview";
case "release":
return "production";
default:
return "preview";
}
};
export default ({ config }: ConfigContext): ExpoConfig => {
return {
...config,
name: "project-name",
runtimeVersion: "1.0.0", // 적용할 EAS target 버전
updates: {
checkAutomatically: "ON_LOAD", // 앱 실행할 때마다 업데이트 확인
requestHeaders: {
"expo-channel-name": channelName(process.env.APP_ENV as string),
},
},
extra: {
eas: {
projectId: easProjectId,
},
},
};
};
사용자 앱이랑 새로운 JS 번들의 런타임 버전이 같아야 업데이트가 제대로 되니 주의해 주세요.
android/app/build.gradle 파일에서 이렇게 설정해 주세요.
productFlavors {
basic {
dimension "default"
applicationId "kr.co.my.app"
manifestPlaceholders = [
EXUpdatesChannelName: "production",
EXUpdatesRuntimeVersion: "1.0.0"
]
}
staging {
dimension "default"
applicationId "kr.co.my.app.dev"
manifestPlaceholders = [
EXUpdatesChannelName: "preview",
EXUpdatesRuntimeVersion: "1.0.0"
]
}
}
그리고 AndroidManifest.xml에 아래 부분도 추가해 주세요.
<meta-data
android:name="expo.modules.updates.EXPO_RUNTIME_VERSION"
android:value="${EXUpdatesRuntimeVersion}"/>
ios/targetName/Supporting/Expo.plist 파일을 수정하면 됩니다.
<key>EXUpdatesRuntimeVersion</key>
<string>1.0.0</string>
<key>EXUpdatesRequestHeaders</key>
<dict>
<key>expo-channel-name</key>
<string>preview</string>
</dict>
앱이 언제 업데이트를 확인할지 정할 수 있어요. 옵션들이 몇 개 있는데,
ON_LOAD - 앱 실행할 때마다 (기본값, 추천)WIFI_ONLY - WiFi 있을 때만ON_ERROR_RECOVERY - 오류 났을 때만NEVER - 아예 안 함보통 ON_LOAD가 제일 좋아요.
EAS 배포는 명령어를 아래처럼 입력하면 됩니다.
# Android, iOS 둘 다
npm run update:stage
# Android만
npm run update:stage:and
# iOS만
npm run update:stage:ios
운영 배포할 때는 환경 변수 먼저 확인하고, 아래처럼 명령어를 입력해 주세요.
# 먼저 캐시 삭제
npm run start -- --reset-cache
# 후에 업데이트
npm run update:prod # 전체
npm run update:prod:and # 안드로이드만
npm run update:prod:ios # iOS만
명령어를 실행하면 업데이트 내용을 물어봅니다. 수정 사항에 댛해 간단하게 기록해 주세요.
# 이렇게 하면 대화형으로 메시지 입력
npm run update:prod
# 아니면 바로 메시지 넣기
npm run update:prod --message "버그 수정 및 성능 개선"
업데이트가 끝나면 Expo 콘솔에 들어가서 확인해 보세요. 채널 별로 언제 업데이트됐는지, 어떤 버전인지 알 수 있습니다.


런타임 버전이 핵심이에요: 사용자 앱과 새 JS 번들의 런타임 버전이 같아야 업데이트가 됨. 다르면 아예 업데이트가 되지 않습니다.
이럴 때는 런타임 버전을 바꿔야 해요:
이런 경우엔 스토어에 새 버전을 올려야 업데이트가 가능해요.
채널과 브랜치: EAS는 "채널"과 "런타임 버전"을 둘 다 체크해서, 일치할 때만 업데이트가 가능합니다.
처음엔 설정이 복잡해 보이지만, 한 번 해두면 CodePush만큼이나 편하고 쉽습니다. EAS는 채널 관리나 버전 관리가 더 직관적이고 안정적이에요.
혹시 막히는 부분이 있으면 EAS Update 공식 문서를 참고하면 좋습니다.