> For the complete documentation index, see [llms.txt](https://augusstt-note.gitbook.io/aug-note/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://augusstt-note.gitbook.io/aug-note/1-flutter/flutter-operation-process.md).

# Flutter Operation Process

앱 개발 플랫폼에는 Android와 iOS가 있으며, 각각 고유한 운영체제 위에 독립적으로 구축되어 있다.\
이에 따라 앱을 개발하기 위해서는 각 운영체제가 요구하는 개발 환경과 규격에 맞춰 별도로 개발을 진행해야 한다.

그러나 Flutter를 활용하면 하나의 코드베이스로 Android와 iOS 모두에서 동작하는 앱을 효율적으로 개발할 수 있어,\
플랫폼별 개발에 소요되는 시간과 비용을 크게 절감할 수 있다.

Flutter가 어떻게 이러한 개발 방식을 가능하게 하는지 이해하기 위해, 먼저 Flutter의 작동 원리를 살펴보자.

***

### iOS와 Android의 작동 방식

Flutter의 구조를 이해하기 위해, 먼저 기존 iOS와 Android 앱이 어떻게 작동하는지를 살펴볼 필요가 있다.

#### iOS

iOS는 네이티브 언어인 Swift(또는 Objective-C)를 사용해 앱을 개발한다.\
개발된 앱은 iOS가 제공하는 네이티브 API(SwiftUI, UIKit)를 직접 호출하여 화면을 그리거나 시스템 기능을 제어한다.

작성된 코드는 컴파일 과정을 거쳐 iOS 디바이스 위에서 직접 실행되며,\
모든 UI 요소와 동작은 iOS가 자체적으로 제공하는 렌더링 엔진에 의해 처리된다.

#### Android

Android는 Kotlin 또는 Java를 사용해 앱을 개발한다.\
개발된 코드는 Android SDK를 통해 Android OS가 제공하는 네이티브 API를 호출하여 동작한다.

빌드된 앱은 Dalvik 또는 ART(Android Runtime) 위에서 실행되며,\
Android OS의 자체 렌더링 엔진을 통해 화면을 구성하고 처리한다.

> 📌 **Android SDK**: Android 앱 개발을 위한 도구 모음. API, 라이브러리, 빌드 도구 등을 포함한다.\
> 📌 **ART (Android Runtime)**: Android 앱을 실행하는 런타임 환경. Android 5.0 이후 Dalvik을 대체하여 기본 런타임으로 사용되고 있다.

***

이처럼 iOS와 Android는 각각 독립된 방식으로 앱을 실행하고 렌더링을 처리하기 때문에,\
하나의 앱을 두 플랫폼에 맞게 별도로 개발해야 하는 번거로움이 존재했다.

하지만 Flutter는 이러한 구조적 한계를 넘어, 단일 코드베이스로 양 플랫폼 모두에서 구동할 수 있는 새로운 접근 방식을 제시했다.

***

### Flutter의 작동 방식

Flutter는 각 운영체제의 네이티브 API를 사용하지 않고,\
자체 렌더링 엔진을 통해 화면을 직접 그리는 방식을 채택하고 있다.

조금 더 구체적으로 말하면, Flutter는 Dart 언어로 작성된 코드를 Skia 그래픽 엔진을 통해 렌더링하여 UI를 화면에 직접 그린다.\
이 과정을 통해 Flutter는 운영체제에 관계없이 일관된 UI/UX를 제공할 수 있다.

> 📌 **Skia**: 구글이 개발한 오픈소스 2D 그래픽 렌더링 엔진. Chrome, Android, Flutter 등 다양한 제품에서 사용되고 있다.

***

### Flutter 내부 작동 방식: `flutter run` 이후 과정

이제 본격적으로 Flutter가 내부적으로 어떻게 동작하는지 자세히 살펴보자.

Flutter에서 Dart로 작성한 코드를 실행하기 위해 터미널에 `flutter run` 명령어를 입력하면, 다음과 같은 과정이 순차적으로 진행된다.

#### 1. 프로젝트 의존성 확인

Flutter CLI는 프로젝트 내 `pubspec.yaml` 파일을 확인하여 필요한 패키지 의존성을 검토한다.

이때, 의존성 업데이트나 설치가 필요한 경우 `flutter pub get` 명령어를 통해 패키지를 설치한다.

> 📌 **pubspec.yaml**: Flutter 프로젝트의 메타데이터(앱 이름, 버전 등)와 필요한 패키지 의존성을 정의하는 파일.

#### 2. 코드 분석 및 빌드 초기화

Flutter는 **Dart Analyzer**를 이용해 프로젝트의 Dart 코드를 검사한다.

코드에 문제가 없으면, 빌드를 준비하기 위해 프로젝트를 초기화하고, Android/iOS 등 각 운영체제(OS)에 필요한 설정을 적용한다.

> 📌 **Dart Analyzer**: 코드에 문법 오류나 타입 오류가 있는지 정적 분석을 수행하는 도구.

#### 3. 컴파일 및 번들 패키징

Debug 모드에서는 JIT(Just-In-Time) 컴파일을 사용하여 Dart 코드를 빠르게 컴파일한다.\
이 덕분에 앱을 빠르게 실행하고, Hot Reload를 통해 코드 변경사항을 실시간으로 반영할 수 있다.

반면, Release 모드에서는 AOT(Ahead-of-Time) 컴파일을 사용한다.\
AOT 컴파일은 앱 실행 전에 Dart 코드를 기계어(native code)로 완전히 변환하여 빌드하므로, 실행 속도가 빠르고 최적화된 성능을 낼 수 있다.\
하지만 AOT 특성상 빌드 시간이 더 오래 걸리고, Hot Reload 기능은 지원되지 않는다.

컴파일된 코드는 앱의 리소스, 코드, 메타데이터 등을 포함하는 번들(bundle)로 패키징된다.

> 📌 **JIT (Just-In-Time) 컴파일**: 프로그램 실행 중에 코드를 즉시(런타임 시점) 컴파일하여 실행하는 방식.\
> 개발 단계에서 빠른 실행과 Hot Reload를 가능하게 하지만, 최종 빌드(Release)보다 성능이 다소 떨어질 수 있다.

#### 4. Flutter 엔진 구동

번들 패키징이 완료되면, 개발 디바이스(실제 디바이스 또는 시뮬레이터)에 **Flutter 엔진**을 구동한다.\
Flutter 엔진은 다음과 같은 핵심 역할을 수행한다:

* Skia를 통한 UI 렌더링
* Dart VM을 통한 코드 실행
* 프레임 생성 및 애니메이션 관리
* 사용자 입력 및 이벤트 처리

> 📌 **Dart VM**: Dart 언어로 작성된 코드를 실행하는 가상 머신(Virtual Machine).

#### 5. 플랫폼 Shell 연결

Flutter 엔진은 각 운영체제와 통신하기 위해 플랫폼 별로 Shell을 생성한다.

> 📌 **Shell**: Flutter 엔진과 각 운영체제(Android, iOS) 간에 메시지를 주고받고, 렌더링 결과를 전달하는 중간 계층.

* **Android**에서는 `FlutterActivity`를 통해 네이티브 환경과 연결된다.

  > 📌 **FlutterActivity**: Android Native 앱 안에서 Flutter 엔진을 구동하고 화면을 표시하는 기본 엔트리 포인트(Activity).
* **iOS**에서는 `FlutterViewController`를 통해 연결된다.

  > 📌 **FlutterViewController**: iOS 앱에서 Flutter 엔진을 호스팅하고, Flutter의 뷰를 표시하는 컨트롤러(ViewController).

#### 6. 앱 실행 및 첫 번째 프레임 렌더링

Flutter는 앱의 진입점인 `main()` 함수를 호출하여 실행을 시작한다.\
그 후, 위젯 트리를 구성하고, Skia 엔진을 통해 첫 번째 프레임을 화면에 렌더링한다.

***

### 요약

Flutter는 기존 iOS와 Android의 복잡한 네이티브 개발 방식을 대체하여, 하나의 코드베이스로 양 플랫폼을 동시에 지원할 수 있게 한다.\
Flutter 내부 구조를 이해하면, 단순히 "크로스 플랫폼"이라는 장점을 넘어, 어떻게 Flutter가 빠른 개발 속도와 일관된 사용자 경험을 제공할 수 있는지 보다 깊이 있게 이해할 수 있다.
