Upgrade Helper는 두 React Native 버전 사이에 변경된 파일을 diff 형태로 보여주는 웹 도구이다. 공식 주소는 다음과 같다.
https://react-native-community.github.io/upgrade-helper/
React Native 프로젝트는 본질적으로 Android 프로젝트 + iOS 프로젝트 + JavaScript(TypeScript) 프로젝트가 합쳐진 구조이다. 따라서 버전을 올릴 때 package.json만 바꾼다고 끝나지 않으며, android/, ios/, Gradle, Podfile, AppDelegate, MainApplication 등 네이티브 영역까지 함께 변경되어야 한다. 이 네이티브 변경 지점을 한눈에 보여주는 것이 Upgrade Helper의 핵심 가치이다.
Upgrade Helper는 rn-diff-purge 프로젝트를 기반으로 동작한다. 원리는 단순하다.
RnDiffApp)을 생성한다.즉, 사용자가 보는 diff는 "내 코드"가 아니라 RN이 기본 제공하는 템플릿 파일들의 버전 간 차이이다. 그래서 항상 깨끗하고 init 템플릿과 동기화된 상태가 유지된다. 이 차이를 내 프로젝트에 수동으로 반영하는 것이 업그레이드 작업의 본질이다.
Show me how to upgrade 버튼을 누른다.가장 먼저 보이는 파일은 package.json이다. 여기에 표시된 의존성 버전부터 맞추는 것이 좋다. 메이저 업데이트의 경우 상단에 useful content 섹션이 나타나며, 해당 버전 업그레이드에 도움이 되는 링크들을 제공한다.
| 기능 | 설명 |
|---|---|
| Inline comments | 특정 파일에 왜 이 변경이 필요한지 인라인 주석으로 설명해 준다. |
| Useful content 링크 | 메이저 업그레이드 시 관련 문서·블로그 링크를 모아서 보여준다. |
| Done 버튼 | 파일마다 완료 표시를 할 수 있어 진행 상황을 추적하기 좋다. 파일이 많은 대규모 업그레이드에서 특히 유용하다. |
| Download 버튼 | 바이너리 신규 파일(예: gradle wrapper jar)은 diff로 표시할 수 없으므로 직접 다운로드할 수 있게 해준다. |
| Alt + 클릭 | expand/collapse를 alt 키와 함께 누르면 모든 파일을 한 번에 펼치거나 접을 수 있다. |
업그레이드 방법은 크게 두 가지이다.
react-native upgradenpx @react-native-community/cli@latest upgrade
rn-diff-purge를 사용해 어떤 파일을 생성/삭제/수정해야 하는지 계산한다.git apply + 3-way merge로 동작하므로 Git 사용이 필수이다.ours(내 팀의 코드)와 theirs(RN 팀의 변경)를 직접 머지해야 한다.| 상황 | 권장 방식 |
|---|---|
| 데모/소규모/네이티브 커스텀 거의 없음 | CLI upgrade |
| 프로덕션 / 네이티브 코드 많음 / 여러 버전 점프 | Upgrade Helper 수동 적용 |
운영 앱이라면 Upgrade Helper로 직접 반영하는 쪽이 더 안전하고 통제 가능한 선택이다.
아래 순서대로 진행하면 사고를 크게 줄일 수 있다.
chore/rn-upgrade-x.y.z 같은 별도 브랜치를 판다. 롤백 안전장치를 먼저 확보하는 것이다.package.json → JS 설정 파일 → Android → iOS 순으로 반영한다.AppDelegate, MainApplication, Podfile, build.gradle 등 충돌이 잦은 파일을 신경 써서 본다.node_modules, Pods, Gradle 캐시, Metro 캐시를 모두 비우고 빌드한다.메이저 마이너를 올릴 때는 올리기 전후로 네이티브 템플릿 diff를 Upgrade Helper에서 항상 비교하는 습관을 들이는 것이 좋다.
New Architecture(JSI, TurboModules, Fabric, Codegen)는 이제 사실상 필수이다.
예를 들어 0.85는 EOL Node 버전(v21, v23)과 20.19.4 미만 버전을 지원하지 않는다. 업그레이드 전에 Node/JDK/Xcode/Android SDK가 대상 버전 요건을 충족하는지 확인하는 것이 첫 단추이다.
New Architecture는 JSI 위에 구축되어 있고 Hermes에 의존한다. JavaScriptCore에서는 동작하지 않으므로 Hermes 사용을 전제로 둔다.
SafeAreaView는 deprecated 경로이다. react-native-safe-area-context로 대체하고, 중첩 네비게이터에서 잘 동작하는지 검증한다.StyleSheet.absoluteFillObject 등 장기간 deprecated 였던 API가 메이저 버전에서 완전히 제거될 수 있으므로 릴리스 노트를 확인한다.Upgrade Helper는 서드파티 라이브러리를 다루지 않으므로, 이 영역은 별도 트랙으로 직접 챙겨야 한다. 실무 절차는 다음과 같다.
reactnative.directory는 RN 팀이 관리하는 공식 패키지 데이터베이스이며, 각 라이브러리의 New Architecture 호환 여부가 표시된다. 마이그레이션 전에 여기서 주요 의존성을 훑는 것이 출발점이다.
https://reactnative.directory/
Directory 사이트는 패키지를 하나씩만 조회할 수 있어, 실무에서는 일괄 검사 도구가 효율적이다.
| 도구 | 형태 | 설명 |
|---|---|---|
react-native-package-checker | 웹 | package.json 의존성 전체를 한 번에 검사해 New Architecture 호환성을 시각화하고 리포트로 내보낼 수 있다. |
react-native-check-new-archi | CLI | 프로젝트 루트에서 실행하면 Directory API로 각 라이브러리를 조회하고, 목록에 없으면 GitHub 저장소를 분석해 순수 JS 구현인지(=호환 가능성)까지 판단해 준다. |
npm outdated | CLI(기본) | 어떤 의존성에 더 최신(호환) 버전이 나와 있는지 확인하는 가장 기본적인 방법이다. |
Directory의 newArch 플래그는 버전 단위가 아니라 라이브러리 단위의 binary 값이다. 즉, 라이브러리의 최신 버전은 New Architecture를 지원하지만 내가 쓰는 구버전은 지원하지 않는 경우에도, Directory가 그 라이브러리를 호환으로 표시하기 때문에 도구가 문제를 놓칠 수 있다. 따라서 "이 라이브러리가 지원함"이 아니라 "내가 쓰는 버전이 지원함"을 changelog/릴리스 노트로 한 번 더 확인하는 것이 안전하다.
JS나 RN 코어 API만 사용하는 라이브러리는 (비공개·문서화되지 않은 API를 쓰지 않는 한) 대체로 변경 없이 동작한다. 반면 네이티브 코드를 직접 포함하거나 의존하는 라이브러리가 업데이트를 요구할 가능성이 높다. 따라서 다음과 같은 패키지에 감사 우선순위를 둔다.
react-native-reanimated, react-native-gesture-handlerreact-native-screens@notifee/react-native, 결제/지도/카메라 모듈류RCTBridgeModule API 기반이라면 TurboModule(Codegen)로 재작성이 필요하다.git apply에 의존하므로 Git이 없으면 동작하지 않는다. 공식 Troubleshooting에 우회법이 있지만, 가능하면 Git 환경에서 작업한다.Podfile.lock 삭제, pod deintegrate 후 재설치, 그리고 diff에 반영된 Podfile 변경이 누락되지 않았는지 확인한다.