본문 바로가기
flutter

플러터 - 플러터 아키텍처와 특징

by 들풀민들레 2023. 3. 13.

 

본 글은 [Do it! 깡샘의 플러터&다트 프로그래밍] 의 내용을 발췌한 것입니다.

 

 

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.

플러터 아키텍처 살펴보기


다음 그림은 플러터 프레임워크의 구조를 잘 보여 줍니다. 앱을 개발하는 관점에서 이 구조를 자세히 알 필요는 없지만 플러터로 만든 앱이 어떻게 동작하는지 알아 두면 개발할 때 도움이 됩니다.

 

플러터의 아키텍처에서 애플리케이션 개발과 밀접한 부분은 다트 언어로 개발된 프레임워크입니다. 앱을 개발할 때는 이 프레임워크에서 제공하는 다양한 API를 이용합니다.
이렇게 개발한 앱을 플러터 엔진이 실행하는데 엔진은 대부분 C++로 작성되었습니다. 엔진이 제공하는 기능 가운데 플랫폼 채널Platform Channels은 각 플랫폼의 네이티브 코드와 연동하는 방법을 제공합니다. 플랫폼 채널은 중요하므로 23장에서 자세하게 다루겠습니다. 그리고 플러터는 애플리케이션의 화면을 스키아Skia라는 그래픽 엔진으로 직접 출력합니다. 이 부분이 왜 중요한지는 잠시 후에 플러터 특징을 다룰 때 설명하겠습니다.
플러터로 개발한 애플리케이션을 어느 플랫폼에서 실행하든 프레임워크와 엔진 부분은 같으므로 모든 플랫폼에서 동작하는 애플리케이션을 똑같은 코드로 작성할 수 있습니다. 그런데 각 플랫폼은 분명 차이가 있으므로 누군가가 그에 맞게 애플리케이션이 동작할 수 있게 해주어야 합니다. 이 역할을 임베더embedder가 해줍니다. 임베더는 플랫폼에 종속된 부분입니다. 안드로이드용 임베더는 자바와 C++로, iOS와 macOS용은 오브젝티브-C나 C++로, 윈도우와 리눅스용은 C++로 작성되었습니다. 이 임베더 덕분에 애플리케이션이 각 플랫폼에 맞게 실행됩니다.
다음 그림은 웹 애플리케이션을 개발할 때 플러터의 아키텍처입니다.

 

플러터로 만든 웹 애플리케이션은 브라우저에서 실행됩니다. 플러터는 웹 애플리케이션을 개발할 때 자바스크립트나 타입스크립트가 아니라 다트 언어를 사용합니다. 따라서 똑같은 코드로 작성된 애플리케이션을 안드로이드와 iOS뿐만 아니라 브라우저에서도 실행할 수 있습니다.

 

플러터 특징 살펴보기


이번에는 플러터의 특징을 살펴보겠습니다. 다른 크로스 플랫폼 프레임워크보다 늦게 나왔는데도 플러터가 개발자들에게 인기를 끈 이유는 무엇이었을까요?


크로스 플랫폼 프레임워크입니다
이 특징은 앞에서 이미 살펴봤습니다. 플러터의 프레임워크와 엔진이 여러 플랫폼에 똑같이 적용되므로 플러터로 만든 애플리케이션은 여러 가지 플랫폼에서 동작할 수 있습니다.


다트 언어로 개발합니다
플러터 앱은 다트Dart라는 소프트웨어 언어로 작성합니다. 다트는 크로스 플랫폼을 목적으로 만든 언어라서 자연스럽게 플러터 앱 개발 언어로 채택되었습니다. 다트 언어는 둘째마당에서 자세히 다루겠습니다.

 

뛰어난 성능과 강력한 애니메이션 기법을 제공합니다
플러터로 개발한 앱은 네이티브 앱의 성능만큼 뛰어납니다. 크로스 플랫폼 프레임워크의 사상은 멋지지만 항상 성능 문제 때문에 개발자를 주저하게 만들었습니다. 프런트엔드 애플리케이션의 성능은 화면 렌더링(출력) 속도가 대부분을 차지하며 여기에는 앱을 이용하는 사용자가 이벤트에 반응하는 속도도 포함합니다. 앱이 아무리 멋진 화면에 좋은 콘텐츠를 제공하더라도 화면 출력이 느리거나 이벤트에 굼뜨게 반응하면 외면받을 수밖에 없습니다.
앞에서 살펴본 웹 앱과 리엑트 네이티브는 매력적인 크로스 플랫폼 개발 기술이지만 구조상 아무래도 성능이 낮을 수밖에 없습니다. 그러나 플러터는 화면과 사용자 이벤트 처리를 웹 앱처럼 브라우저에 맡기지도 않으며, 리액트 네이티브처럼 네이티브 코드와 연동하지도 않습니다.
플러터는 화면을 출력할 때 플러터 엔진에서 스키아라는 그래픽 엔진을 이용해 직접 렌더링합니다. 그만큼 화면 렌더링 속도가 빠릅니다. 따라서 자연스럽고 강력한 애니메이션을 구현할 수 있으며, 바로 이러한 점이 플러터로 만든 앱의 화면 수준이 다른 크로스 플랫폼보다 더 좋아 보이는 이유입니다.


모든 플랫폼에 똑같은 UI를 제공할 수 있습니다
리액트 네이티브는 플랫폼별 네이티브 기능과 연동하므로 스타일이 서로 다른 UI를 출력합니다. 그러나 플러터는 네이티브와 연동하지 않고 스키아 엔진을 이용해 플러터에서 화면을 직접 출력하고 사용자 이벤트를 처리합니다. 따라서 성능이 뛰어날 뿐만 아니라 모든 플랫폼에서 똑같은 화면을 제공할 수 있습니다. 물론 각 플랫폼의 네이티브 앱 스타일로 화면을 구성할 수도 있습니다.


네이티브 기능과 최소한으로만 연동합니다
크로스 플랫폼 프레임워크로 앱을 개발하더라도 분명 각 플랫폼은 서로 달라서 네이티브 기능과 어느 정도는 연동할 수밖에 없습니다. 그런데 플러터는 네이티브 기능과 최소한으로만 연동합니다. 단지 개발자의 네이티브 코드와 플러터의 다트 코드가 서로 연동할 수 있는 플랫폼 채널만 제공합니다. 이 플랫폼 채널은 23장에서 중요하게 다룰 것입니다.
플러터 공식 매뉴얼에서는 플러터가 네이티브 기능과 최소한으로만 연동하는 이유는 플랫폼별로 네이티브 변경 사항이 애플리케이션 개발자에게 영향을 미치지 않게 하기 위해서라고 합니다. 네이티브와 연동이 많으면 네이티브가 변경됐을 때 그만큼 앱을 자주 업데이트해야 하므로 번거로워지기 때문입니다.

 

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.