Top 30+ Flutter Interview Questions and Answers for 2023
https://www.simplilearn.com/flutter-interview-questions-article

 

1. 플러터란?

Flutter 모바일 애플리케이션을 만들기 위한 UI 기반 도구입니다. Flutter를 사용하여 단일 프로그래밍 언어와 단일 코드베이스로 고유하게 컴파일된 모바일 애플리케이션을 만들 수 있습니다. Flutter에서 코딩할 수 있는 올바른 기술 세트를 사용하여 빠르고 멋진 모바일 애플리케이션을 개발할 수 있습니다. Google에서 프레임워크를 개발했으며 코드는 오픈 소스입니다. Flutter 자체는 언어가 아니며 코딩을 위해 Dart 언어를 사용합니다.

Flutter는 IOS와 Android 모두에서 코딩하는 데 사용할 수 있습니다. 최적화는 2D 모바일 앱에 가장 적합합니다. 다음 기능을 사용하여 앱을 만들 수 있습니다.

  • 지리적 위치 (Geolocation)
  • 스토리지 액세스 (Storage access)
  • 카메라 액세스 (Camera access)
  • 네트워크 (Network)
  • 타사 SDKs (Third-Party SDKs)

2. Flutter를 사용하면 어떤 장점이 있나요?

Flutter는 모바일 앱 코딩에 다양한 이점을 제공합니다.

  1. 코드 양 줄이기- Flutter에서 제공하는 Hot reload 기능은 더 빠른 성능을 돕습니다. 앱은 C/C++ 코드로 코딩되어 더 빠른 앱 개발을 위해 가능한 한 기계 코드에 가깝게 만듭니다. Flutter의 위젯 가용성은 코딩에 소요되는 시간을 줄이고 재사용 가능한 코드를 사용합니다.
  2. 교차 플랫폼 개발 - Flutter 코드는 여러 플랫폼에서 사용되어 개발 팀 측의 노력을 줄일 수 있습니다.
  3. 라이브 및 핫 리로딩 - 코드를 더 빠르고 쉽게 작성할 수 있도록 도와줍니다. 코드가 변경되면 쉽게 수정할 수 있습니다.
  4. 네이티브 앱처럼 작동합니다. Flutter 코드는 가능한 기계 코드에 가깝습니다. 이렇게 하면 코드 해석으로 인한 오류가 줄어듭니다. 앱은 기본 환경에서 작동하며 코딩된 앱은 빠르고 사용하기 쉽습니다.
  5. 커뮤니티- Flutter에는 여러분이 가질 수 있는 질문에 도움을 주는 활발한 커뮤니티가 있습니다.
  6. 최소 코드 - Flutter 앱은 Dart 프로그래밍 언어를 사용하여 코딩됩니다. 이것은 개발 속도를 높이고 UI가 빠릅니다. Dart는 매우 빠른 JIT 및 AOT 컴파일을 사용합니다.
  7. 더 빠른 문서화 - 빠르고 잘 구성된 문서가 있습니다. 중앙 보관소는 나중에 참조할 수 있도록 문서를 저장합니다.
  8. 맞춤형 디자인 - 맞춤형 레이어드 아키텍처를 통해 맞춤형 디자인, 더 빠른 렌더링 및 표현력이 풍부한 UI를 디자인할 수 있습니다.

3. Flutter 아키텍처는 무엇입니까?

Flutter에는 3계층 아키텍처가 있습니다.

  • 상위 계층: 상위 계층은 위젯, 애니메이션, 일러스트레이션, 사용자 정의 등과 함께 Dart 프로그래밍 언어로 구성됩니다.
  • 중간 레이어 또는 Flutter 엔진: 이 레이어는 텍스트 표시, 서식 지정, 레이아웃 등을 처리합니다.
  • 하단 레이어 또는 내장 서비스: 이 레이어는 플러그인 또는 패키지를 관리하기 위한 것입니다.

4. Flutter에서 사용할 수 있는 빌드 모드는 무엇입니까?

Flutter는 세 가지 빌드 모드로 구성됩니다.

  1. 디버그 모드 - 이 모드는 장치 또는 시뮬레이터에서 앱을 디버깅하기 위한 것입니다.
  2. 프로필 모드 - 테스트 라운드에서 앱 성능 분석과 함께 일부 디버깅 기능을 사용할 수 있습니다.
  3. 릴리스 모드 - 이 모드는 앱을 배포할 때 사용됩니다. 이 모드는 더 빠른 성능을 위한 것입니다. 이 모드에서는 코드를 디버깅하거나 편집할 수 없습니다.

5. Dart 프로그래밍 언어는 무엇입니까?

Dart는 C 언어 와 같은 구문을 사용하는 객체 지향 프로그래밍 언어 입니다 . 이 언어는 오픈 소스이며 2011년 Google에서 개발했습니다. 이 언어는 모바일 앱 프런트엔드를 코딩하기 위해 개념화되었습니다. 이 앱은 프런트엔드 사용자 인터페이스를 코딩하는 데 사용됩니다. Flutter 앱은 Dart 프로그래밍 언어를 사용합니다.

6. Flutter에 Dart 언어가 필요한가요?

Flutter를 사용하려면 Dart 언어를 알아야 합니다. Flutter 애플리케이션은 휴대폰 앱 코딩에 Dart 언어를 사용합니다.

7. Flutter의 위젯은 무엇인가요?

Flutter 앱은 위젯을 사용하여 휴대폰 애플리케이션을 코딩합니다. 위젯을 사용하여 거의 Flutter에서만 빌드하게 됩니다. 위젯은 앱의 보기를 정의합니다. 코드를 변경하면 위젯 코드가 자동으로 조정됩니다. 위젯은 앱의 최종 디자인을 얻기 위해 서로 중첩됩니다. 이는 위젯이 앱이 코딩되는 기반임을 의미합니다.

8. Flutter 앱에 가장 유용한 편집기는 무엇입니까?

Flutter 도구는 플러그인을 사용하여 휴대폰 앱을 코딩합니다. 플러그인은 Dart 코드 컴파일, 코드 분석 및 앱 개발에 도움이 될 수 있습니다. IDE 개발에 사용되는 일부 Flutter 도구는 다음과 같습니다.

  • Visual Studio
  • Android Studio
  • Xcode
  • IntelliJ IDEA
  • Eclipse
  • Emacs

9. Flutter의 패키지와 플러그인은 무엇입니까?

유사한 유형의 클래스, 인터페이스 및 하위 패키지는 Flutter 또는 기타 객체 지향 언어의 패키지로 알려져 있습니다. 패키지와 플러그인은 코더의 노력을 줄이기 위해 개발에 사용됩니다. 코더는 모든 것에 대한 코드를 작성할 필요가 없으며 패키지와 플러그인을 사용하여 코딩 노력을 줄일 수 있습니다.

패키지와 플러그인의 차이점은 분입니다. 패키지는 새로운 구성 요소 또는 Dart 언어로 작성된 코드입니다. 반면에 플러그인은 기본 코드를 사용하여 더 많은 기능을 허용합니다. 때로는 두 용어가 같은 것으로 혼동되기도 하지만 미세한 차이가 있습니다.

10. Flutter를 사용하는 인기 있는 앱이 있습니까?

Flutter를 사용하는 인기 있는 앱이 많이 있습니다. 일부 앱은 다음과 같습니다.

  • Reflectly
  • Google Ads
  • Alibaba
  • Tencent
  • Birch Finance

그리고 더 많은. 모바일 애플리케이션에서 Flutter의 사용률은 매우 높습니다. 

11. Flutter 사용의 장점은 무엇입니까

  • Flutter는 Flutter의 코드 핫 리로드 기능이 제공하는 더 빠른 성능과 함께 유연성과 표현력이 풍부한 UI를 제공합니다. 
  • 다양한 사용자가 Flutter 코드를 사용하여 웹 애플리케이션에 액세스하고 국제화할 수 있습니다.
  • Flutter 코드는 Dart의 기본 컴파일러를 사용하여 ARM 머신 코드로 컴파일되므로 Flutter 위젯은 Android  iOS 모두에서 기본 성능을 제공합니다 .
  • Flutter는 더 빠른 배포, 맞춤형 디자인, 더 빠른 문서화, 라이브 및 핫 코딩, C/C++를 통한 최소한의 코딩을 제공합니다.

12. Flutter 아키텍처 설명

Flutter 아키텍처는 3개의 레이어로 구성됩니다.

  1. 상위 계층: 위젯, 애니메이션, 일러스트레이션, 사용자 정의 등을 포함한 Dart 프로그래밍 언어가 있습니다. 
  2. 중간 레이어: 텍스트 표시, 서식 지정 및 레이아웃에 사용되는 Flutter 엔진이라고도 합니다. 
  3. 하단 레이어: 빌트인 서비스라고도 하며 플러그인 또는 패키지를 관리하는 데 사용됩니다. 

13. Flutter에서 사용할 수 있는 빌드 모드는 무엇입니까?

Flutter에는 디버그 모드, 프로필 모드 및 릴리스 모드의 3가지 빌드 모드가 있습니다. 

14. Dart 프로그래밍 언어는 무엇입니까? 자세히 설명하십시오.

Dart 프로그래밍 언어에 대해 모른다면 Flutter 인터뷰 질문에 대한 준비가 불완전합니다. Flutter는 Dart 프로그래밍 언어 없이는 존재하지 않기 때문입니다. Dart 프로그래밍 언어는 객체 지향, 오픈 소스이며 C 언어의 구문과 매우 유사하며 2011년 Google에서 개발했습니다.

Dart 프로그래밍 언어의 특징:

  • Dart는 선언적이며 프로그래밍 방식이므로 개발자가 손쉽게 레이아웃을 매우 쉽게 읽고 시각화할 수 있습니다. 
  • Dart는 클래스, 인터페이스 및 함수와 같은 기본 프로그래밍 개념은 물론 배열, 제네릭 및 선택적 유형 지정과 같은 데이터 구조를 복제하는 컬렉션을 지원합니다.
  • Dart 코드는 JavaScript에 비해 몇 배 더 빠르게 실행됩니다.
  • Dart 가상 머신(VM)은 JIT(Just-in-Time) 및 AOT(Ahead-of-Time) 컴파일러를 모두 사용하여 코드 실행 시간을 줄이고 더 나은 성능을 제공합니다.
  • Dart는 객체 지향 프로그래밍 인터페이스로 인해 복잡한 애플리케이션을 생성하는 동안 매우 확장 가능하고 안정적입니다.

15. Flutter의 한계는 무엇입니까?

다음은 플러터의 제한 사항입니다.

  • 타사 라이브러리 부족
  • 더 큰 릴리스 크기 
  • Flutter는 C#이나 C-Sharp 및 JavaScript만큼 발전되지 않은 Dart 언어와 함께 작동합니다.
  • Google에서 개발한 iOS 개발자에게는 사용자 친화적이지 않으며 Apple 기기의 문제를 해결하는 데 시간이 걸립니다. 

16. Flutter 앱에 가장 유용한 편집기

Flutter 앱에 가장 유용한 편집기는 Visual Studio, Android Studio, Xcode, IntelliJ IDEA, Eclipse, Vim 및 Emacs입니다.

17. Flutter의 위젯은 무엇인가요?

Flutter의 위젯은 앱의 최종 디자인을 얻기 위해 서로 중첩됩니다. 위젯은 휴대폰 애플리케이션을 코딩하는 데 사용됩니다.

18. Flutter를 사용하는 인기 있는 앱은 무엇입니까?

Flutter를 사용하는 가장 인기 있는 앱은 Reflectly, Google Ads, Alibaba, Tencent, Birch Finance, Coach Yourself 및 Watermaniac입니다. 일반적으로 Flutter는 단일 코드베이스에서 또는 고급 브랜드 디자인으로 Android, iOS, Linux, Mac 및 웹 애플리케이션을 개발하는 데 사용됩니다.

19. Flutter를 배우기 위한 리소스는 무엇입니까?

Google에서 오픈 소스로 제공되는 Flutter Documentation에서 flutter를 배울 수 있습니다. 

20. Flutter는 어떤 기술로 구축되었나요?

Flutter는 C, C++, Skia - 2D 렌더링 엔진 및 Dart 객체 지향 언어를 사용하여 구축되었습니다. 

21. flutter에서 runApp()과 main()의 차이점.

main()

  • 프로그램을 시작할 때 사용하는 함수입니다. 
  • Flutter에서는 main() 함수 없이 프로그램을 작성하는 것이 불가능합니다.  

runApp()

  • 화면에 렌더링할 위젯 트리의 루트로 화면에 연결된 위젯을 반환하기 위해 사용합니다. 
  • 이 기능을 메인 기능이라고 하며 앱의 드라이버이기도 합니다. 

22. 앱 상태는 무엇입니까?

앱 상태는 공유 상태 또는 애플리케이션 상태입니다. 앱의 여러 섹션에서 앱 상태를 공유하고 동일한 방식으로 사용자 세션을 유지할 수 있습니다. 앱 상태에는 로그인 정보, 사용자 기본 설정, 전자 상거래 장바구니, 소셜 네트워킹 알림 등과 같은 활동이 포함됩니다. 

23. Flutter의 패키지와 플러그인은 무엇인가요?

패키지

  • Flutter에서 네이티브 코드로 사용됩니다. 
  • 그것은 장치의 더 많은 사용성을 가능하게 합니다.  

플러그인

  • dart 프로그래밍 언어로 작성된 새로운 코드 또는 구성 요소입니다.  
  • 플러그인과 패키지 간의 특정 구분은 새 패키지를 만드는 동안에만 이루어집니다.  


24. 플러터의 Key는 무엇을 의미합니까?

Flutter의 Key는 위젯, 요소 및 시맨틱 노드의 식별자인 반면 GlobalKeys 및 LocalKeys는 Key의 하위 클래스입니다.

25. Flutter에서 Key 사용?

  • Flutter의 키는 주로 위젯 트리에서 수정된 위젯의 상태를 보존하는 데 사용됩니다.
  • 동일한 유형과 정의된 상태를 갖는 위젯 모음을 재구성하고 수정하는 데 사용됩니다.
  • 상태 비저장 위젯으로만 구성된 트리는 수정하지 않습니다. 

26. Flutter의 컨테이너 클래스는 무엇입니까?

Flutter의 컨테이너 클래스는 여러 자식 위젯을 수용하고 크기, 패딩 및 배경색을 통해 효율적으로 관리할 수 있는 용량을 가진 위젯입니다.

27. Flutter 인스펙터란 무엇입니까?

Flutter Inspector는 위젯의 청사진과 Flutter의 속성을 시각화하는 데 사용되는 강력한 도구입니다.

28. Flutter Inspector의 이점.

  • Flutter Inspector는 위젯 트리에서 위젯 모드를 선택할 수 있습니다. 
  • 토글 플랫폼을 제공합니다.
  • 페인트 기준선을 표시하고 페인트를 디버그합니다.
  • 위젯을 새로 고치고 성능 오버레이를 표시하거나 숨길 수 있습니다.

29. Dart의 다양한 유형의 스트림

Dart에는 단일 구독 스트림과 브로드캐스트 스트림의 두 가지 유형의 스트림이 있습니다.  

단일 구독 스트림

  • 더 큰 전체 내의 이벤트는 단일 구독 스트림으로 순차적으로 전달됩니다. 
  • 수신된 문제에 있는 이벤트나 파일 읽기에 사용됩니다. 
  • 이벤트를 트리거하는 시퀀스 전체에 하나의 리스너만 있습니다. 그렇지 않으면 이벤트가 트리거되지 않습니다. 

브로드캐스트 스트림

  • 처음에는 리스너가 이벤트를 구독해야 하며, 그런 다음 이러한 스트림만 구독자에게 이벤트를 전달하고 구독자는 즉시 이벤트 수신을 시작할 수 있습니다.  
  • 이벤트에 대한 여러 리스너가 동시에 있습니다. 게다가, 이전 구독을 취소한 후에도 이벤트를 다시 들을 수 있습니다.

30. 언제 mainAxisAlignment와 crossAxisAlignment를 사용해야 합니까?

crossAxisAlignment 및 mainAxisAlignment는 선택에 따라 행 및 열 위젯이 자식과 정렬되는 방식을 제어하는 ​​데 사용됩니다. 

mainAxisAlignment

  • mainAxisAlignment에서 행은 가로로 실행되고 열은 세로로 실행됩니다.

교차 축 정렬

  • crossAxisAlignment에서 행은 세로로 실행되고 열은 가로로 실행됩니다. 

31. SizedBox와 Container의 차이점은 무엇입니까?

SizedBox

  • Flutter의 SizedBox 위젯에는 지정된 크기가 있습니다. 
  • SizedBox에서는 위젯의 색상이나 장식을 설정할 수 없습니다. 
  • 특정 너비 또는 높이를 가진 하위 위젯에만 사용할 수 있습니다.

컨테이너

  • Flutter의 컨테이너는 너비, 높이, 패딩, 배경색 등을 효율적으로 관리하기 위해 여러 하위 위젯을 포함하는 상위 위젯입니다. 
  • 배경 스타일이 필요한 위젯이 있는 경우 컨테이너 위젯에 래핑할 수 있는 색상, 모양 또는 크기 제한이 있을 수 있습니다.

32. 핫 리스타트와 핫 리로드를 구분합니까?

핫 리스타트

  • 보존된 상태 값을 파기하여 상태 값을 기본값으로 설정합니다. 따라서 응용 프로그램에서 상태 값을 사용하는 경우 핫 재시작할 때마다 개발자는 완전히 컴파일된 응용 프로그램을 가져오고 모든 상태는 기본값으로 설정됩니다.
  • Hot Restart는 완전히 새로운 유형의 코드를 사용하여 앱 위젯 트리를 다시 빌드합니다.
  • Hot Restart는 Hot reload보다 훨씬 더 많은 시간이 걸립니다.

핫 리로드

  • 명령 프롬프트 또는 터미널에 작은 r 키 조합이 있습니다.
  • 새로 추가된 코드를 매우 빠르게 컴파일하여 Dart 가상 머신으로 보냅니다. Dart 가상 머신 코드가 업데이트되면 핫 리로드 기능이 위젯을 포함한 앱 UI를 업데이트합니다.  
  • 핫 리로드는 핫 리스타트 기능에 의해 보존되는 상태 값이 있는 경우 애플리케이션을 업데이트하지 않습니다.

33. 추가

안드로이드에서 context 객체는?

안드로이드 프로그래밍에서 "컨텍스트(Context)"란 애플리케이션의 현재 상태와 정보를 담고 있는 객체입니다. 안드로이드 앱은 다양한 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버 등 4대 컨포넌트)로 구성되며, 각각의 컴포넌트는 실행되는 환경에 대한 정보를 알아야 정확한 동작을 수행할 수 있습니다. 이런 환경 정보를 담고 있는 것이 바로 컨텍스트입니다.

컨텍스트는 애플리케이션의 리소스(레이아웃, 이미지, 문자열 등)에 접근하고, 액티비티를 실행하거나 서비스를 시작하는 등의 작업을 수행할 때 필요한 정보를 제공합니다. 또한 시스템 서비스에 접근하여 기기의 상태나 설정에 대한 정보도 얻을 수 있습니다.

안드로이드에서 컨텍스트 객체는 android.content.Context 클래스의 인스턴스로 표현됩니다. 각각의 컴포넌트는 자체적인 컨텍스트를 가지며, 이를 통해 애플리케이션의 다양한 자원과 시스템 서비스에 접근할 수 있습니다.

Flutter에서 BuildContext 객체는?

https://api.flutter.dev/flutter/widgets/BuildContext-class.html

 

BuildContext class - widgets library - Dart API

A handle to the location of a widget in the widget tree. This class presents a set of methods that can be used from StatelessWidget.build methods and from methods on State objects. BuildContext objects are passed to WidgetBuilder functions (such as Statele

api.flutter.dev

FAQ

1. 플러터는 어떤 용도로 사용되나요?

Flutter는 하나의 프로그래밍 언어와 단일 코드베이스로 빠르고 아름답고 고유하게 컴파일된 모바일 애플리케이션을 만드는 데 사용됩니다.

2. Flutter는 SDK인가요?

예, Flutter는 SDK입니다.

3. Flutter 면접은 어떻게 준비하나요?

Flutter 프레임워크를 완전히 이해하려면 Google에서 개발하고 오픈 소스 형식으로 무료로 제공되는 Flutter 문서부터 시작할 수 있습니다. 이것은 여러분의 기본 사항을 다루고 Flutter 프레임워크의 안팎을 이해하는 데 도움이 될 것입니다. 그런 다음 Flutter 인터뷰를 에이스하기 위해 Flutter에 대한 질문 목록을 시작할 수 있습니다.

4. Flutter는 프런트엔드인가요, 백엔드인가요?

Flutter는 프론트엔드 개발 프레임워크입니다.

 

생산성을 높히는 도구를 고민하다가 우연히 발견하게된 고마운 패키지 Flutter Preview

 

 

device_preview | Flutter Package

Approximate how your Flutter app looks and performs on another device.

pub.dev

에러 로그

FAILURE: Build failed with an exception.                                
                                                                        
* Where:                                                                
Build file '/Users/i-bong/development/flutter_project/fearless_plus/android/app/build.gradle' line: 74
                                                                        
* What went wrong:                                                      
A problem occurred evaluating project ':app'.                           
> path may not be null or empty string. path='null'                     
                                                                        
* Try:                                                                  
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
                                                                        
* Get more help at https://help.gradle.org

 

 

해결방법

 

프로젝트

android/app/build.gradle

 

주석처리

// signingConfigs {

// release {

// keyAlias keystoreProperties['keyAlias']

// keyPassword keystoreProperties['keyPassword']

// storeFile file(keystoreProperties['storeFile'])

// storePassword keystoreProperties['storePassword']

// }

// }

// buildTypes {

// release {

// signingConfig signingConfigs.release

// }

// }

 

원인

git push시에 ignore로 인해 해당 파일이 누락되었다.

⛏ 개인적인 위키 용도로 작성되었음.

글이 불친절함. 공식 문서를 보고 설치 하기를 추천함.

사전 준비

  1. flutter sdk download (https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_2.2.3-stable.zip)
  2. document 참고 해서 순서 대로 진행 (https://flutter.dev/docs/get-started/install/macos)

설치 진행시 참고 사항

  • android studio -> plugin -> flutter install
  • 'flutter doctor' 명령어 실행

    Error Message -> "flutter doctor --android-licenses"
    Android studio -> Preferences -> Android SDK -> SDK Tools -> 'Android SDK Command-line Tools' 설치

  • 'flutter doctor --android-licenses' 명령어 실행 -> Accept? (y/N): y
  • Last. 'flutter doctor' -> No issues found! 출력 확인

처음 플러터를 알게 된 건 2020년 봄 쯤이였다.

정확히 어떤 경로로 처음 알게 되었는지는 생각나지 않지만 첫 인상 부터 임팩트 있었다.

그때는 사이드 프로젝트로 시작한 서버 API 설계 삽질에 땀을 삐질삐질 흘리고 있던 시기라 바로 배우지 못했다.

 

여담이지만,

액션스크립트(AS3.0)를 이용해서 개발을 오래 해오던 친한 형이

회사 사정상 퇴사를 하게 되었고 1인 개발자로 전향을 준비하고 있었다.

 

AS 3.0은 Adobe Flash 기반으로 한 크로스 플랫폼을 이다.

그 형에게 잘 맞을 것 같아 추천해 주었고, 지금까지 잘 사용하고 계신다. ( 뿌듯 😅 )

 


올해 4월로 기억한다.

유튜브에서 추천영상으로 꼬북좌(브레이브걸스 유정)을 처음 봤던게.

 

어떻게 저렇게 "찐텐"으로 웃으며 공연할 수 있을까 하는 생각에 덩달아 기분이 좋아졌다.

아이돌 노래를 좋아하긴 커녕 싫어하는 쪽에 가까운 나였지만, 브레이브걸스 만큼은 눈길이 갔다.

무명과 같았던 어려운 시절의 개인 인스타 영상을 보면서, 점점 찐팬이 되어 갔던 것 같다.

 

브레이브걸스를 응원하기 위해 내가 할 수 있는게 뭘까 생각 하던중,

화력이 뜨겁기로 소문난 디시인사이드(dcinside.com) 브레이브 갤러리를 방문하게 되었다.

 

그 곳에선 밤마다 경매(?)가 열리고 있었다.

 

댓글엔 50 ... 60... 100 .. 250... 250낙찰...

뭐지??

 

한정판 사인 앨범 같은 굿즈를 상품으로 경매를 해서

낙찰된 금액으로 도시락 조공이나, 앨범공구 등

브레이브걸스 이름으로 자선 단체 후원하기 같은 것들을 하게된다.

 

대다수의 팬층이 30~40대 직장인이라서 낮이나 이른 저녁에 이런 경매가 열리게 되면

참여하고 싶어도 못하는 유저들이 많았다.

 

그들은 그것을 " 날치기 " 라고 부르고 있었다. 🤣

 

그래, 이거다.

 

경매글이 올라오면 모바일 어플로 노티메시지를 보내주고 링크를 걸어 해당글로 갈 수 있도록 만들자.

 

- 관련 영상

- 스케쥴

- 실시간 차트

- 멤버 프로필

 

브레이브걸스에 의한 브레이브걸스를 위한 브레이브걸스 어플리케이션을 만들어보자!

 

그리고 생각난게 바로 플러터였다.

플러터로 동시에 Android와 iOS를 출시하자!

 

바로 와이어프레임을 만들기 시작했다.

일주일 정도가 흘렀을까?

와이어프레임과 기능 정의는 잡혔는데...

욕심이 났다.

 

한달 뒤면 새로운 앨범으로 컴백을 한다는데, 그 전에 만들고 싶었기 때문이다.

 

그렇게 무작정 커뮤니티에 글을 올린다.

어플의 취지와 와이어 프레임을 올렸고 개발자 외에도 "덕질 전문가"도 모집했다.

팬 활동을 처음 하는 나는 생소한게 많았기 때문이다.

 

그렇게 오픈채팅방엔 10명 남짓 모이게 된다...

모두 현업 10년차 이상 아재들이였다.

그렇게 판이 커지게 되었다.

 

포지션 분배 부터하고 4개의 팀으로 나뉘어 졌다.

- 기획/디자인

- 클라이언트

- 서버

- 마케팅/덕질 자문

 

일주일에 2번씩 2~3시간 가량 회의를 진행했다.

나머지 시간에도 오픈채팅방은 뜨겁게 달아올랐다.

 

서버인프라는 AWS를 이용해 LEMP으로 플랫하게 구성하고 서버팀에게 인계했다.

 

서버팀은 DB 모델링을 빠르게 시작했고, 필요한 API들을 만들어 갔다.

나를 포함한 프론트팀은 디자인이 넘어올 때 까지 프레임을 만들고 더미 데이터로 초기 작업을 시작했다.

 

프론트팀이 2명으로 시작했지만,

그 중 한명은 현생의 바쁨으로 조용히 잊혀져 갔다. 또르르... 😭

 

나는 백수이기 때문에 온전히 하루를 쓸 수 있었다.

충분히 커버가 가능했기 때문에 프로젝트에는 지장이 없었다.

 

고마웠던건 현업에서 잔뼈가 굵은 선배들이 현업 경험을 토대로

우리 프로젝트에 쓰면 좋을 SaaS들을 추천해줬고

그 덕분에 수월하게 일처리를 할 수 있었다.

 

디자이너와 함께 일하는 것도 너무 재밌었다.

평소 디자인에도 관심이 많았던 나는 함께 일하게 되면서 AdobeXD를 익히게 되었다.

디자이너님은 중견 기업 과장님 이신데 소통이 잘되는 개발자라며 칭찬해 주셨다😅

 

그렇게

첫 커밋을 한지 딱 28일이 지나고 드디어 스토어에 출시 승인이 완료되었다.

iOS도 빠르게 승인되어 3일 후 두개의 플랫폼에 모두 출시 되었다.

 

6월 15일 브레이브걸스의 컴백 D-2 드디어 피어레스 플러스(Fearless +)가 탄생되었다.

 

반응은 뜨거웠다.

하루만에 800명이 다운받았고 3일이 지나자 다운로드 수는 1800명이 되었다.

 

지금은 나머지 맴버들에게 앱을 이관했고,

이후 유지보수를 위해 네이트브로 개발 되어 운영 중이다

 

처음 접해본 플러터와 dart로 구글신에게 애원하며 만든 첫 앱이 너무나 자랑스럽다.

 

그 동안 나름 잡부 마인드로 이거 저거 배워왔던 것 덕분에 서비스 전반적인 리딩을 할 수 있었고

운좋게도 현업 선배들과 함께 작업 하게 되어 배우고 느낀 것들이 참 많은 프로젝트 였다.

 

앞으로 프로젝트를 진행할 때 엄청난 도움이 될 것 같다.

 

 

 

피어레스 플러스 만나러 가기

 

 

 

 

플러터와 안드로이드간 API통신을 하기 위한 채널을 구현해 봤다

 

플러터와 안드로이드 플랫폼를 연결하는 채널 구현 요약

 

1. 플러터에서 MethodChannel 객체를 고유한 채널명으로 만들어 준다

1-1. 안드로이드에서 만들어둔 메서드를 invoke(호출)한다

static const platform = const MethodChannel('atanasio.dev/method'); //채널명은 고유해야 한다

Future<void> getBatteryLevel() async {
    try {
      final int result = await platform.invokeMethod('getBatteryLevel'); // 안드로이드에서 작성한 메서드 invoke
      _batteryInfo = '$result'; // int to String

    } on PlatformException catch (e) {
      print('error : ${e.message}');
    }
  }

  Future<void> getAndroidVersionName() async {
    try {
      final String result = await platform.invokeMethod('getAndroidVersion');
      _androidVersion = '$result';

    } on PlatformException catch (e) {
      print('error : ${e.message}');
    }
  }

  Future<void> getAndroidModelName() async {
    try {
      final String result = await platform.invokeMethod('getAndroidModelName');
      _androidModelName = '$result';

    } on PlatformException catch (e) {
      print('error : ${e.message}');
    }
  }

 

2. 안드로이드에서 다음 코드를 준비한다

package ...

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Build.*

class MainActivity : FlutterActivity() {
  private val CHANNEL = "atanasio.dev/method" // 플러터에서 만든 채널명과 일치해야 한다.

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
      super.configureFlutterEngine(flutterEngine)
      MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
      // 플러터 호출 메서드 분기처리
        when (call.method) {
          "getBatteryLevel" -> { // 플러터에서 호출한 메서드 * invokeMethod('getBatteryLevel');
            val batteryLevel = getBatteryLevel() // 함수 호출
            if (batteryLevel != -1) result.success(batteryLevel) // 성공시 플러터로 콜백
            else result.error("UNAVAILABLE", "Battery level not available.", null)
          }
          "getAndroidVersion" -> {
            val androidVersionCode = getAndroidVersion()
            if (androidVersionCode != null) result.success(androidVersionCode)
            else result.error("UNAVAILABLE", "Android Version not available.", null)
          }
          "getAndroidModelName" -> {
            val modelName = getAndroidModelName()
            if (modelName != null) result.success(modelName)
            else result.error("UNAVAILABLE", "Android deviceName not available.", null)
          }
          else -> result.notImplemented()
        }
      }
    }
    
    // 배터리 값 구하기 (공식문서 예제)
    private fun getBatteryLevel(): Int {
      val batteryLevel: Int
      if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
        val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
      } else {
        val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
        batteryLevel = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
      }
      return batteryLevel
    }
    
	// 안드로이드 버전( 엔드유저용 )
    private fun getAndroidVersion(): String {
      return VERSION.RELEASE
    }

	// 모델명
    private fun getAndroidModelName(): String {
      return MODEL
    }
  
}

 

플러터의 UI 코드 부분은 생략 하였습니다

필요하신분은 댓글로 요청해 주세요

728x90

 

 

 

나는 하나의 채널명으로 여러개의 메서드를 만들어 사용했다.

기기 기본정보에 관한 메서드였는데, 

네이밍을 "atanasio.dev/androidDeviceInfo" 로 했으면 좋았을 것 같다.

 

값들이 null로 나와 당황했었는데

플러터에서만 빌드를 해서 그랬던것 같다

안드로이드에서 빌드를 하니 해결되었다

 

 


 

 

pub.dev에 퍼블링싱 되어 있는 패키지들이

대부분 채널을 이용해서 만들어 진걸 알수 있었다.

 

안드로이드의 대표적인 내부저장소 SPF

 

 

느낀점

- pub.dev에 이미 많은 패키지들이 존재한다는걸 알게되었다.

  이것들이 채널링을 통해 만들어졌다는걸 알게되었다.

 

- ndk를 이용하는것도 재밌을것 같다.

 

- 다음엔 플러터에서 카메라 필터효과 주는걸 구현해 봐야겠다.

✋ WARNING

글을 시작하기 전, 당부 말씀드립니다.

이 포스팅은 잘못된 개념을 전달할 수 있으며, 개인적으로 공부한 내용을 적어놨습니다.

댓글로 틀린 내용이 있으면 지적질 피드백해주세요!!

 

 

안녕하세요 오늘도 좋은 하루입니다!

플러터 기초 개념 정리 중인데 피드백 부탁 글? 남겨 보아요 ㅎㅎ
stateless와 stateful가 따로 존재하는 개념을 정리하고 있습니다.

(stateful만 있으면 되지 왜 두 개를 만들어 뒀을까 하는 의문에서 시작)

1. 플러터는 모든 위젯을 직접 그린다. ( 스키아 엔진 )
2. Stateful 보다 Stateless이 드는 비용이 적다. 랜더링 속도가 빠르고. 한 번만 그린다. ( 라이프사이클이 단순함 )
3. 비용이란, 플러터가 위젯을 그리는 공수이다. 
4. 사용자 이벤트가 없는 위젯까지 Sateful로 만들면 굳이 멀쩡히 그려 논 걸 버리고 다시 그려야 한다.
5. Stateless 위젯으로 부모 위젯을 만들고 Stateful이 필요한 컴포넌트들만 따로 만들어 사용한다.
6. 이런 이유 등을 반영해서 비즈니스 로직과 컴포넌트를 분리한 Bloc 패턴이 등장했다.

피드백 진짜 감사히 받겠습니다!
예)
-> 6번은 OOO 보다 OOO이라고 보는 게 맞아요 더공부하세요!
-> 2번 내용은 OOO 해서 잘 정리된 것 같아요

+ Recent posts