원문: React Native 0.83 - React 19.2, New DevTools features, no breaking changes
블로그 번역은 최초 발표 당시의 설명을 보존합니다. 본문의 “최신 버전”, 지원 상태, 출시 예정 안내도 발표 당시 기준입니다.
0.83.x 패치 내역을 별도로 정리했습니다. 확인한 가장 최근 정식 패치는 0.83.10입니다.
오늘 React Native 0.83을 릴리스하게 되어 기쁩니다!
이번 릴리스에는 React 19.2, React Native DevTools의 중요한 신기능들, 그리고 Web Performance API와 Intersection Observer API 지원(Canary)이 포함되어 있습니다. 또한 사용자에게 영향을 주는 호환성 깨짐(breaking change)이 하나도 없는 첫 React Native 릴리스이기도 합니다.
이번 릴리스에는 React 19.2가 포함되어, 새로운 <Activity>와 useEffectEvent API를 React Native에서 사용할 수 있게 되었습니다.
React Server Components의 심각한 보안 취약점 공지를 보신 분들이 있을 텐데, 릴리스 시점에 react-native@0.83.0은 react@19.2.0에 의존합니다.
React Native는 이 취약점의 직접적인 영향을 받지 않습니다. 영향을 받는 아래 패키지들에 의존하지 않기 때문입니다.
react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack다만 위 패키지들이 함께 존재할 수 있는 모노레포에서 React Native를 사용 중이라면, 지금 바로 확인하고 업그레이드하세요.
다음 패치 릴리스에서 모든 React 의존성을 19.2.1로 올릴 예정입니다.
<Activity><Activity>는 앱을 "액티비티" 단위로 쪼개서 제어하고 우선순위를 매길 수 있게 해줍니다. 앱의 일부를 조건부 렌더링하던 방식의 대안으로 쓸 수 있으며, 현재 'visible'과 'hidden' 두 가지 모드를 지원합니다.
hidden: 자식을 숨기고, 이펙트를 언마운트하며, React가 처리할 다른 작업이 없을 때까지 모든 업데이트를 미룹니다.visible: 자식을 보여주고, 이펙트를 마운트하며, 업데이트를 정상적으로 처리합니다.<Activity mode='hidden'>으로 숨긴 트리의 흥미로운 특징은 상태가 보존된다는 점입니다. 다시 보이게 되었을 때 이전 사용자 조작에서의 검색 상태나 선택 항목이 그대로 남아 있습니다.
<Activity>에 대한 자세한 내용은 React 문서를 참고하세요.
useEffectEventuseEffect의 흔한 사용 패턴 중 하나는 외부 시스템에서 발생한 일종의 "이벤트"를 앱 코드에 알리는 것입니다. 이 방식의 문제는, 그 이벤트 안에서 사용하는 값이 하나라도 바뀌면 이펙트 전체가 다시 실행된다는 점입니다.
이 문제를 피하려고 대부분은 lint 규칙을 끄고 의존성에서 해당 값을 빼버립니다. 하지만 그러면 나중에 이펙트를 수정할 때 린터가 의존성을 최신으로 유지하도록 도와줄 수 없어 버그로 이어질 수 있습니다.
useEffectEvent를 쓰면 이 로직에서 "이벤트"에 해당하는 부분을, 그것을 발생시키는 이펙트로부터 분리할 수 있습니다.
자세한 내용은 React 문서를 참고하세요.
0.83에서는 오래 기다려온 기능들과 사용성 개선을 React Native DevTools에 담았습니다.
네트워크 검사와 퍼포먼스 트레이싱, 이 두 가지 강력한 기능을 오늘부터 React Native DevTools에서 사용할 수 있습니다.
네트워크 검사(Network inspection)는 이제 모든 React Native 앱에서 사용할 수 있으며, 앱이 보낸 네트워크 요청을 보고 이해할 수 있게 해줍니다. 기록된 요청에는 타이밍, 주고받은 헤더 같은 상세 메타데이터와 응답 미리보기가 제공됩니다. 그리고 처음으로 Initiator 탭에서 해당 네트워크 요청이 코드의 어느 지점에서 시작되었는지 확인할 수 있습니다.
어떤 네트워크 이벤트가 캡처되나요?
현재는 fetch(), XMLHttpRequest, <Image>를 통한 모든 네트워크 호출을 기록합니다. Expo Fetch 같은 커스텀 네트워킹 라이브러리 지원은 이후에 추가될 예정입니다.
Expo Network와의 차이
그래서 Expo를 사용하는 앱에서는 "Expo Network" 패널이 계속 보입니다. 이는 Expo 프레임워크의 별도 구현으로, 위에서 언급한 추가 요청 소스까지 기록하지만 기능은 조금 적습니다.
Expo Fetch와 서드파티 네트워킹 라이브러리를 새 네트워크 검사 파이프라인에 통합하기 위해 Expo와 함께 작업하고 있으며, 이후 릴리스에 반영될 예정입니다.
퍼포먼스 트레이싱(Performance tracing)은 앱 안에서 퍼포먼스 세션을 기록해, JavaScript 코드가 어떻게 실행되고 어떤 작업이 가장 오래 걸렸는지 파악할 수 있게 해줍니다. React Native에서는 JavaScript 실행, React Performance 트랙, 네트워크 이벤트, 그리고 직접 기록한 User Timing을 하나의 타임라인에 함께 보여줍니다.
0.83의 Web Performance API 지원과 합쳐지면, React Native 앱이 느려지는 원인을 세밀하게 들여다볼 수 있는 강력한 도구가 됩니다. Performance 패널을 꼭 한 번 써보고 일상적인 작업 흐름에 포함시켜 보시길 권합니다.
자세한 내용은 React Native DevTools 문서와 React Performance 트랙 문서에서 확인하세요.
이전에는 React Native DevTools가 브라우저 창으로 실행되어 Chrome이나 Edge 설치가 필요했습니다. 이제 번들로 제공되는 새 데스크톱 앱으로 훨씬 나아진 경험을 제공합니다.
웹 API를 React Native로 가져오는 작업의 일환으로, 0.83의 canary 릴리스에 IntersectionObserver 지원을 추가했습니다.
IntersectionObserver는 대상 엘리먼트와 그 조상 엘리먼트 사이의 레이아웃 교차(intersection)를 비동기로 관찰할 수 있게 해줍니다. 자세한 내용은 API 문서와 구현 문서를 참고하세요. RNTester에도 예제를 넣어두었습니다.
0.82에서 소개한 대로, React Native는 웹의 Performance API 중 일부를 구현하고 있습니다. 이번에 정식(stable)으로 전환되었습니다.
performance.now()와 performance.timeOrigin을 정의합니다.PerformanceObserver와 performance 객체의 엔트리 접근 메서드(getEntries(), getEntriesByType(), getEntriesByName())를 정의합니다.performance.mark와 performance.measure를 정의합니다.PerformanceObserver로 보고되는 event 엔트리 타입을 정의합니다.PerformanceObserver로 보고되는 longtask 엔트리 타입을 정의합니다.이 API들로 앱의 다양한 성능 지표를 추적할 수 있고, React Native DevTools의 Performance 패널에서 확인하거나 런타임에 PerformanceObserver로 직접 받아볼 수 있습니다.
PerformanceObserver는 프로덕션 빌드에서도 동작하므로, 실제 사용자 환경의 성능 지표를 수집할 새로운 가능성이 열립니다.
Hermes V1은 Hermes의 다음 세대로, 컴파일러와 VM 개선을 통해 JavaScript 성능을 크게 끌어올립니다.
React Native 0.82에서 Hermes V1을 실험적 opt-in으로 공개했고, 0.83에서는 성능 개선이 더 들어갔습니다.
참고: Hermes V1이 실험 단계인 동안에는 직접 써보려면 React Native를 소스에서 빌드해야 합니다.
package.json의 해당 섹션을 수정해서 패키지 매니저가 Hermes V1 컴파일러의 실험 버전을 사용하도록 고정합니다. (아래 버전 표기 규칙은 Hermes V1 실험 단계에서만 쓰입니다.)
"resolutions": { "hermes-compiler": "250829098.0.4" }"overrides": { "hermes-compiler": "250829098.0.4" }Android에서는 android/gradle.properties에 다음을 추가해 Hermes V1을 켭니다.
hermesV1Enabled=true그리고 android/settings.gradle을 수정해 소스에서 빌드하도록 설정합니다.
includeBuild('../node_modules/react-native') {
dependencySubstitution {
substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid"))
substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid"))
substitute(project(":packages:react-native:ReactAndroid:hermes-engine")).using(module("com.facebook.hermes:hermes-android:250829098.0.1"))
}
}iOS에서는 RCT_HERMES_V1_ENABLED=1 환경 변수를 주고 pod를 설치합니다.
RCT_HERMES_V1_ENABLED=1 bundle exec pod installHermes V1은 React Native 사전 컴파일(precompiled) 빌드와 호환되지 않으므로, pod 설치 시 RCT_USE_PREBUILT_RNCORE 플래그를 쓰지 않도록 주의하세요.
앱이 Hermes V1으로 동작하는지 확인하려면 앱 안이나 DevTools 콘솔에서 아래 코드를 실행하세요. 1단계에서 지정한 버전(250829098.0.1)과 같은 값이 나와야 합니다.
// Hermes V1이라면 "250829098.0.1"이 나옵니다
HermesInternal.getRuntimeProperties()['OSS Release Version'];이번 릴리스에서는 코드베이스에서 레거시 아키텍처를 아예 빼고 컴파일할 수 있는 iOS용 플래그를 추가했습니다. 앱이 이미 새 아키텍처(New Architecture)로 넘어갔다면, 다음과 같이 pod를 설치해 레거시 아키텍처 코드를 제거해볼 수 있습니다.
RCT_REMOVE_LEGACY_ARCH=1 bundle exec pod install빌드 시간과 앱 크기가 모두 줄어듭니다. 개선 폭은 사용 중인 서드파티 라이브러리 수에 따라 다른데, 의존성이 없는 새 앱으로 테스트했을 때 빌드 시간은 73.0초 → 58.2초, 앱 크기는 51.2MB → 48.2MB가 되었습니다.
RCT_REMOVE_LEGACY_ARCH는 React Native 사전 컴파일 바이너리와 호환되지 않습니다. 사전 컴파일 바이너리를 쓰고 있다면 pod를 다시 설치하고 소스에서 빌드해야 합니다.
이번 릴리스에서 사전 컴파일 바이너리에 포함된 React Native 코드를 디버깅할 수 있게 했습니다. 주로 라이브러리 메인테이너나, 네이티브 모듈·네이티브 컴포넌트를 개발할 때 유용합니다.
사전 컴파일 바이너리의 코드를 디버깅하려면 다음 단계를 따르세요.
# 프로젝트의 ios 폴더에서
bundle exec pod cache clean --all
bundle exec pod deintegrate
RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1
RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS=1 bundle exec pod install
open <your-project>.xcworkspace핵심은 RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS 플래그입니다. CocoaPods가 React Native dSYM 파일을 내려받아 올바른 폴더에 풀어놓도록 지시합니다.
이제 앱에 브레이크포인트를 걸고(예: AppDelegate.swift) Xcode에서 빌드·실행하면 됩니다. 앱이 멈추면 Xcode 콘솔에서 다음 LLDB 명령을 실행하세요.
# 시뮬레이터에서 실행 중인 경우
add-dsym <path-to-your-app>/ios/Pods/React-Core-prebuilt/React.xcframework/ios-arm64_x86_64-simulator/React.framework/dSYMs/React.framework.dSYM
# 실기기에서 실행 중인 경우
add-dsym <path-to-your-app>/ios/Pods/React-Core-prebuilt/React.xcframework/ios-arm64/React.framework/dSYMs/React.framework.dSYM이제 React Native 코드 안으로 스텝 인해서 들어갈 수 있습니다.
React Native 릴리스를 더 예측 가능하고 업그레이드하기 쉽게 만들기 위해 노력하고 있습니다. React Native 0.83은 사용자에게 영향을 주는 호환성 깨짐이 전혀 없는 첫 릴리스입니다.
React Native 0.82를 쓰고 있다면 앱 코드를 하나도 바꾸지 않고 0.83으로 업그레이드할 수 있습니다.
무엇을 호환성 깨짐으로 보는지는 이 문서에서 확인하세요.
이번 릴리스에는 Android 전용 deprecation 두 가지가 있습니다.
sendRequestInternal 메서드가 단계적으로 제거될 예정이며 이제 deprecated 상태입니다.startOperationBatch와 finishOperationBatch가 deprecated 되었습니다.React Native 0.83에는 56명의 컨트리뷰터가 만든 594개 이상의 커밋이 담겨 있습니다. 모든 분들의 노고에 감사드립니다!
이번 릴리스에서 특히 큰 기여를 해주신 커뮤니티 멤버들께 특별히 감사를 전합니다.
RCT_REMOVE_LEGACY_ARCH 플래그: Ramanpreet Nara기존 프로젝트에서는 React Native Upgrade Helper로 버전 간 코드 변경 사항을 확인하고, 함께 업그레이드 문서도 참고하세요.
새 프로젝트를 만들려면:
npx @react-native-community/cli@latest init MyProject --version latestExpo를 사용한다면, React Native 0.83은 2026년 1월에 릴리스될 SDK 55에 포함됩니다.
이제 0.83이 React Native의 최신 안정 버전이며, 0.80.x는 지원 종료(unsupported) 상태가 됩니다. 자세한 내용은 React Native 지원 정책을 참고하세요.
공식 GitHub 릴리스와 CHANGELOG의 변경 항목을 한국어로 정리했습니다. 기록이 짧거나 비어 있는 버전은 공식 태그 비교로 보충하고 그 근거를 표시했습니다. 각 항목은 해당 패치의 변경 사항입니다.
| 버전 | 배포일 | 주요 내용 |
|---|---|---|
| 0.83.10 | 2026-06-26 | iOS 바이너리 캐시, Yoga 레이아웃, DevTools 안정성 개선 |
| 0.83.9 | 2026-04-27 | 실험적 MutationObserver 플래그와 내부 CI 변경 |
| 0.83.8 | 2026-04-24 | iOS React-featureflags 헤더 검색 경로 수정 |
| 0.83.7 | 2026-04-24 | 실험적 iOS RedBox 2.0과 내부 빌드 변경 |
| 0.83.6 | 2026-04-17 | Hermes V1 심볼과 Metro 로딩 배너 수정 |
| 0.83.5 | 2026-04-14 | Xcode 26.4 빌드, Android 파일 URI, Hermes 예외 처리 수정 |
| 0.83.4 | 2026-03-07 | iOS 사전 컴파일 바이너리의 개발 지원 헤더 추가 |
| 0.83.3 | 2026-03-06 | Android 개발 서버 헤더와 모노레포 Gradle 설정 수정 |
| 0.83.2 | 2026-02-07 | Android 텍스트 잘림, Appearance, 에셋 경로 수정 |
| 0.83.1 | 2025-12-19 | Android FormData 업로드 오류 수정 |
~/Library/Caches/ReactNative에 보관합니다. 재설치하거나 다른 프로젝트를 설치할 때 이미 받은 파일을 재사용합니다.display: contents를 사용할 때 Yoga 노드의 소유 관계를 수정했습니다.display: contents 노드의 hasNewLayout 값이 잘못 설정되는 문제를 수정했습니다.fetch() 응답의 URL을 올바르게 반환합니다.Podfile.lock의 SPEC CHECKSUMS가 일관되게 나오도록 했습니다.removeClippedSubviews 값을 바꿀 때 발생하던 앱 종료 문제를 수정했습니다.출처: 공식 릴리스 0.83.10 · 공식 CHANGELOG
확인 시점의 공식 릴리스 본문과 main의 CHANGELOG에는 이 버전의 변경 설명이 없습니다. 아래 항목은 0.83.8과 0.83.9 사이의 공식 커밋과 파일 차이에서 확인했습니다.
MutationObserver를 켜는 기능 플래그와 관련 네이티브 연결을 추가했습니다. 정식 기능으로 전환되었다는 의미는 아닙니다.Podfile.lock과 패키지 버전 정보를 갱신했습니다.출처: 공식 릴리스 0.83.9 · 직전 패치와 비교
React-CoreModules에 빠져 있던 React-featureflags 헤더 검색 경로를 추가했습니다.출처: 공식 릴리스 0.83.8 · 공식 CHANGELOG
공식 CHANGELOG는 이 버전을 ‘실험 기능 변경만 포함’으로 설명합니다. 아래 세부 내용은 0.83.6과 0.83.7의 공식 태그 비교에서 확인했습니다.
React-debug pod에 redbox 하위 명세를 추가했습니다.Podfile.lock을 갱신했습니다.출처: 공식 릴리스 0.83.7 · 공식 CHANGELOG · 직전 패치와 비교
HERMES_V1_ENABLED가 설정된 경우 inspector-modern/chrome/Registration.h에 대체 심볼을 제공합니다.Loading from Metro... 배너가 사라지지 않던 문제를 수정했습니다.출처: 공식 릴리스 0.83.6 · 공식 CHANGELOG
unspecified로 설정한 뒤 상태가 올바르게 반영되도록 수정했습니다. 공식 변경 기록에 이 항목이 다시 기재되어 있습니다.fetch()나 XMLHttpRequest에 전달한 file:// URI가 실패하는 문제를 수정했습니다.fmt를 12.1.0으로 갱신했습니다.void TurboModule 메서드에서 발생한 NSException을 잘못된 스레드에서 JSError로 변환하지 않고 다시 발생시키도록 수정했습니다.출처: 공식 릴리스 0.83.5 · 공식 CHANGELOG
RCTDevSupportHeaders를 추가했습니다.출처: 공식 릴리스 0.83.4 · 공식 CHANGELOG
projectDir와 currentDir를 먼저 확인해 gradle.properties를 찾습니다. 이에 따라 hermesV1Enabled 설정을 올바르게 상속합니다.set-rn-artifacts-version 실행을 건너뜁니다.출처: 공식 릴리스 0.83.3 · 공식 CHANGELOG
oscompat 헤더를 Prefab으로 제공합니다.unspecified로 설정한 뒤 상태에 저장되는 색상 모드를 수정했습니다.unstable_path 쿼리 매개변수를 처리합니다.useBoundsForWidth 변경으로 텍스트가 잘리는 문제를 수정했습니다.출처: 공식 릴리스 0.83.2 · 공식 CHANGELOG
FormData를 업로드할 때 발생할 수 있는 네트워크 오류를 수정했습니다.출처: 공식 릴리스 0.83.1 · 공식 CHANGELOG