New Architecture 딥다이브
JSI·Fabric·TurboModules 내부 구조와 성능 최적화 전략
핵심 요약
- SDK 55 이후 New Architecture는 사실상 전제이며 SDK 56은 RN 0.85, Hermes V1, 새 animation backend를 그 위에 쌓습니다.
- Hermes V1·JSI·TurboModules·Fabric·Expo Modules API 각 계층마다 cold launch 증가, native 호출 crash, module not found, layout flicker 같은 고유 장애 징후가 있습니다.
- native module boundary는 domain 함수로 감싸고, native exception은 typed error code로 바꿔 던지며, sync function은 startup path에서만 제한적으로 씁니다.
- native module 추가·권한 변경은 OTA가 아니라 binary release 대상입니다.
- 성능 예산은 cold launch·TTI P95 악화 10% 미만, crash-free 99.5% 이상으로 두고 Android ANR은 저사양 세그먼트를 별도 추적합니다.
운영 관점의 New Architecture
SDK 55부터 Expo 앱은 New Architecture를 사실상 전제로 깔고 갑니다. SDK 56은 React Native 0.85, Hermes V1, 새 animation backend, Expo Modules 성능 개선을 그 위에 얹습니다.
핵심 계층
| 계층 | 역할 | 장애 징후 |
|---|---|---|
| Hermes V1 | JS 실행과 bytecode 로딩 | cold launch 증가, JSI crash |
| JSI | JS와 native 객체 직접 연결 | native module 호출 crash, worklet 오류 |
| TurboModules | lazy native module loading | module not found, sync/async mismatch |
| Fabric | concurrent rendering 친화 UI renderer | layout flicker, measurement mismatch |
| Expo Modules API | Swift/Kotlin DSL 기반 native capability | autolinking, permission, lifecycle 오류 |
SDK 56 점검 포인트
- Hermes V1 기본값으로 startup metric을 다시 baseline합니다.
expo/fetchglobal 교체로 네트워크 계측·polyfill 충돌을 점검합니다.- 새 animation backend와 Reanimated/worklets 조합을 device farm에서 검증합니다.
- iOS prebuilt Expo Modules가 켜진 상태에서 custom native patch가 source build를 요구하지 않는지 확인합니다.
- Expo Router와 React Navigation import 경계가 섞이지 않았는지
expo-doctor와 codemod로 확인합니다.
native module boundary 규칙
- JS wrapper는 native API를 직접 노출하지 않고 domain 함수로 감쌉니다.
- 오류는 native exception 그대로 던지지 말고 typed error code로 변환합니다.
- sync function은 startup path에서만 제한적으로 사용합니다.
- 이벤트는 구독 해제 lifecycle을 강제합니다.
- native module 추가·권한 변경은 OTA 대상이 아니라 binary release 대상입니다.
성능 예산
| 지표 | 권장 예산 |
|---|---|
| cold launch P95 | 이전 production 대비 10% 이상 악화 금지 |
| TTI P95 | rollout 10% 단계에서 직전 버전과 비교 |
| JS bundle load | bytecode diff 후 payload size와 함께 확인 |
| native crash-free sessions | 99.5% 이상 |
| Android ANR | 저사양 기기 세그먼트 별도 추적 |
디버깅 순서
npx expo-doctor로 dependency·router·package 경계를 확인합니다.- development build에서 React Native DevTools와 native logs를 동시에 봅니다.
- Hermes crash는 sourcemap·dSYM·ProGuard mapping 업로드 상태를 먼저 확인합니다.
- native module crash는 EAS Build artifact의 exact commit과 runtimeVersion을 대조합니다.
- OTA 이후만 발생하면 EAS Update group과 binary runtimeVersion 호환성을 먼저 봅니다.