캡스톤 설계 [건물별 소통 플랫폼 BBC]

모바일 기술 스택 및 아키텍쳐[Flutter vs React Native]

softmoca__ 2024. 3. 7. 15:34
목차

언어 : Dart
프레임 워크 :  Flutter

아직 모바일 애플리케이션 개발을 해본적은 없다.
하지만 실직적으로 현 대학생들은 웹으로 플랫폼을 이용하기 보다는 휴대폰으로 플랫폼을 이용하는게 현실이다.
고로 이참에 모바일 앱개발도 해보려고 한다.


주로 Android는 Android Studio로 개발하고 ios는 Swift로 주고 개발을 한다.
하지만 현재 각각의 플랫폼을 개발하는데는 시간적으로 불가능할 것같다.
단일 코드 베이스를 사용하여 크로스 플랫폼개발을 하려 한다.

 


크로스 플랫폼 개발이 가능한 오픈소스 프레임 워크의 양대산맥은 두개가 있다.
1. Flutter
2. React Native
 

Flutter과 React Native의 비교

Flutter의 장점
빠른 개발 속도:
-Flutter는 Dart 언어를 기반으로 하며 AOT 컴파일을 사용하여 네이티브 성능을 제공한다.
-또한 Flutter는 핫 리로딩을 지원하여 변경 사항을 즉시 앱에 반영할 수 있다.

강력한 UI: 
-Flutter는 자체 UI 위젯을 사용하여 고품질의 사용자 인터페이스를 쉽게 만들 수 있다.
다중 플랫폼 지원: 
-Flutter는 Android, iOS, Web을 포함한 다양한 플랫폼에서 실행할 수 있다.

Flutter의 단점
러닝 커브: 
-Flutter는 아직 비교적 새로운 프레임워크이며 러닝 커브가 높을 수 있다.
생태계: 
-하지만 플러터의 가장큰 아킬레스건은 Codepush이다.
앱스토어 승인과정을 반복적으로 거치지 않고도 애플리케이션을 업데이트 할수 있게 한다.
- 무엇보다 flutter의 가장 큰 단점은 centralized된 google app이라는 것.
언제 구글이 또 무덤으로 보낼 지 모르니까..
 

React Native의 장점
익숙한 언어: 
-React Native는 자바스크립트를 기반으로 하므로 React를 이미 알고 있다면 빠르게 학습할 수 있다.
큰 커뮤니티: 
-React Native는 React만큼 크고 활발한 커뮤니티를 가지고 있다.
다양한 라이브러리: 
-React Native에는 다양한 라이브러리와 도구가 있어 개발을 쉽게 할 수 있다.

React Native의 단점
성능: 
-React Native는 Flutter만큼 네이티브 성능을 제공하지 않다.
핫 리로딩: 
-React Native는 Flutter만큼 강력한 핫 리로딩을 지원하지 않다.
다중 플랫폼 지원: 
-React Native는 Flutter만큼 다중 플랫폼을 지원하지 않다.


어떤 프레임워크를 사용할지 선택하는 방법

개발 속도: 
- 빠른 개발 속도가 중요한 경우 Flutter가 좋은 선택이다.
UI 품질: 
고품질의 사용자 인터페이스가 중요한 경우 Flutter가 좋은 선택이다.
다중 플랫폼 지원: 
다양한 플랫폼에서 실행해야 하는 경우 Flutter가 좋은 선택이다.
학습 곡선: 
- 새로운 프레임워크를 배우는 데 시간이 걸리는 경우 React Native가 좋은 선택이다.
.
.
다만, 어플을 통해 사람들의 평가와 에러를 실시간으로 수정해야하는 극초기의 스타트업에게는 여전히 코드푸시의 매력을 놓기는 어렵다. 
초기 제품인만큼 에러도 많고 테스트할 것도 많은데 소비자의 업데이트를 강제하게하거나 스토어의 등록을 매번 기다리는 것은 검증단계에 있는 스타트업에게는 매우 부담스러운 일이기도 하다.


혼자 앱을 만들고 싶다 - 플러터 업데이트 많이 할(급하게 할) 필요가 없다 - 플러터
빠르게 시장 검증해야한다. - 리액트 네이티브
.
.
하지만 내생각에는 dart 언어에 대한 러닝커브는 큰 문제가 아니라 오히려 쉽게 배울수 있다고 생각을 한다.
또한 이후 spring을 학습할 것을 고려해보면 자바와 비슷한 성격을 지닌 dart를 사용하는것은 장기적으로 굉장히 좋은 선택이라고 생각을 한다.
.
.
.
(탐색, 번역,다크모드, 테마, 애니메이션, 상태관리, 이미 만들어진 컴포넌트, 라우팅, 카메라 엑세스, 파일 선택, 지도,
웹뷰, 앱구매 등등 다양한 패키지가 있다.)
리액트 네이티브는 위에서말한 패키지를 대부분 제공하지 않는다.
즉 리액트네이트브는 직접 코드를 짜야한다. 이런 점에서 서드파티에 의존하지 않아서 플러터가 강점을 지닌다.
또한 리액트 네이티브는 버전을 업그레이드 하는게 어렵고 불편하다.
상업적인 측면에서도 많은 대기업이 Flutter에 기대를 걸고 있다.

 

 

사용자 경험이 수익으로 직결되는 빅테크 기업들이 리액트네이티브 선택에는 주저하다가 플러터가 나오자 적극적으로 도입하고 있다.

그리고 당연히 구글까지.
구글은 수백만명의 사용자들이 사용하는 구글 페이 앱을 플러터로 처음부터 개발하였다.
코드줄이 35프로 줄었다. 170만 줄에서 110만줄로 엔지니어의 시간이 60~70% 로 준걸 알 수 있다.

위 현재 2023년 09월 19일 기준으로 깃허브 스타 수도 압도적으로 많고 리액트 네이티브가 훨씬 먼저 나왔음에도 불구하고 아직도 정식버전(1.0)을 출시하지 못하고 있는게 현재의 리액트 네이티브의 위치이다.
뜨뜨미지근한 리액트 네이티브와 다르게 구글에서 확실히 밀어주어서 플러터는 활발한 업데이트가 이어지고 있다.

 
 
 

언어 : Dart (자바와 타입스크립트와 비슷한 느낌) 

 Google에서 개발한 프로그래밍 언어로, 웹 애플리케이션, 서버, 모바일 앱, 그래픽 사용자 인터페이스 (UI) 및 다른 종류의 소프트웨어를 개발하기 위해 사용된다. 
Dart는 간결한 문법, 빠른 실행 속도, 객체 지향 프로그래밍, 함수형 프로그래밍 등 다양한 특성을 가지고 있다. 

객체 지향 및 클래스 기반: 
Dart는 객체 지향 언어로, 모든 것이 객체이며 클래스를 기반으로 한다. 
이러한 객체 지향 특성은 코드의 모듈성과 재사용성을 높이는 데 도움을 준다.

타입 시스템: 
Dart는 정적 타입 언어이며, 변수에 타입을 명시하거나 추론할 수 있다. 
이를 통해 코드의 안정성을 높이고 오류를 줄일 수 있다.

함수형 프로그래밍: 
Dart는 함수형 프로그래밍 기능을 지원한다. 
익명 함수, 람다 표현식, 고차 함수 등을 활용하여 함수형 프로그래밍 스타일을 채택할 수 있다.

빠른 실행 속도: 
Dart는 JIT(Just-In-Time) 컴파일러와 AOT(Ahead-Of-Time) 컴파일러를 모두 지원하여 빠른 실행 속도를 제공한다. 
웹 애플리케이션과 모바일 앱에서 뛰어난 성능을 보인다.

클라이언트 및 서버 개발: 
Dart는 클라이언트 측 웹 개발 (웹 애플리케이션 및 Flutter를 통한 모바일 앱 개발)과 
서버 측 개발 (Dart를 사용한 백엔드 서버 개발) 양쪽 모두에서 사용된다.

크로스 플랫폼 개발: 
Dart는 Google에서 개발한 Flutter 프레임워크를 통해 Android와 iOS 애플리케이션의 크로스 플랫폼 개발을 지원한다.

커뮤니티 및 생태계:

Dart는 활발한 커뮤니티와 다양한 라이브러리, 패키지, 플러그인을 가지고 있다. 
Dart 개발자들은 라이브러리 생태계를 통해 다양한 작업을 쉽게 수행할 수 있다.

오픈 소스:

Dart는 오픈 소스 프로젝트로 개발되고 있으며, 커뮤니티의 기여를 받아 지속적으로 발전하고 있다.

Dart는 주로 웹 및 모바일 애플리케이션 개발을 위해 사용되며, 특히 Google의 Flutter 프레임워크와 함께 사용되면 빠르고 효율적인 크로스 플랫폼 앱 개발을 지원한다. 
Dart 언어의 문법은 다른 프로그래밍 언어와 유사하며, 배우기 쉽고 사용하기 편리한 특성을 가지고 있다.
.
.
.

프레임 워크 :  Flutter

출처 : 애플코딩

Flutter는 Google에서 개발한 오픈 소스 프레임워크로, 모바일 앱과 웹 앱을 빌드하기 위한 도구와 라이브러리 모음이다. 
Flutter를 사용하면 단일 코드베이스를 사용하여 Android, iOS, 웹 및 기타 플랫폼에 대한 고품질의 네이티브 앱을 개발할 수 있다. 


다중 플랫폼 개발: 
Flutter를 사용하면 하나의 코드베이스로 Android와 iOS 앱을 동시에 개발할 수 있다. 
이것은 개발 생산성을 향상시키고 앱의 일관된 외관 및 동작을 보장한다.

풍부한 위젯 라이브러리: 
Flutter는 다양한 디자인 요소와 위젯을 포함하는 풍부한 라이브러리를 제공한다. 
이러한 위젯은 iOS와 Android의 네이티브 위젯과 비슷하게 동작하며, 사용자 인터페이스를 구축하고 커스터마이징하는 데 도움이된다.

고성능: 
Flutter는 자체적으로 그래픽 렌더링 엔진인 Skia를 사용하므로 빠른 성능을 제공한다. 
이것은 애니메이션 및 부드러운 스크롤과 같은 사용자 경험을 향상시킨다.

빠른 개발 주기: 
Flutter는 빠른 개발 주기를 허용하는 "핫 리로드" 기능을 제공한다. 
이를 통해 코드 변경 사항을 즉시 확인하고 테스트할 수 있으므로 앱을 더 빠르게 개발할 수 있다.

커스터마이즈 가능: 
Flutter를 사용하면 사용자 정의 디자인을 쉽게 적용할 수 있다. 
모든 위젯 및 스타일을 변경하고 앱의 외관과 동작을 제어할 수 있다.

오픈 소스 및 확장 가능: 
Flutter는 오픈 소스 프로젝트이므로 커뮤니티에 의한 확장 및 지원이 가능하다.
또한 Dart 언어를 기반으로 하므로 Dart 패키지 및 라이브러리를 사용하여 앱을 더 확장할 수 있다.

웹 지원: 
Flutter는 웹 앱 개발을 지원하고 있으며, 동일한 코드베이스로 모바일 앱 및 웹 앱을 빌드할 수 있다.

다양한 플랫폼 지원: 
Flutter는 Android와 iOS뿐만 아니라 웹, 데스크톱 (Flutter for Desktop), 
임베디드 시스템 (Flutter for Embedded) 및 기타 플랫폼에도 확장 가능하다.

Flutter는 주로 Dart 프로그래밍 언어로 개발되며, Dart는 객체 지향 및 함수형 프로그래밍 기능을 지원하는 언어이다. 
Dart 언어와 Flutter 프레임워크를 함께 사용하여 높은 생산성과 뛰어난 성능을 갖춘 모바일 앱 및 웹 앱을 개발할 수 있다.
.
.
.
.
 

Flutter로 한번에 안드로이드와 ios를 개발할 수 있는데 왜 굳이Android Studio랑  Swift를 사용하는 걸까 ? 

기존 프로젝트 및 코드베이스: 
기존에 Android Studio로 개발된 Android 앱이나 Xcode로 개발된 iOS 앱이 이미 존재하는 경우,  해당 앱을 새로운 기술 스택인 Flutter로 다시 작성하기보다는 기존 코드를 활용하여 유지 및 업데이트하는 것이 더 합리적일 수 있다.

플랫폼 특화된 기능: 
특정 플랫폼에 필요한 고유한 기능 또는 플러그인이 Flutter에서 제공하지 않을 수 있다.
 이 경우에는 네이티브 개발 환경(Android Studio 또는 Xcode)을 사용하여 해당 기능을 구현해야 한다.

성능 최적화: 
특정 앱이 뛰어난 성능을 요구하거나, 특정 플랫폼의 성능 특성을 최대한 활용해야 할 때 네이티브 개발이 선호될 수 있다. 
Flutter는 매우 빠른 성능을 제공하지만, 일부 특정한 경우에는 네이티브 개발이 더 적합할 수 있다.

UI/UX 일치: 
iOS와 Android 간에는 다른 UI/UX 가이드라인과 디자인 패턴이 존재한다. 
앱의 외관 및 동작을 각 플랫폼에 맞게 조정해야 할 때, 네이티브 개발이 더 용이할 수 있다.

개발자 스킬셋: 
개발자들은 종종 특정 플랫폼의 개발 스킬셋을 가지고 있다. 
따라서 Flutter로 크로스 플랫폼 개발을 하려면 이러한 개발자들을 다시 교육하거나 새로운 언어와 프레임워크를 익히도록 하려면 추가적인 시간과 비용이 소요된다.