Flutter는 단일 코드베이스로 iOS와 Android 플랫폼에서 애플리케이션을 개발할 수 있는 강력한 프레임워크입니다. 이 포스팅에서는 Flutter의 아키텍처와 Dart 언어가 어떻게 iOS와 Android에서 작동하는지에 대해 알아보겠습니다.
1. Flutter의 아키텍처
Flutter의 아키텍처는 세 가지 주요 구성 요소로 나눌 수 있습니다: Flutter 엔진, Flutter 프레임워크, 그리고 Dart 언어입니다.
Flutter 엔진 (Flutter Engine)
• Flutter 엔진은 C++로 작성되었으며, 애플리케이션의 렌더링, 스케줄링, 그리고 네이티브 코드와의 상호작용을 처리합니다.
• 이 엔진은 Skia라는 고성능 2D 그래픽 라이브러리를 사용하여 UI를 그리며, 플랫폼에 종속되지 않고 일관된 UI를 제공합니다.
Flutter 프레임워크 (Flutter Framework)
• Flutter 프레임워크는 Dart로 작성되었으며, 위젯을 사용해 UI를 구성하고, 내비게이션, 상태 관리 등의 애플리케이션 로직을 처리합니다.
• 위젯은 Flutter의 기본 구성 요소로, iOS와 Android에서 동일한 코드로 동작할 수 있습니다.
Dart 언어 (Dart Language)
• Dart는 Flutter 애플리케이션의 주 프로그래밍 언어입니다. 정적 타이핑을 지원하며, 개발 중에는 JIT(Just-In-Time) 컴파일, 배포 시에는 AOT(Ahead-Of-Time) 컴파일을 통해 최적화된 네이티브 코드로 변환됩니다.
2. Flutter 프레임워크의 크로스 플랫폼 작동 원리
Flutter 프레임워크는 동일한 Dart 코드를 iOS와 Android에서 모두 실행할 수 있습니다. 이 과정은 다음과 같은 방식으로 이루어집니다.
플랫폼 독립적 UI 구성
• Flutter의 UI는 Dart로 작성된 위젯을 사용하여 구성됩니다. 이 위젯들은 iOS와 Android에서 동일하게 동작하며, 플랫폼 독립적인 UI를 제공합니다.
• Flutter는 두 플랫폼에서 동일한 사용자 경험을 보장하기 위해 Skia를 사용해 UI를 렌더링합니다.
Dart 코드 컴파일
• JIT 컴파일: 개발 중에는 JIT 컴파일을 사용해 Dart 코드를 런타임에 네이티브 코드로 변환합니다. 이 방식은 빠른 피드백과 핫 리로드(Hot Reload)를 가능하게 합니다.
• AOT 컴파일: 배포 시에는 AOT 컴파일을 통해 Dart 코드를 최적화된 네이티브 코드로 변환하여, iOS와 Android에서 성능이 뛰어난 애플리케이션을 제공합니다.
플랫폼 채널 (Platform Channels)
• Dart 코드와 네이티브 코드(Java/Kotlin for Android, Swift/Objective-C for iOS) 간의 상호작용은 플랫폼 채널을 통해 이루어집니다. 이를 통해 네이티브 기능(예: 카메라, GPS, 센서 등)을 사용할 수 있습니다.
• 플랫폼 채널은 Dart와 네이티브 간의 데이터 및 호출을 전달하여, 두 플랫폼에서 Flutter 애플리케이션이 원활히 동작할 수 있게 합니다.
3. Dart 언어가 iOS와 Android에서 작동하는 원리
이제 Dart 코드가 어떻게 iOS와 Android에서 네이티브 코드로 변환되고 실행되는지 살펴보겠습니다.
컴파일 과정
• JIT 컴파일: 개발 중에는 빠른 코드 실행을 위해 JIT 컴파일을 사용합니다. Dart 코드는 런타임에 네이티브 코드로 변환되어 즉시 실행됩니다.
• AOT 컴파일: 배포 시에는 Dart 코드를 AOT 컴파일하여 최적화된 네이티브 코드로 변환합니다. 이 코드가 실제 기기에서 실행되며, 성능을 최적화합니다.
Flutter 엔진과 네이티브 코드
• Flutter 엔진은 Dart VM을 포함하며, 이 VM은 JIT 컴파일된 코드를 실행합니다. 배포된 애플리케이션에서는 AOT 컴파일된 코드가 네이티브 환경에서 실행됩니다.
• 플랫폼 채널을 통해 Dart 코드와 네이티브 코드 간의 상호작용이 이루어지며, 두 플랫폼의 고유 기능을 활용할 수 있게 합니다.
4. 요약 및 결론
Flutter의 아키텍처는 Flutter 엔진, Flutter 프레임워크, Dart 언어로 이루어져 있으며, 이 세 요소는 iOS와 Android 두 플랫폼에서 모두 작동할 수 있게 해줍니다. Dart 코드는 JIT 및 AOT 컴파일을 통해 네이티브 코드로 변환되고, Flutter 엔진은 플랫폼 독립적인 UI 렌더링과 네이티브 코드와의 상호작용을 처리합니다. 플랫폼 채널은 Dart와 네이티브 코드 간의 통신을 관리하여, Flutter 애플리케이션이 두 플랫폼에서 원활히 실행될 수 있도록 합니다.
이러한 구조 덕분에 개발자는 한 번의 코드 작성으로 두 플랫폼에서 작동하는 애플리케이션을 쉽게 개발할 수 있습니다.