[Flutter] Architectural Overview
Table of contents
Flutter는 구글이 출시한 크로스 플랫폼 GUI 애플리케이션 프레임워크이다. 하나의 코드로 Android, iOS 뿐만 아니라 Windows, Linux, macOS 및 웹 브라우저까지 지원해주는 만큼, (심지어 러닝 커브도 낮다!) 내부 설계가 꽤나 복잡하게 되어있다. 오늘은 이 글을 정리해보며 플러터 아키텍쳐 계층의 일부를 살펴보고, 더욱 깊은 이해를 기반한 좋은 애플리케이션을 개발 할 수 있는 초석을 다져나가보고자 한다. (전부 정리해보는게 목표지만 과연 완주할 수 있을지는....?)
Architectural Layers
플러터는 확장 가능한 계층형 시스템으로 설계되어 있는데, 이는 서로 의존하는 독립적인 라이브러리들로 구성되어 있다. 이 때, 그 어떤 계층도 아래 계층에 대한 접근 특권을 가지고 있지 않는다.
기본적으로 플러터 애플리케이션은 다른 네이티브 애플리케이션과 같은 방식으로 패키징된다. 각 플랫폼(OS)에 적합한 언어로 작성되어 진입점 역할을 해주는 Embedder 부분, C/C++로 작성되어 프로그램의 핵심이 되어주는 Engine 부분, 그리고 Dart로 작성된 현대적이고 반응형인 Framework 부분으로 구성되어 있다.
오늘은 각 파트에 대해 간단하게만 살펴보고, 추후 개발자들이 일반적으로 가장 많이 상호작용하는 Framework 부분에 대해 더 자세히 알아보도록 하겠다!
Embedder
platform-specific한 언어로 작성되어 플랫폼에 진입점을 제공해준다.
렌더링 서피스, 접근성, 입력 등의 서비스에 대한 액세스를 위해 OS와 조정하며 메세지 이벤트 루프를 관리한다.
- *이벤트 루프: 애플리케이션 실행 중 지속적으로 메시지나 이벤트(마우스 클릭, 키보드 입력 등)를 체크하고, 해당 이벤트를 감지하면 적절한 처리 루틴을 실행한다.
각 플랫폼에 적합한 언어로 작성된다.
Android: Java, C++
iOS, macOS: Objective-C/Objective-C++
Windows, Linux: C++
임베더를 사용하면 플러터 코드를 모듈로서 기존 애플리케이션에 통합시키거나, 아예 전체 애플리케이션으로서 구현되게 할 수 있다.
Engine
플러터의 엔진은 대부분 C++로 작성되고, 모든 플러터 애플리케이션을 지원하기 위한 기본적 요소를 지원해준다.
새로운 프레임이 칠해질 때, 합성되는 장면을 래스터라이징하는 역할을 한고, 플러터의 핵심 API의 low-level 구현을 제공한다.
이는 그래픽, 텍스트 레이아웃, 파일 및 네트워크 I/O, 접근성 지원, 플러그인 아키텍쳐, Dart 런타임 및 컴파일 툴체인을 포함한다.
*래스터라이징(rasterizing): 벡터 그래픽으로 구성된 데이터를 픽셀 기반의 이미지로 변환하는 과정
엔진은 Dart 클래스 안의 C++ 코드를 감싸는 dart:ui를 통해 플러터 프레임워크에 노출된다.
Framework
일반적으로, 개발자들은 플러터 프레임워크를 통해 플러터와 상호 작용한다.
이 프레임워크는 풍부한 platform, layout, 그리고 foundational libraries를 모두 포함하며, 여러 계층으로 구성된다.
프레임워크 계층을 아래에서 위로 나열하면 다음과 같다:
Basic Foundational Classes
- 와 더불어 animation, painting, gesture와 같은 기본적 추상화 서비스.
Rendering Layer
레이아웃을 다루기 위한 추상화를 제공한다.
이 계층을 통해 렌더링 가능한 객체(object)의 트리를 만들 수 있다.
이 객체들은 동적으로 조작할 수 있으며, 트리는 변경점을 레이아웃에 자동으로 반영한다.
Widgets Layer
구성 추상화(composition abstraction)이다.
렌더링 계층의 각 객체는 대응되는 위젯 계층의 클래스를 가지고 있다.
재사용할 수 있는 클래스의 조합을 정의할 수 있고, 반응형 프로그래밍 모델이 도입된다.
Material and Cupertino Libraries
- 위젯 계층의 원시 구성 요소를 사용해 Android의 Material, iOS의 Cupertino 디자인 구현을 지원한다.
플러터 프레임워크는 상대적으로 크기가 작으며, 개발자가 필요로 할 수 있는 higher-level 기능들은 패키지들로서 구현된다. 이는 플랫폼에 구애받는 기능과, 구애받지 않는 기능을 포함하여 플러터가 더 넓은 생태계를 커버할 수 있게 해준다.
금방 정리되겠지? 싶었던 것도 정리하며 고민하고 찾아보고 하다보니 생각보다 오래 걸렸다..!
다음엔 플러터의 프레임워크 파트에 대해 더 자세히 알아보도록 하겠다.. . . .
.
.
.
끝!
\reference:[docs.flutter.dev/resources/architectural-ov..