Flutter와 React Native, 장단점보다 먼저 봐야 할 기술 선택 기준
앱 개발 상담에서 자주 나오는 질문이 있습니다. "Flutter와 React Native 중 무엇이 더 좋은가요?"
짧게 답하면 둘 다 좋은 도구이고, 제품과 팀에 맞지 않게 선택했을 때 둘 다 비싼 도구가 됩니다. 프레임워크 선택은 장점이 많은 쪽을 고르는 문제가 아니라 개발 비용이 어디에서 발생해도 괜찮은지를 정하는 문제에 가깝습니다.
이 글은 2026년 7월의 Flutter 3.44와 React Native 0.86 공식 문서를 기준으로 작성했습니다. 버전은 바뀌어도 팀 역량, UI 성격, 네이티브 기능, 웹 확장, 유지보수라는 선택 기준은 오래 남습니다.
먼저 구조가 어떻게 다른지 알아야 한다
Flutter는 Dart로 작성한 위젯을 자체 렌더링 엔진으로 그립니다. 운영체제의 버튼과 입력창을 그대로 배치하는 방식이 아니라, Flutter가 레이아웃과 페인팅을 맡아 화면을 만듭니다. 모바일 릴리스에서는 Dart 코드가 네이티브 머신 코드로 컴파일되고, 카메라나 결제 같은 플랫폼 기능은 플러그인 또는 Platform Channel로 Swift·Kotlin 코드와 연결합니다.
React Native는 JavaScript 또는 TypeScript로 React 컴포넌트를 작성하고, React Native의 기본 컴포넌트를 네이티브 플랫폼 UI와 연결합니다. 현재 New Architecture는 Fabric 렌더러, JSI, Turbo Native Module, Codegen을 중심으로 JavaScript와 네이티브 영역의 연결을 개선했습니다. 웹뷰 안에서 웹 페이지를 실행하는 방식은 아닙니다.
이 차이가 나머지 장단점의 출발점입니다.
Flutter의 강점
화면을 원하는 모습으로 통제하기 쉽다
Flutter는 자신이 직접 화면을 그리므로 iOS와 Android에서 같은 디자인을 유지하기 좋습니다. 브랜드 색과 간격이 정교한 서비스, 그래픽이 많은 대시보드, 키오스크, 커스텀 애니메이션처럼 운영체제 기본 UI보다 제품 고유의 표현이 중요한 경우에 강합니다.
디자인 시스템을 위젯으로 만들면 한 팀이 두 플랫폼의 결과를 비교적 일관되게 관리할 수 있습니다. 같은 화면을 플랫폼마다 다시 조립하는 비용이 줄어듭니다.
지원 플랫폼의 범위가 넓다
Flutter는 Android와 iOS뿐 아니라 웹, Windows, macOS, Linux를 공식 지원 범위에 둡니다. 모바일 앱을 시작으로 운영용 데스크톱 프로그램이나 앱 형태의 웹 화면까지 확장할 계획이라면 하나의 기술 체계를 유지할 여지가 큽니다.
개발 경험이 한 체계로 모인다
위젯, 레이아웃, 테마, 애니메이션, 테스트 도구가 Flutter 생태계 안에서 비교적 통일돼 있습니다. 전담 모바일 팀이 Dart와 Flutter에 익숙해지면 화면 제작 속도와 일관성에서 이점을 얻기 쉽습니다.
Flutter의 약점
Dart 학습과 채용 비용이 생긴다
팀이 이미 React와 TypeScript에 익숙하다면 Dart, Flutter의 상태 관리, 위젯 생명주기, 빌드 체계를 새로 배워야 합니다. 프레임워크 자체의 생산성이 높아도 초기 학습과 채용 시장까지 포함하면 총비용이 달라질 수 있습니다.
플랫폼다운 느낌은 따로 설계해야 한다
화면이 두 운영체제에서 같다는 것은 장점이면서 단점입니다. iOS와 Android 사용자가 기대하는 탐색 방식, 뒤로 가기, 제스처, 입력창, 권한 안내가 다른데 모든 화면을 동일하게 만들면 오히려 어색할 수 있습니다. Material과 Cupertino 위젯이 있어도 제품 차원의 플랫폼 적응은 팀이 결정해야 합니다.
네이티브 SDK는 플러그인 품질에 좌우된다
필요한 기능의 플러그인이 없거나 업데이트가 느리면 Platform Channel과 Swift·Kotlin 코드를 직접 작성해야 합니다. 결제, 지도, 본인인증, BLE, 백그라운드 실행처럼 운영체제와 가까운 기능이 많다면 개발 전에 실제 SDK 버전과 플러그인 유지 상태를 확인해야 합니다.
웹은 용도를 가린다
Flutter 공식 문서도 앱 중심 웹 경험에는 적합하지만, 블로그나 마케팅 사이트처럼 텍스트가 많고 검색 노출이 중요한 문서형 웹에는 전통적인 HTML을 권합니다. "모바일과 웹을 한 번에"라는 말만 보고 회사 홈페이지까지 Flutter로 묶는 것은 좋은 선택이 아닐 수 있습니다.
React Native의 강점
React와 TypeScript 팀이 빠르게 진입할 수 있다
기존 웹 팀이 React, TypeScript, npm 생태계에 익숙하다면 언어와 컴포넌트 사고방식을 이어갈 수 있습니다. API 모델, 검증 로직, 상태 관리, 일부 유틸리티도 웹 프로젝트와 공유하기 쉽습니다.
다만 웹의 DOM 컴포넌트를 앱에서 그대로 쓰는 것은 아닙니다. 공유하기 쉬운 것은 우선 언어, 개발 방식, 비즈니스 로직이고 UI 공유 범위는 프로젝트 구조에 따라 달라집니다.
네이티브 플랫폼과 가까운 UI를 만들기 좋다
React Native의 기본 컴포넌트는 네이티브 플랫폼 UI에 연결됩니다. 운영체제의 탐색, 스크롤, 입력, 접근성 동작과 가까운 앱을 만들 때 자연스럽습니다. iOS와 Android에 다른 구현이 필요하면 Platform API나 .ios, .android 파일로 차이를 명시적으로 나눌 수 있습니다.
Expo를 포함한 실용적인 시작 경로가 있다
React Native 공식 문서는 새 앱에 Expo 같은 프레임워크 사용을 권장합니다. 라우팅, 빌드, 배포, 알림, 카메라 같은 반복 작업을 한 체계로 시작할 수 있어 React 팀의 MVP에는 특히 효율적입니다. 필요하면 개발 빌드와 네이티브 모듈로 확장할 수도 있습니다.
기존 앱에 일부 화면부터 넣을 수 있다
기존 Swift·Kotlin 앱에 React Native 화면이나 기능 흐름 하나를 추가하는 점진적 도입이 가능합니다. 전면 재개발이 위험한 운영 앱이라면 작은 영역부터 검증하는 전략을 쓸 수 있습니다. Flutter 역시 add-to-app을 지원하므로, 이 경우에는 두 프레임워크의 가능 여부보다 기존 빌드 체계와 팀 경험을 비교해야 합니다.
React Native의 약점
의존성 조합과 업그레이드를 관리해야 한다
React Native 앱은 React Native 본체, Expo 또는 다른 프레임워크, 내비게이션, 네이티브 모듈, iOS·Android 빌드 도구가 함께 움직입니다. 현재는 New Architecture가 기본 경로이므로 오래된 라이브러리나 자체 네이티브 모듈의 호환성을 반드시 확인해야 합니다.
패키지가 많다는 사실보다 우리 앱의 핵심 패키지가 새 아키텍처와 최신 OS를 얼마나 빨리 지원하는지가 중요합니다.
플랫폼 차이가 코드에 더 자주 드러날 수 있다
같은 기본 컴포넌트라도 키보드, 그림자, 권한, 뒤로 가기, 안전 영역, 모달 동작은 iOS와 Android가 다릅니다. 플랫폼다운 결과를 얻기 쉬운 대신, 차이를 해결하는 조건문과 전용 파일이 늘어날 수 있습니다.
JavaScript 스레드에 무거운 일을 몰아넣으면 끊긴다
New Architecture가 예전 브리지의 여러 제약을 줄였지만, React 렌더링과 많은 비즈니스 로직은 여전히 JavaScript 런타임에서 수행됩니다. 큰 목록을 한 번에 다시 그리거나 동기 계산을 오래 실행하면 입력과 애니메이션이 느려질 수 있습니다. 공식 성능 문서도 개발 모드가 아닌 릴리스 빌드에서 JS와 UI 프레임을 따로 측정하라고 안내합니다.
한눈에 비교하면
| 선택 기준 | Flutter 쪽이 유리한 경우 | React Native 쪽이 유리한 경우 |
|---|---|---|
| 기존 팀 | 전담 앱 팀을 새로 구성하거나 Flutter 경험자가 있다 | React·TypeScript 웹 팀이 앱도 맡는다 |
| UI 성격 | 두 플랫폼에서 같은 커스텀 UI와 애니메이션이 중요하다 | 각 플랫폼의 익숙한 동작과 표현이 중요하다 |
| 네이티브 기능 | 검증된 Flutter 플러그인이 있고 직접 채널을 만들 수 있다 | 검증된 RN·Expo 모듈이 있고 JS와 네이티브 경험이 있다 |
| 웹 확장 | 대시보드·도구 같은 앱 중심 웹도 같은 체계로 만든다 | 기존 React 웹과 언어·로직·인력을 공유한다 |
| 데스크톱 | 공식 지원 범위 안에서 데스크톱 확장 가능성이 크다 | 모바일이 중심이고 데스크톱은 별도 판단한다 |
| 기존 네이티브 앱 | Flutter 모듈의 자체 UI가 필요한 영역부터 넣는다 | 기존 화면 흐름에 React 화면을 점진적으로 넣는다 |
| 장기 유지보수 | Dart·Flutter 중심으로 의존성을 통제할 수 있다 | npm·React Native·네이티브 의존성 조합을 관리할 수 있다 |
표에서 중요한 것은 열별 승점의 합이 아닙니다. 제품에서 실패하면 안 되는 항목에 더 큰 가중치를 주는 것입니다.
성능만으로 고르면 자주 틀린다
"Flutter는 네이티브 컴파일이라 항상 빠르고 React Native는 JavaScript라 느리다"는 설명은 너무 단순합니다.
Flutter는 자체 렌더러와 컴파일된 Dart 코드 덕분에 복잡한 커스텀 UI를 일관되게 처리하기 좋습니다. 반면 네이티브 뷰를 화면 안에 섞거나 플랫폼 채널을 자주 오가는 기능은 별도 검증이 필요합니다.
React Native는 네이티브 기반 UI와 New Architecture를 사용하고, 네이티브 스레드에서 동작하는 스크롤과 전환은 충분히 부드럽게 만들 수 있습니다. 반면 JS 스레드에서 큰 계산이나 과도한 다시 렌더링이 발생하면 프레임이 떨어집니다.
결국 성능은 프레임워크 이름보다 화면 구조와 구현 방식에 좌우됩니다. 다음 항목을 실제 저사양 기기의 릴리스 빌드에서 확인하는 편이 정확합니다.
- 긴 목록의 빠른 스크롤
- 지도 위의 많은 마커와 실시간 위치 갱신
- 카메라, 영상, 이미지 편집
- 키보드가 열린 복잡한 입력 폼
- 백그라운드 동기화와 푸시 알림 진입
- 제품의 핵심 애니메이션
기술 선택은 이 순서로 하면 된다
1. 필수 네이티브 기능부터 목록으로 만든다
로그인과 API 연동만 보고 프레임워크를 고르면 안 됩니다. 결제, 지도, 본인인증, BLE, NFC, 위젯, 앱 확장, 백그라운드 위치, 파일 공유처럼 출시를 좌우하는 기능을 먼저 적습니다.
2. 패키지 이름이 아니라 유지 상태를 확인한다
Flutter 플러그인이나 React Native 모듈이 검색된다고 끝이 아닙니다. 최신 iOS·Android 지원 여부, 최근 배포일, 미해결 이슈, 라이선스, New Architecture 호환, 원본 네이티브 SDK 버전을 봐야 합니다.
3. 가장 위험한 화면으로 작은 검증 앱을 만든다
로그인 화면은 어떤 기술로도 잘 만들어집니다. 성능과 호환성이 걱정되는 핵심 기능 하나를 실제 기기에서 먼저 구현해야 차이가 드러납니다. 두 후보를 비교한다면 똑같은 시나리오와 측정 기준을 사용합니다.
4. 개발비가 아니라 3년 총비용을 계산한다
초기 개발 기간뿐 아니라 채용, 교육, OS 업데이트, 패키지 교체, CI 빌드, 앱 심사 대응, 장애 분석, 네이티브 코드 유지비를 함께 봅니다. 팀이 이해하지 못하는 빠른 프레임워크보다 팀이 오래 운영할 수 있는 익숙한 프레임워크가 더 쌀 때가 많습니다.
5. 네이티브 개발도 후보에서 빼지 않는다
한 플랫폼만 출시하고 운영체제 깊숙한 기능이 핵심이라면 Swift나 Kotlin이 더 단순할 수 있습니다. 크로스 플랫폼이 목적이 아니라면 크로스 플랫폼 프레임워크를 선택해야 할 이유도 줄어듭니다.
상황별로 고르면
이미 React 웹 서비스를 운영하는 작은 팀이 빠르게 모바일 MVP를 만들어야 한다면 React Native와 Expo가 자연스러운 출발점입니다. 기존 인력과 언어를 활용하고 제품 검증에 집중할 수 있습니다.
브랜드 고유의 화면, 데이터 시각화, 애니메이션이 많고 iOS와 Android의 결과를 같은 디자인 시스템으로 통제해야 한다면 Flutter가 잘 맞습니다. 전담 팀이 Dart를 받아들일 수 있는지가 전제입니다.
결제·지도·카메라·본인인증 같은 외부 SDK 의존성이 제품의 중심이라면 프레임워크 선호보다 SDK 검증 결과를 우선해야 합니다. 플러그인이 부족할 때 Swift와 Kotlin을 직접 다룰 사람이 있는지도 같이 확인합니다.
기존 네이티브 앱의 일부 화면만 바꾸려면 Flutter와 React Native 모두 단계적 통합이 가능합니다. 이때는 데모가 아니라 실제 내비게이션, 빌드 시간, 앱 크기, 메모리, 네이티브 화면과의 데이터 전달을 검증해야 합니다.
정리
Flutter의 핵심 장점은 자체 렌더링을 통한 UI 일관성과 넓은 공식 플랫폼 범위입니다. React Native의 핵심 장점은 React·TypeScript 인력 활용과 네이티브 플랫폼 생태계에 가까운 개발 방식입니다.
선택 기준은 "어느 것이 더 빠른가"가 아니라 다음 네 가지면 충분합니다.
- 우리 팀이 3년 동안 유지할 수 있는가.
- 제품의 핵심 UI를 원하는 품질로 만들 수 있는가.
- 반드시 필요한 네이티브 SDK가 실제로 동작하는가.
- 웹과 데스크톱 확장이 정말 같은 UI를 필요로 하는가.
이 질문에 답한 뒤에도 두 후보가 비슷하다면, 가장 위험한 기능을 짧게 구현해 본 결과로 결정하면 됩니다. 기술 선택 문서보다 작은 실험 하나가 더 정확합니다.
참고 자료
- Flutter 아키텍처 개요
- Flutter 지원 플랫폼
- Flutter Platform Channel
- Flutter Web FAQ
- 기존 앱에 Flutter 추가하기
- React Native 소개
- React Native 시작하기와 Expo 권장 경로
- React Native 플랫폼별 코드
- React Native New Architecture
- React Native 성능 개요
- 기존 앱에 React Native 통합하기
같이 읽기:
함께 읽기
- Flutter 앱 배포, `flutter build` 한 줄이면 끝인 줄 알았습니다Flutter 앱의 빌드 명령은 간단합니다. Android는 flutter build appbundle, iOS는 flutter build ipa로 결과물을 만들 수 있습니다. 그러나 팀이 반복해서 사용할 수 있는 배포 체계를 만들려면 그 뒤에 있는 서명, 권한, 스토어 API, 심사와 출시 절차까지 함께 설계해야 합니…
- Expo SDK 56 앱을 App Store와 Google Play에 배포하기Expo 앱을 배포한다고 하면 보통 eas build 명령 하나를 떠올립니다. 실제 운영 배포는 빌드, 앱 서명, 스토어 업로드, 베타 테스트, 심사, 공개 출시, OTA 업데이트가 서로 다른 단계입니다. 이 구분을 놓치면 CI가 성공했는데 스토어에는 앱이 없거나, JavaScript 수정이라고 생각해 OTA를 발행했는…
- Expo 앱은 만들었는데 출시가 안 됩니다: `eas build`보다 먼저 준비할 것들Expo를 사용하면 네이티브 빌드 과정이 크게 단순해집니다. 하지만 앱스토어 출시까지 명령어 한두 줄로 끝나는 것은 아닙니다. 실제 자동 배포를 만들려면 앱 등록, 서명 자격 증명, 스토어 API 권한, CI/CD 승인 절차가 먼저 준비되어야 합니다.
- 같은 Expo 앱인데 배포 방식은 달랐습니다: iOS와 Android 심사 제출 비교기앞선 글에서는 이미 TestFlight에 올라간 iOS 빌드를 AI가 App Store 심사까지 제출한 과정을 다뤘습니다.
- 코드는 그대로인데 앱 심사는 제출됐습니다: AI에게 Expo 배포를 맡겨본 기록코드를 한 줄도 수정하지 않았는데 TestFlight에 올라가 있던 앱이 App Review 제출 상태로 바뀌었습니다. 얼핏 보면 AI가 앱을 새로 빌드해서 배포한 것처럼 보이지만, 실제로는 이미 준비된 빌드와 스토어 정보를 확인한 뒤 App Store Connect의 심사 절차를 진행한 것입니다.