React Native Fabric 아키텍처
📌 Fabric이란?
Fabric은 React Native에서 새롭게 도입된 렌더링 아키텍처로
기존 구조에서 JS와 Native 간 통신에 사용되던 Bridge 병목 문제, UI 업데이트 지연, React 최신 기능 미지원 같은 한계를 극복하기 위해 도입됨.
React 18 이후 생긴 Concurrent Rendering, Suspense, Fine-grained UI control 등을 사용하려면 필요했음
❗ 기존 아키텍처(Paper)의 문제
구조 요약:
JS에서 UI 명령 생성 → JSON 형태로 Bridge를 통해 Native로 전달 → Native에서 렌더링
JS와 Native는 서로 다른 쓰레드에서 동작함
메시지들은 직렬화되고 비동기로 전달되며, 순서 보장 없이 처리됨
문제점:
Bridge
가 단방향/직렬화 기반이기 때문에 병목 발생JS 쓰레드가 바쁠 때 Native 쪽 렌더링 지연됨 → UI 끊김 발생
React 18의 Concurrent UI 기능과 전혀 연동 불가능
네이티브 UI와 JS 상태 간의 불일치 발생 가능성 있음
컴포넌트 간 상호작용이 복잡해질수록 퍼포먼스 급격히 하락
Android와 iOS 간 UI 구현 일관성 유지 어려움
✅ Fabric 구조
핵심 구성 요소:
구성 | 설명 |
---|---|
JSI (JavaScript Interface) | JS에서 Native 기능을 직접 호출할 수 있는 C++ 레이어 |
Fabric Renderer | React Fiber와 연결되어 UI 명령을 직접 Native에 전달 |
TurboModules | 기존 NativeModules를 대체, 더 빠르고 유연한 모듈 시스템 |
Shadow Tree | React의 Virtual DOM과 대응되는 구조로, 렌더링 트리 생성 |
작동 방식:
React Fiber에서 UI 명령 생성
Shadow Tree로 변환
JSI를 통해 Native UI로 직접 적용
→ Bridge 경유하지 않음. 동기화와 성능 모두 개선
✨ Fabric에서 가능해진 것들
기능 | 설명 |
---|---|
✅ | Android에서도 지원됨 |
✅ Concurrent Rendering 지원 | React 18의 핵심 기능 대응 |
✅ Pressability 개선 | Press 처리 정확도 및 피드백 향상 |
✅ LayoutAnimation | 네이티브 수준에서 더 자연스러운 레이아웃 애니메이션 가능 |
✅ Suspense, Lazy loading, JSI 연계 | 더욱 효율적인 렌더링 전략 사용 가능 |
✅ 플랫폼 간 View 일관성 | Android/iOS 공통 ViewManager로 구현 차이 감소 |
📦 Fabric이 도입된 배경
React Native가 초기에 가진 장점(빠른 개발, JS-Native 혼합)은 유지하면서도,
점점 무거워지는 UI 요구와 React Core의 발전 방향(Concurrent UI 등)에 대응할 수 없었다
React 18의 기능을 모바일에서 제대로 활용하려면:
React Fiber와 Native UI의 렌더 트리 연동
JS ↔ Native 간 직접적인 커뮤니케이션 경로
각 컴포넌트의 상태 변화에 따른 즉각적인 UI 반영
이런 기반이 필수였음 → 그래서 Fabric이 나옴
🕓 도입 히스토리
버전 | 출시일 | 내용 |
---|---|---|
2018년 | - | Facebook에서 "React Native New Architecture" 계획 최초 발표. Fabric, TurboModules, JSI 개념 등장 |
0.68 | 2022년 3월 | New Architecture 실험적 도입. 수동 설정 필요 (opt-in) |
0.70 | 2022년 9월 | Fabric, TurboModules 기능 베이스라인 포함. 하지만 기본 비활성화 |
0.71 ~ 0.75 | 2023~2024년 | 점진적 안정화 진행. |
0.76 | 2024년 10월 | Fabric 및 TurboModules가 기본 활성화됨 (default ON)New Architecture가 표준화되기 시작함 |
0.77 | 2025년 1월 |
|
0.78 | 2025년 2월 | React 19 통합, Android Drawable 지원, Fabric 기반 컴포넌트 개선 |
0.79 | 2025년 4월 | 성능 최적화와 빌드 개선 중심. Fabric 안정성 ↑ |
0.80 | 2025년 6월 | React 19.1 통합, Strict TypeScript API 추가📌 기존 아키텍처(Paper)는 공식적으로 동결됨 (deprecated) |
🔍 기존 vs Fabric 차이
항목 | 기존 아키텍처(Paper) | Fabric |
---|---|---|
JS ↔ Native 연결 | Bridge (직렬화 기반) | JSI (Native 함수 직접 호출) |
UI 렌더링 방식 | UIManager 통해 명령 실행 | React Fiber ↔ Fabric Renderer 직접 연결 |
Native 모듈 | NativeModules (비동기 호출) | TurboModules (동기/JSI 기반) |
React 최신 기능 지원 | ❌ 불가 | ✅ 가능 (Concurrent, Suspense 등) |
성능 | JS/Native 간 지연 큼 | 빠르고 일관된 렌더링 |
Android/iOS 일관성 | ViewManager 분리 | 공통 ViewManager 사용 |
🔧 Fabric 활성화 여부 확인
아래 콘솔이 true라면 활성화된 플젝.
console.log(global?.nativeFabricUIManager != null);
🧠 예시로 보는 변화
<Button onPress={() => setOpen(true)} />
기존
이 이벤트가 JS에서 처리되고
Native는 Bridge 통해 지연 적용 → 프레임 딜레이 발생 가능
Fabric 이후
React Fiber가 직접 상태 변화 추적
Shadow Tree 업데이트 후 즉시 Native에 반영 → 지연 없음, UI 정확도 ↑
✅ 마무리 요약
Fabric은 React와 Native가 진짜로 하나처럼 동작하게 만들어주는 기반이다
0.76 이후부터는 기본 적용되어 있으며, boxShadow, PressAnimation, Concurrent Rendering 등 모든 최신 기능은 Fabric 없이는 불가능하다