FEConf · FEConf 2025 2025
60 FPS in React Native
React Native 앱에서 60 FPS 애니메이션을 구현하는 New Architecture 기반 최적화 전략을 소개합니다.
요약
핵심 토픽
학습 포인트
1. 구 Bridge vs New Architecture(JSI)
구 아키텍처: JS→Native 통신을 JSON 직렬화/역직렬화로 처리해 지연이 발생. 비동기 큐에 메시지가 쌓이면 프레임 드랍. New Architecture(JSI): JS와 Native가 C++ 레이어를 통해 직접 메모리를 공유하고 동기 호출 가능. Fabric(UI), TurboModules(Native 모듈)로 구성.
핵심 용어
2. Reanimated 3: UI 스레드 애니메이션
Reanimated 3는 `worklet` 함수를 UI 스레드에서 직접 실행합니다. JS 스레드가 바쁘거나 멈춰도 애니메이션이 끊기지 않습니다. `useSharedValue`, `useAnimatedStyle`로 애니메이션 값을 정의하고 `withSpring`, `withTiming`으로 전환 효과를 적용합니다. Gesture Handler와 함께 사용하면 제스처 기반 애니메이션도 UI 스레드에서 처리됩니다.
핵심 용어
3. FlatList 성능 최적화
FlatList의 주요 최적화: `keyExtractor`로 안정적인 키 제공, `getItemLayout`으로 아이템 높이 사전 계산(스크롤 오프셋 계산 비용 제거), `windowSize` 조정으로 메모리와 렌더 비용 균형, `removeClippedSubviews`로 화면 밖 뷰 메모리 해제, `React.memo`로 아이템 컴포넌트 리렌더 방지.
핵심 용어
면접 질문
Q1. React Native의 구 아키텍처와 New Architecture의 차이를 설명해주세요.
힌트
[감점 답변] 정의만 반복하거나 "React Native의 구 아키텍처와 New Architecture의 차이를 설명해주세요."에 대해 장단점 없이 단편적으로 답하면 감점 포인트입니다. 면접관은 실무 적용 경험이 부족하다고 판단합니다. [좋은 답변] 구: JS-Native 간 Bridge로 JSON 비동기 통신 → 직렬화 비용, 프레임 드랍 위험. New: JSI(JavaScript Interface)로 C++ 레이어를 통해 직접 동기 통신 가능. Fabric(렌더러), TurboModules(네이티브 모듈)로 구성. 이로 인해 Reanimated 같은 UI 스레드 라이브러리가 더 효과적으로 동작합니다.
Q2. React Native에서 60 FPS 애니메이션을 보장하려면 어떻게 해야 하나요?
힌트
[감점 답변] 정의만 반복하거나 "React Native에서 60 FPS 애니메이션을 보장하려면 어떻게 해야 하나요?"에 대해 장단점 없이 단편적으로 답하면 감점 포인트입니다. 면접관은 실무 적용 경험이 부족하다고 판단합니다. [좋은 답변] 핵심: JS 스레드가 아닌 UI 스레드에서 애니메이션을 구동해야 합니다. Reanimated 3의 worklet 함수가 UI 스레드에서 실행됩니다. JS 스레드 작업(API 호출, 무거운 연산)이 애니메이션에 영향을 주지 않도록 격리하고, `InteractionManager.runAfterInteractions`로 애니메이션 완료 후 무거운 작업을 실행합니다.
Q3. React Native의 FlatList와 ScrollView의 차이와 FlatList를 사용해야 하는 이유는 무엇인가요?
힌트
[감점 답변] 정의만 반복하거나 "React Native의 FlatList와 ScrollView의 차이와 FlatList를 사용해야 하는 이유는 무엇인가요?"에 대해 장단점 없이 단편적으로 답하면 감점 포인트입니다. 면접관은 실무 적용 경험이 부족하다고 판단합니다. [좋은 답변] ScrollView는 모든 자식을 한 번에 렌더합니다. 100개 아이템이면 100개 모두 렌더. FlatList는 화면에 보이는 아이템만 렌더하고 스크롤 시 재활용(virtualization)합니다. 긴 목록에서 ScrollView를 쓰면 초기 렌더 시간과 메모리 사용량이 폭증하므로 FlatList를 사용해야 합니다.
선행 학습
- React Native 기본 컴포넌트와 스타일링
- React 성능 최적화 기본(memo, useMemo)
- 네이티브 앱 렌더링 기초 개념
핵심 타임스탬프
학습 방법
1단계: React Native 개발자 메뉴의 Perf Monitor를 켜고 기존 앱의 JS FPS와 UI FPS를 측정해보세요. 두 값이 같이 낮은지(JS 문제) UI FPS만 낮은지(렌더 문제) 구분하는 것이 시작입니다. 2단계: Reanimated 3 공식 예제에서 `withSpring`과 `useSharedValue`로 카드 스와이프 애니메이션을 구현해 worklet이 UI 스레드에서 실행됨을 Flipper에서 확인해보세요. 3단계: 100개 이상 아이템 목록을 ScrollView와 FlatList로 각각 구현하고 Perf Monitor로 메모리와 FPS 차이를 비교해보세요. 4단계: 동료에게 "React Native New Architecture"의 핵심을 5분 안에 설명해보세요. 막히는 부분이 아직 구조적으로 이해되지 않은 지점입니다.