SlideShare a Scribd company logo
Android / Flutter 앱 개발의 

큰 5가지
남반석2019.12.8
차이점
가장 큰 5가지
1. 같은 코드로 iOS 릴리즈 가능하다.
2. Hot Reload 지원 => 개발 시간을 획기적으로 단축.
3. Dart 언어를 사용 (Javascript, Java를 섞어버린)
4. 안드로이드 스튜디오 외에 VS Code로 개발 가능하다. (가볍고 쾌적하
다.)
5. Android는 OS가 그리는 반면, Flutter는 Skia엔진이 그린다.
차이점
여러분의 현재 반응
오늘 주제는 가장 큰 차이점
오늘 주제는 개발의 큰 차이점
1. 첫번째차이점
크래시가 나지 않는다.
•단 Native쪽과 연동 과정에서는 크래시가 발생하기도 한다.
•기본 UI Framework에서는 크래시로 앱이 죽지 않는다
1.
크래시가 나지 않는다면 어떤 일이 벌어질까요?
1. 크래시가 나지 않는다.
•기본 UI Framework에서는 크래시로 앱이 죽지 않는다
•Widget 안에

빨갛고 노란

stacktrace 로그가 보인다.
1. 크래시가 나지 않는다.
•기본 UI Framework에서는 크래시로 앱이 죽지 않는다
•Rotating Error Pizza



From - Facebook Group

“Let's Flutter with Dart”
1. 크래시가 나지 않는다.
•발생한 Exception은 IDE 로그로 확인 가능하다.
1. 크래시가 나지 않는다.
•다양한 플러그인을 사용할때 

Android 채널, iOS 채널을 통해 코드가 실행되면 

Native 코드로 (Java, Kotlin, Swift) 실행이 되고, 크래시 발생 가능.



간혹 Low Level에서 크래시가 발생하기도 한다.
1. 크래시가 나지 않는다.
•Fatal signal 11 (C, .so파일 관련 에러)가 발생하면

분석, 해결이 굉장히 어렵다.
•푸시 플러그인 버그: 

https://github.com/FirebaseExtended/flutterfire/issues/125
1. 크래시가 나지 않는다.
실제 Product에서도 

크래시가 안나나요?
1. 크래시가 나지 않는다.
- Android 1건 (화웨이 기기)

DAU 250

MAU 1.5K
최근 30일 크래시
- IOS 0건

DAU 2.1K

MAU 12K

(11월에 Flutter 전환,

0.04%는 원인불명;;)
1. 크래시가 나지 않는다.
그러면 코드 오류는 

잡을 수 없나요?
1. 크래시가 나지 않는다.
Firebase에서 Crashes 필터 -> Non-Fatal로 바꾸면, 

위젯이나, 로직 등에서 발생한 에러의 File & Line을 볼 수 있다.
1. 크래시가 나지 않는다.
•장점: 사용자가 앱 사용하다가, 특정 Screen(Page)에 문제가 있어도

백버튼을 누르고, 계속 이용이 가능하다.
•“크래시가 나지 않을때”의 장단점.
•단점: 

- 금융앱 처럼 보안 절차를 철저히 해야하는 앱에서 Assert를 미리

설계하지 않으면, 크래시가 나지 않은채로 의도하지 않은 동작 가능하다.



- 앱화면에 빨간 에러코드는, 유저들에게 불안이나 잘못되었다는 느낌을

줄 수 있고, 앱을 지울 우려가 있다. => 빠르게 파악 => Hotfix가 필요하다



2. 획기적인 화면 사이의 정보 통신
2. 획기적인 화면 사이의 정보 통신
- Android에서는…
Activity - OnActivityForResult
- ListenerDialog
- ViewModel, ListenerFragment
- EventBusEtc
2. 획기적인 화면 사이의 정보 통신
Activity - OnActivityForResult
- ListenerDialog
- ViewModel, ListenerFragment
단점: 화면을 시작하고, 받는 위치가 다르다. (헤맬 수 있다.)
단점: ViewModel은 본래 View를 위한 모델 관리 용도인데,

이벤트 전달을 위해 사용/비대해질 우려.

Listener와 참조가 끊겼을때 전달되지 않음 (onRestoreInstanceState)
단점: Listener 호출 후 dismiss를 매번 수동으로 해줘야한다. (따로 호출)
2. 획기적인 화면 사이의 정보 통신
그렇다면 Flutter에서는 어떻게 하나요?
2. 획기적인 화면 사이의 정보 통신
함수
2. 획기적인 화면 사이의 정보 통신
Screen A Screen B
Open data param
Returning data
2. 획기적인 화면 사이의 정보 통신
Screen A Screen B Screen A
Open data 

param
Returning

data
2. 획기적인 화면 사이의 정보 통신
Screen A Screen B Screen A
2. 획기적인 화면 사이의 정보 통신
await에서 화면이 열리고, 해당 Screen이 닫힐때까지 코드가 Block된다.

화면이 끝나고 정보를 받게되면 아래에 if (result != null) 코드가 수행된다.
2. 획기적인 화면 사이의 정보 통신
Screen B에서 데이터를 돌려줄때
Push 함수의 Return type
🍀 Android의 Intent, Bundle에 싣기위해 Serializable, Parcelable 구현

Flutter에서는 필요없음. 그냥 객체 그대로 싣고 보낸다. 메모리 주소도 동일



2. 획기적인 화면 사이의 정보 통신
•Provider 사용
•Listener를 사용 가능함 (비추천)
그 외의 방법
3. Thread 스트레스에서 해방
3. Thread 스트레스에서 해방
Android에서는…
Bitmap처리, Network처리 등을 위해
•AsyncTask (Deprecated)
•Thread, Excutors
•Rx (Schedulers.xx() series)
•Coroutine - suspend function
3. Thread 스트레스에서 해방
suspend function은 

coroutine scope 안에서 또는

suspend function 안에서 호출 가능
•Coroutine
3. Thread 스트레스에서 해방
•Flutter Future
sync, async 함수는

서로 원하는 형태로

제약없이 호출 가능.
3. Thread 스트레스에서 해방
•Event Loop이 흐름을 콘트롤, Javascript의 방식
3. Thread 스트레스에서 해방
•Async, Await 방식은 단일스레드 방식으로 동작한다는 의미.

(그러나 통신이나 이미지뷰 처리가 UI를 느리게 하지 않음)

•Parallel 하게 여러 작업을 동시에 수행하려면 

Isolate를 사용하면 된다.



https://medium.com/flutter-community/flutter-dart-async-concurrency-
demystify-1cc739aaae57

http://jpryan.me/dartbyexample/examples/isolates/
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
Android 에서는…
1. Java, Kotlin으로 커스텀뷰 코드 작성
2. attrs.xml 안에 속성 추가
3. Java, Kotlin에서 코드로 attrs 파라미터 추출
4. 코드로 뷰 동적 생성할때를 위해 생성자, 또는 setter생성
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
Write attrs.xml



Extract from attrs
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
왜 이렇게 해야하죠?
=> 레이아웃을 xml로 그리기 때문
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
왜 xml로 해야하죠?
=> 화면 레이아웃 작성할때마다

빌드를 하면 개발이 늦다. (미리보기가 필요)
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
본래 View는 Java 객체
XML로 인해서 불필요한 과정이 생겼다.
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
=> Android Compose 개발중

https://developer.android.com/jetpack/compose/tutorial
그럼 Flutter에서는?
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
필요한
필드 & 생성자
정의
각 필드에 원하는 변수들을 배치. (Primitive, Enum, Object, Function, Widget)

MVVM 처럼 data가 binding되고, 

setState 함수를 통해 값이 바뀌면 알아서 갱신(Build)이 된다.



개별 변수 Observing은 아니지만, 오히려 심플하다.

각 Observable을 관측하는 Observer만 갱신하는 것은 성능상 이점이 있지만,

개발자, 코더 입장에서는 개별적인 변화와/ Observing 여부에 신경쓰고 setValue가 제대로 

호출되었는지 확인하는 불편함이 있는데, 

Flutter에서는 그런 불편함이 사라진다.
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
Hot Reload
Value

Logic 

Layout
Animation
모든 변경을
1초만에
확인 가능하다.
4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
5. 쉽고 직관적인 Animation 처리
Android 에서는…
5. 쉽고 직관적인 Animation 처리
=> 단일 뷰 Animation은 쉽지만, 주변 레이아웃이 같이 변한다면

좀 골치가 아파진다.
1. Animation을 수행할 View를 찾는다.
2. View의 transitionX, alpha, scale의 타겟값을 세팅
3. Duration 세팅
4. Interpolation 세팅
5. start() 함수 수행
그래서 Android 에서는…
1. Constraint Set 변경 - AutoTransition







2. Android Studio 4.0 Motion Editor 개발중
=> 똑같은 Xml을 여러벌을 준비하거나,

코드로 Constraint를 동적으로 변환한다.
5. 쉽고 직관적인 Animation 처리
Flutter에서는?
5. 쉽고 직관적인 Animation 처리
Animation WidgetsImplicit
5. 쉽고 직관적인 Animation 처리
Implicit ?
Implicit Intent: 목적 Targeting만 하면 알아서 동작
5. 쉽고 직관적인 Animation 처리
5. 쉽고 직관적인 Animation 처리
visibleFraction이 60%일때 chartSize = 150이 set

자동적으로 차트막대가 커지는 애니메이션이 시작된다.
Implicit animated widgets - 다양한 기본 위젯들 탑재
https://www.youtube.com/watch?v=IVTjpW3W33s
5. 쉽고 직관적인 Animation 처리
물론 Explicit animation도 지원한다. (Animation Controller)
Let’s subscribe

Youtube Flutter Channel
그러나 웬만하면 Implicit Animations로 구현 가능하다.
5. 쉽고 직관적인 Animation 처리
UI 개발 Framework 끝판왕
Android / Flutter 앱 개발의 큰 차이점 5가지를 통한 

Flutter 총평:
감사합니다.



더 궁금한것이 있다면

=> bs.nam@lawfully.com
자료 및 이미지 출처:
•https://github.com/flutter/flutter/issues/17112
•https://www.jagranjosh.com/articles/relations-and-functions-iit-
jee-important-questions-and-preparation-tips-1455106528-1

•https://medium.com/flutter-community/flutter-threading-
5c3a7b0c065f

•https://www.youtube.com/watch?v=IVTjpW3W33s
•https://medium.com/flutter-community/flutter-dart-async-concurrency-
demystify-1cc739aaae57

•http://jpryan.me/dartbyexample/examples/isolates/

More Related Content

What's hot

웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
JinKwon Lee
 
Apache kafka 확장과 응용
Apache kafka 확장과 응용Apache kafka 확장과 응용
Apache kafka 확장과 응용
JANGWONSEO4
 
[Paper] eXplainable ai(xai) in computer vision
[Paper] eXplainable ai(xai) in computer vision[Paper] eXplainable ai(xai) in computer vision
[Paper] eXplainable ai(xai) in computer vision
Susang Kim
 
잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다
잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다
잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다
Arawn Park
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
Terry Cho
 
Reactjs
Reactjs Reactjs
Reactjs
Neha Sharma
 
일상대화 챗봇 '드림이' 제작기
일상대화 챗봇 '드림이' 제작기일상대화 챗봇 '드림이' 제작기
일상대화 챗봇 '드림이' 제작기
Yejee Choi
 
프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구
Taegon Kim
 
애자일의 모든것
애자일의 모든것애자일의 모든것
애자일의 모든것
KH Park (박경훈)
 
Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기
KwangSeob Jeong
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
Shai Yallin
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님
NAVER D2
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈
용근 권
 
[기본과정] 코드 테스트와 커버리지 기본 교육(개념)
[기본과정] 코드 테스트와 커버리지 기본 교육(개념)[기본과정] 코드 테스트와 커버리지 기본 교육(개념)
[기본과정] 코드 테스트와 커버리지 기본 교육(개념)
SangIn Choung
 
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
NAVER Engineering
 
[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기
[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기
[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기
RyanHKang
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 
INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰
INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰
INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰
Myeongseok Baek
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
Dzmitry Naskou
 

What's hot (20)

웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
Apache kafka 확장과 응용
Apache kafka 확장과 응용Apache kafka 확장과 응용
Apache kafka 확장과 응용
 
[Paper] eXplainable ai(xai) in computer vision
[Paper] eXplainable ai(xai) in computer vision[Paper] eXplainable ai(xai) in computer vision
[Paper] eXplainable ai(xai) in computer vision
 
잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다
잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다
잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
 
Reactjs
Reactjs Reactjs
Reactjs
 
일상대화 챗봇 '드림이' 제작기
일상대화 챗봇 '드림이' 제작기일상대화 챗봇 '드림이' 제작기
일상대화 챗봇 '드림이' 제작기
 
프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구
 
애자일의 모든것
애자일의 모든것애자일의 모든것
애자일의 모든것
 
Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈
 
[기본과정] 코드 테스트와 커버리지 기본 교육(개념)
[기본과정] 코드 테스트와 커버리지 기본 교육(개념)[기본과정] 코드 테스트와 커버리지 기본 교육(개념)
[기본과정] 코드 테스트와 커버리지 기본 교육(개념)
 
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
[네이버오픈소스세미나] Next Generation Spring Security OAuth2.0 - 이명현
 
[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기
[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기
[제3회 스포카콘] [안드로이드] 클린 아키텍처 적용하기
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰
INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰
INFCON2023-지속 가능한 소프트웨어 개발을 위한 경험과 통찰
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 

Similar to Android와 Flutter 앱 개발의 큰 차이점 5가지

안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
YoungSu Son
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
Miyu Park
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기
NAVER D2
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Android
taeinkim6
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
YoungSu Son
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
NAVER D2
 
GDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteGDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's Note
Seok-yong Kim
 
Electron
ElectronElectron
Electron
JUKIJUNG
 
실 사례로 보는 고객 디지털 경험 지키기
실 사례로 보는 고객 디지털 경험 지키기실 사례로 보는 고객 디지털 경험 지키기
실 사례로 보는 고객 디지털 경험 지키기
IMQA
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
NAVER D2
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 
WeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdfWeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdf
janeSim13
 
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기
NAVER D2
 
deview2014
deview2014deview2014
deview2014
yongwoo Jeon
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
SangIn Choung
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
iFunFactory Inc.
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
hyunae lee
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
hyunae lee
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
YoungSu Son
 

Similar to Android와 Flutter 앱 개발의 큰 차이점 5가지 (20)

안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Android
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
GDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteGDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's Note
 
Electron
ElectronElectron
Electron
 
Modern android
Modern androidModern android
Modern android
 
실 사례로 보는 고객 디지털 경험 지키기
실 사례로 보는 고객 디지털 경험 지키기실 사례로 보는 고객 디지털 경험 지키기
실 사례로 보는 고객 디지털 경험 지키기
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 
WeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdfWeAreDevelopers_micro_frontend_framework.pdf
WeAreDevelopers_micro_frontend_framework.pdf
 
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기
 
deview2014
deview2014deview2014
deview2014
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 

Android와 Flutter 앱 개발의 큰 차이점 5가지

  • 1. Android / Flutter 앱 개발의 
 큰 5가지 남반석2019.12.8 차이점
  • 2. 가장 큰 5가지 1. 같은 코드로 iOS 릴리즈 가능하다. 2. Hot Reload 지원 => 개발 시간을 획기적으로 단축. 3. Dart 언어를 사용 (Javascript, Java를 섞어버린) 4. 안드로이드 스튜디오 외에 VS Code로 개발 가능하다. (가볍고 쾌적하 다.) 5. Android는 OS가 그리는 반면, Flutter는 Skia엔진이 그린다. 차이점
  • 4. 오늘 주제는 가장 큰 차이점
  • 7. 크래시가 나지 않는다. •단 Native쪽과 연동 과정에서는 크래시가 발생하기도 한다. •기본 UI Framework에서는 크래시로 앱이 죽지 않는다 1. 크래시가 나지 않는다면 어떤 일이 벌어질까요?
  • 8. 1. 크래시가 나지 않는다. •기본 UI Framework에서는 크래시로 앱이 죽지 않는다 •Widget 안에
 빨갛고 노란
 stacktrace 로그가 보인다.
  • 9. 1. 크래시가 나지 않는다. •기본 UI Framework에서는 크래시로 앱이 죽지 않는다 •Rotating Error Pizza
 
 From - Facebook Group
 “Let's Flutter with Dart”
  • 10. 1. 크래시가 나지 않는다. •발생한 Exception은 IDE 로그로 확인 가능하다.
  • 11. 1. 크래시가 나지 않는다. •다양한 플러그인을 사용할때 
 Android 채널, iOS 채널을 통해 코드가 실행되면 
 Native 코드로 (Java, Kotlin, Swift) 실행이 되고, 크래시 발생 가능.
 
 간혹 Low Level에서 크래시가 발생하기도 한다.
  • 12. 1. 크래시가 나지 않는다. •Fatal signal 11 (C, .so파일 관련 에러)가 발생하면
 분석, 해결이 굉장히 어렵다. •푸시 플러그인 버그: 
 https://github.com/FirebaseExtended/flutterfire/issues/125
  • 13. 1. 크래시가 나지 않는다. 실제 Product에서도 
 크래시가 안나나요?
  • 14. 1. 크래시가 나지 않는다. - Android 1건 (화웨이 기기)
 DAU 250
 MAU 1.5K 최근 30일 크래시 - IOS 0건
 DAU 2.1K
 MAU 12K
 (11월에 Flutter 전환,
 0.04%는 원인불명;;)
  • 15. 1. 크래시가 나지 않는다. 그러면 코드 오류는 
 잡을 수 없나요?
  • 16. 1. 크래시가 나지 않는다. Firebase에서 Crashes 필터 -> Non-Fatal로 바꾸면, 
 위젯이나, 로직 등에서 발생한 에러의 File & Line을 볼 수 있다.
  • 17. 1. 크래시가 나지 않는다. •장점: 사용자가 앱 사용하다가, 특정 Screen(Page)에 문제가 있어도
 백버튼을 누르고, 계속 이용이 가능하다. •“크래시가 나지 않을때”의 장단점. •단점: 
 - 금융앱 처럼 보안 절차를 철저히 해야하는 앱에서 Assert를 미리
 설계하지 않으면, 크래시가 나지 않은채로 의도하지 않은 동작 가능하다.
 
 - 앱화면에 빨간 에러코드는, 유저들에게 불안이나 잘못되었다는 느낌을
 줄 수 있고, 앱을 지울 우려가 있다. => 빠르게 파악 => Hotfix가 필요하다
 

  • 18. 2. 획기적인 화면 사이의 정보 통신
  • 19. 2. 획기적인 화면 사이의 정보 통신 - Android에서는… Activity - OnActivityForResult - ListenerDialog - ViewModel, ListenerFragment - EventBusEtc
  • 20. 2. 획기적인 화면 사이의 정보 통신 Activity - OnActivityForResult - ListenerDialog - ViewModel, ListenerFragment 단점: 화면을 시작하고, 받는 위치가 다르다. (헤맬 수 있다.) 단점: ViewModel은 본래 View를 위한 모델 관리 용도인데,
 이벤트 전달을 위해 사용/비대해질 우려.
 Listener와 참조가 끊겼을때 전달되지 않음 (onRestoreInstanceState) 단점: Listener 호출 후 dismiss를 매번 수동으로 해줘야한다. (따로 호출)
  • 21. 2. 획기적인 화면 사이의 정보 통신 그렇다면 Flutter에서는 어떻게 하나요?
  • 22. 2. 획기적인 화면 사이의 정보 통신 함수
  • 23. 2. 획기적인 화면 사이의 정보 통신 Screen A Screen B Open data param Returning data
  • 24. 2. 획기적인 화면 사이의 정보 통신 Screen A Screen B Screen A Open data 
 param Returning
 data
  • 25. 2. 획기적인 화면 사이의 정보 통신 Screen A Screen B Screen A
  • 26. 2. 획기적인 화면 사이의 정보 통신 await에서 화면이 열리고, 해당 Screen이 닫힐때까지 코드가 Block된다.
 화면이 끝나고 정보를 받게되면 아래에 if (result != null) 코드가 수행된다.
  • 27. 2. 획기적인 화면 사이의 정보 통신 Screen B에서 데이터를 돌려줄때 Push 함수의 Return type 🍀 Android의 Intent, Bundle에 싣기위해 Serializable, Parcelable 구현
 Flutter에서는 필요없음. 그냥 객체 그대로 싣고 보낸다. 메모리 주소도 동일
 

  • 28. 2. 획기적인 화면 사이의 정보 통신 •Provider 사용 •Listener를 사용 가능함 (비추천) 그 외의 방법
  • 30. 3. Thread 스트레스에서 해방 Android에서는… Bitmap처리, Network처리 등을 위해 •AsyncTask (Deprecated) •Thread, Excutors •Rx (Schedulers.xx() series) •Coroutine - suspend function
  • 31. 3. Thread 스트레스에서 해방 suspend function은 
 coroutine scope 안에서 또는
 suspend function 안에서 호출 가능 •Coroutine
  • 32. 3. Thread 스트레스에서 해방 •Flutter Future sync, async 함수는
 서로 원하는 형태로
 제약없이 호출 가능.
  • 33. 3. Thread 스트레스에서 해방 •Event Loop이 흐름을 콘트롤, Javascript의 방식
  • 34. 3. Thread 스트레스에서 해방 •Async, Await 방식은 단일스레드 방식으로 동작한다는 의미.
 (그러나 통신이나 이미지뷰 처리가 UI를 느리게 하지 않음)
 •Parallel 하게 여러 작업을 동시에 수행하려면 
 Isolate를 사용하면 된다.
 
 https://medium.com/flutter-community/flutter-dart-async-concurrency- demystify-1cc739aaae57
 http://jpryan.me/dartbyexample/examples/isolates/
  • 35. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 36. Android 에서는… 1. Java, Kotlin으로 커스텀뷰 코드 작성 2. attrs.xml 안에 속성 추가 3. Java, Kotlin에서 코드로 attrs 파라미터 추출 4. 코드로 뷰 동적 생성할때를 위해 생성자, 또는 setter생성 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 37. Write attrs.xml
 
 Extract from attrs 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 38. 왜 이렇게 해야하죠? => 레이아웃을 xml로 그리기 때문 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 39. 왜 xml로 해야하죠? => 화면 레이아웃 작성할때마다
 빌드를 하면 개발이 늦다. (미리보기가 필요) 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 40. 본래 View는 Java 객체 XML로 인해서 불필요한 과정이 생겼다. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget) => Android Compose 개발중
 https://developer.android.com/jetpack/compose/tutorial
  • 41. 그럼 Flutter에서는? 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 42. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget) 필요한 필드 & 생성자 정의
  • 43. 각 필드에 원하는 변수들을 배치. (Primitive, Enum, Object, Function, Widget)
 MVVM 처럼 data가 binding되고, 
 setState 함수를 통해 값이 바뀌면 알아서 갱신(Build)이 된다.
 
 개별 변수 Observing은 아니지만, 오히려 심플하다.
 각 Observable을 관측하는 Observer만 갱신하는 것은 성능상 이점이 있지만,
 개발자, 코더 입장에서는 개별적인 변화와/ Observing 여부에 신경쓰고 setValue가 제대로 
 호출되었는지 확인하는 불편함이 있는데, 
 Flutter에서는 그런 불편함이 사라진다. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 44. Hot Reload Value
 Logic 
 Layout Animation 모든 변경을 1초만에 확인 가능하다. 4. 만들고 쓰기 쉬운 커스텀뷰 (Widget)
  • 45. 5. 쉽고 직관적인 Animation 처리
  • 46. Android 에서는… 5. 쉽고 직관적인 Animation 처리 => 단일 뷰 Animation은 쉽지만, 주변 레이아웃이 같이 변한다면
 좀 골치가 아파진다. 1. Animation을 수행할 View를 찾는다. 2. View의 transitionX, alpha, scale의 타겟값을 세팅 3. Duration 세팅 4. Interpolation 세팅 5. start() 함수 수행
  • 47. 그래서 Android 에서는… 1. Constraint Set 변경 - AutoTransition
 
 
 
 2. Android Studio 4.0 Motion Editor 개발중 => 똑같은 Xml을 여러벌을 준비하거나,
 코드로 Constraint를 동적으로 변환한다. 5. 쉽고 직관적인 Animation 처리
  • 49. Animation WidgetsImplicit 5. 쉽고 직관적인 Animation 처리
  • 50. Implicit ? Implicit Intent: 목적 Targeting만 하면 알아서 동작 5. 쉽고 직관적인 Animation 처리
  • 51. 5. 쉽고 직관적인 Animation 처리 visibleFraction이 60%일때 chartSize = 150이 set
 자동적으로 차트막대가 커지는 애니메이션이 시작된다.
  • 52. Implicit animated widgets - 다양한 기본 위젯들 탑재 https://www.youtube.com/watch?v=IVTjpW3W33s 5. 쉽고 직관적인 Animation 처리
  • 53. 물론 Explicit animation도 지원한다. (Animation Controller) Let’s subscribe
 Youtube Flutter Channel 그러나 웬만하면 Implicit Animations로 구현 가능하다. 5. 쉽고 직관적인 Animation 처리
  • 54. UI 개발 Framework 끝판왕 Android / Flutter 앱 개발의 큰 차이점 5가지를 통한 
 Flutter 총평:
  • 56. 자료 및 이미지 출처: •https://github.com/flutter/flutter/issues/17112 •https://www.jagranjosh.com/articles/relations-and-functions-iit- jee-important-questions-and-preparation-tips-1455106528-1
 •https://medium.com/flutter-community/flutter-threading- 5c3a7b0c065f
 •https://www.youtube.com/watch?v=IVTjpW3W33s •https://medium.com/flutter-community/flutter-dart-async-concurrency- demystify-1cc739aaae57
 •http://jpryan.me/dartbyexample/examples/isolates/