원문: React Native 0.86 - Edge-to-Edge and DevTools Improvements, no breaking changes
블로그 번역은 최초 발표 당시의 설명을 보존합니다. 본문의 “최신 버전”, 지원 상태, 출시 예정 안내도 발표 당시 기준입니다.
0.86.x 패치 내역을 별도로 정리했습니다. 확인한 가장 최근 정식 패치는 0.86.3입니다.
오늘 React Native 0.86을 릴리스하게 되어 기쁩니다!
이번 릴리스에는 Android 15+에서의 포괄적인 edge-to-edge 지원과 React Native DevTools 개선이 담겨 있습니다.
0.83에 이어 사용자에게 영향을 주는 호환성 깨짐이 없는 두 번째 릴리스로, 업그레이드를 더 예측 가능하고 매끄럽게 만들겠다는 방향을 이어갑니다.
React Native 저장소가 React, Metro, Yoga, React Native 웹사이트와 함께 GitHub의 facebook 조직에서 react 조직으로 이동했습니다. 이는 React와 React Native가 React Foundation — React 생태계를 장기적으로 관리하기 위한 독립 재단 — 으로 옮겨간 것을 반영합니다.
GitHub이 기존 URL, 이슈, PR을 모두 새 위치로 자동 리다이렉트하므로 따로 해야 할 일은 없습니다.
React Native 0.86에는 Android 15+의 edge-to-edge 모드에 대한 포괄적인 수정이 들어갔습니다. edgeToEdgeEnabled Gradle 속성으로 명시적으로 켜지 않았는데 OS가 강제로 적용하는 경우까지 포함합니다.
주요 수정 사항:
measureInWindow가 edge-to-edge가 켜진 상태에서 올바른 좌표를 반환합니다.KeyboardAvoidingView가 edgeToEdgeEnabled인 Android 15+에서 정상 동작합니다.Dimensions의 window 값이 edge-to-edge가 켜진 Android 15 미만 버전에서도 정확해집니다.StatusBar가 Modal이 열려 있는 동안에도 스타일과 표시 여부 변경을 지원합니다.enforceNavigationBarContrast 속성을 따릅니다.React Native DevTools가 Emulation.setEmulatedMedia를 통한 라이트/다크 모드 에뮬레이션을 지원합니다. 기기 설정을 바꾸지 않고도 앱의 외형 모드 처리를 DevTools에서 바로 테스트할 수 있습니다. cmd/ctrl + shift + P로 커맨드 팔레트에서 사용하세요.
웹에서와 마찬가지로 임시 전환이며, DevTools 연결이 끊기면 원래대로 돌아갑니다.
React Native 0.86에는 사용자에게 영향을 주는 호환성 깨짐이 없습니다.
React Native 0.85를 쓰고 있다면 앱 코드를 하나도 바꾸지 않고 0.86으로 업그레이드할 수 있습니다.
무엇을 호환성 깨짐으로 보는지는 이 문서에서 확인하세요.
다음 API들이 deprecated 되었고, 이후 릴리스에서 제거될 예정입니다.
ViewUtil.getUIManagerType: 레거시 아키텍처 제거 작업의 일환으로 deprecated 되었습니다. UIManagerType.Fabric을 직접 인라인하거나, UIManagerType 검사 자체를 없애면 됩니다.AppRegistry: AppRegistry.setComponentProviderInstrumentationHook의 두 번째 인자가 deprecated 되었으며, 사용하면 경고가 표시됩니다.ExceptionsManager.reportErrorsAsExceptions 엄격해짐: false가 아닌 값을 넣는 것은 이제 아무 효과가 없습니다. 이전에는 0, null, "" 같은 falsy 값이면 에러→예외 변환이 꺼졌지만, 이제는 명시적인 불리언 false만 opt-out으로 인정해 실수를 줄입니다.PerformanceObserver의 기본 durationThreshold: observe({type: 'event'})가 모든 이벤트를 보고하는 대신, W3C Event Timing 스펙에 맞춰 durationThreshold 기본값을 104ms로 사용합니다. 웹 표준과 정합성이 맞춰지고 아주 짧은 이벤트로 인한 노이즈가 줄어듭니다.style prop: style이 Modal 내부 컨테이너 View로 전달됩니다. transparent나 backdropColor 동작을 덮어쓰지 않고도 padding, 배경색 같은 커스텀 스타일을 줄 수 있습니다.scaleX: 0, scaleY: 0처럼 역행렬을 구할 수 없는 transform이 걸린 뷰는 iOS·Android에서 더 이상 터치를 받지 않습니다. 히트 테스트가 변환 행렬의 역행렬 여부를 판단해 해당 뷰를 건너뜁니다.BoringLayout.isBoring() 크래시(#56007), display: contents 노드의 소유권 문제(#56422) 등 여러 레이아웃 회귀를 수정했습니다.AccessibilityInfo.isDarkerSystemColorsEnabled, isHighTextContrastEnabled, prefersCrossFadeTransitions가 끝나지 않는 Promise를 반환하던 문제를 수정했습니다. 이제 false로 resolve됩니다.^0.84.2: Metro 번들러 의존성이 업데이트되었습니다.HeadlessJsTaskSupportModule 자동 등록: 이 모듈이 CoreReactPackage에 등록되어, Android에서 headless JS task를 쓰는 앱이 더 이상 수동 등록을 신경 쓰지 않아도 됩니다.네이티브 모듈과 JS 엔진 사이의 C++ 인터페이스를 강화하는 JSI API들이 추가되었습니다.
IRuntime 인터페이스: 기존에 protected였던 Runtime 메서드들을 public으로 열어, 인터페이스 버전을 연쇄적으로 올리지 않고도 새로운 JSI 기능을 추가할 수 있게 합니다.TypedArray / Uint8Array: 타입드 배열을 일급으로 지원합니다. 생성, 버퍼 접근, offset·length 조회를 포함합니다.ArrayBuffer.detached: ArrayBuffer가 detach되었는지 확인할 수 있습니다.Array.push: 배열에 요소를 추가할 수 있습니다(이전에는 생성 이후 크기 변경이 불가능했습니다).String.length: 전체 문자열로 변환하지 않고 UTF-16 코드 단위 길이를 구할 수 있습니다.isInteger: 런타임을 호출하지 않고 jsi::Value가 정수인지 확인합니다.TypeError, RangeError, ReferenceError, SyntaxError, EvalError, URIError)에 대한 팩토리 메서드가 추가되었습니다.hardwareBackPress 이벤트가 네이티브 이벤트의 timeStamp 속성을 담은 이벤트 객체를 전달합니다. 타이밍 분석과 이벤트 상관 분석에 쓸 수 있으며, 인자를 무시하는 기존 콜백에는 영향이 없습니다.BackHandler 콜백이 동작하지 않던 문제를 수정했습니다. onHostResume 시점에 백 버튼 핸들러가 제대로 재등록됩니다.setAutoCapitalize 삼성 키보드 수정: 삼성 키보드에서 setAutoCapitalize가 TYPE_NUMBER_FLAG_SIGNED, TYPE_NUMBER_FLAG_DECIMAL 플래그를 제거해 숫자 입력에 음수 기호를 넣지 못하던 문제를 수정했습니다.KeyboardAvoidingView와 TextInput 자동 스크롤이 올바르게 반응합니다.android_ripple: android_ripple prop이 PlatformColor를 받을 수 있습니다.Image.getSize / Image.getSizeWithHeaders: Fresco가 다운샘플링한 값이 아니라 실제 원본 크기를 반환합니다.OutOfMemoryError 처리: NetworkingModule이 아주 큰 HTTP 응답을 올바르게 처리하며, OOM이나 크래시를 일으키지 않습니다.Cookie 헤더: WebSocketModule이 WebSocket 생성자의 headers 옵션으로 전달한 Cookie 헤더를 더 이상 제거하지 않습니다. 인증 쿠키를 WebSocket 연결로 보낼 수 있습니다.blob: URL용 Blob content provider가 새 아키텍처에서 정상 동작합니다.React Native 0.86에는 97명의 컨트리뷰터가 만든 596개 이상의 커밋이 담겨 있습니다. 모든 분들의 노고에 감사드립니다!
이번 릴리스에서 특히 큰 기여를 해주신 커뮤니티 멤버들께 특별히 감사를 전합니다.
이제 0.86이 React Native의 최신 안정 버전이며, 0.83.x는 지원 종료(unsupported) 상태가 됩니다. 자세한 내용은 React Native 지원 정책을 참고하세요.
기존 프로젝트에서는 React Native Upgrade Helper로 버전 간 코드 변경 사항을 확인하고, 함께 업그레이드 문서도 참고하세요.
npx @react-native-community/cli@latest init MyProject --version latestExpo 프로젝트에서는 React Native 0.86을 expo@canary 릴리스로 사용할 수 있습니다.
공식 GitHub 릴리스와 CHANGELOG의 변경 항목을 한국어로 정리했습니다. 기록이 짧거나 비어 있는 버전은 공식 태그 비교로 보충하고 그 근거를 표시했습니다. 각 항목은 해당 패치의 변경 사항입니다.
| 버전 | 배포일 | 주요 내용 |
|---|---|---|
| 0.86.3 | 2026-08-25 | 메모리 경합, Modal 이벤트, Android 복귀 오류 수정 |
| 0.86.2 | 2026-07-28 | 레이아웃 상태, Android 동기화, Hermes V1 갱신 |
| 0.86.1 | 배포되지 않음 | Maven 문제로 배포되지 않음 |
250829098.0.17로 갱신했습니다.EventEmitter.cpp에서 해제된 메모리에 접근할 수 있던 데이터 경합을 수정했습니다.parentNode와 parentElement가 실제 부모 요소를 반환하도록 수정했습니다. Modal 등 중첩된 루트 뷰 위의 상위 요소로 이벤트가 전파되지 않던 문제를 해결합니다.Yoga.podspec의 파일 목록을 정렬하고 hermes-engine.podspec의 상대 경로를 수정해 컴퓨터마다 SPEC CHECKSUMS가 달라지던 문제를 수정했습니다.onHostResume 도중 getInitialURL이 다시 호출되면 발생하던 ConcurrentModificationException을 수정했습니다.fontWeight를 지정한 사용자 글꼴이 가장 굵은 두께로 표시되던 문제를 수정했습니다.출처: 공식 릴리스 0.86.3 · 공식 CHANGELOG
display: contents 노드의 hasNewLayout 값이 잘못 설정되는 문제를 수정했습니다.mHasStartedDestroying 대신 전용 잠금 객체인 mHasStartedDestroyingLock을 사용합니다.java.lang.Boolean 객체로 동기화하지 않도록 수정했습니다.250829098.0.16으로 갱신했습니다.출처: 공식 릴리스 0.86.2 · 공식 CHANGELOG
0.86.2 항목에서 확인할 수 있습니다.출처: 공식 CHANGELOG · 0.86.2의 배포 제외 안내