플러터 아키텍처
플러터의 애플리케이션 개발과 관련된 부분은 다트 언어로 개발된 프레임워크이다.
개발을 할 때는 프레임워크에서 제공되는 다양한 API를 사용하게 된다.
개발한 앱을 플러터 엔진이 실행하게 되는데, 엔진은 대부분 C++로 이루어져 있다. 엔진이 제공하는 기능 가운데 플랫폼 채널은 각 플랫폼의 네이티브 코드와 연동하는 방법을 제공하게 된다. 그리고 플러터는 모바일의 화면을 '스키아'라는 그래픽 엔진으로 직접 출력한다.
플러터를 다들 쓰는 가장 큰 이유 중 하나인, 플러터는 모든 플랫폼에서 동작하는 애플리케이션을 똑같은 코드로 작성할 수 있다. 하지만 각 플랫폼은 분명 차이가 있어 누군가 이에 맞게 애플리케이션이 동작할 수 있게 해주어야 한다. 이를 '임베더(embedder)'가 해준다. 임베더는 플랫폼에 종속된 부분이다. 안드로이드는 자바와 C++, iOS와 macOS는 오브젝티드-C와 C++로, 윈도우와 리눅스용은 C++로 이루어져 있다. 이 임베더 덕에 각 플랫폼에 맞게 실행될 수 있는 것이다.
플러터로 만든 웹 애플리케이션은 브라우저에서 실행된다. 그리고 다트 언어를 사용한다.
플러터 특징
플러터 프레임워크와 엔진이 여러 플랫폼에 똑같이 적용되어 여러 플랫폼에서 동작하게 할 수 있다.
다트는 크로스 플랫폼을 목적으로 만든 언어로 자연스레 플러터 앱 개발 언어로 사용되게 되었다.
플러터는 네이티브 앱의 성능만큼 뛰어나다. 크로스 플랫폼 프레임워크가 존재하긴 햇지만, 항상 성능 문제가 있었다. 하지만 플러터는 그렇지 않다. 플러터는 화면과 사용자 이벤트 처리를 웹 앱처럼 브라우저에 맡기지도 않고, 리액트 네이티브처럼 네이티브 코드와 연동하지 않는다.
화면을 출력할 때 플러터 엔진에서 스키아라는 그래픽 엔진을 이용해 직접 렌더링을 한다. 따라서 화면 렌더링 속도가 빠르다. 그리고 자연스럽고 뒤어난 애니메이션을 구현할 수 있다. 이러한 점이 플러터로 만든 앱의 화면 수준이 다른 크로스 플랫폼보다 더 좋은 이유이다.
리액트 네이티브는 플랫폼별 네이티브 기능과 연동하여 스타일이 서로 다른 UI를 출력한다. 하지만 플러터는 네이티브와 연동하지 않고 스키아 엔진을 이용해 플러터에서 화면을 직접 출력하고 사용자 이벤트를 처리한다. 성능도 뛰어나고 이에 더해 모든 플랫폼에서 같은 화면을 제공할 수 있게 된다. 물론 네이티브 앱 스타일로 화면을 구현할 수도 있다.
플러터는 네이티브 기능과 최소한으로만 연동한다.
플러터 공식 매뉴얼에서는 플러터가 네이티브 기능과 최소한으로만 연동하는 이유를 플랫폼 별로 네이티브 변경 사항이 애플리케이션 개발자에게 영향을 미치지 않게 하기 위해서라고 한다. 네이티브와 연동이 많으면 네이티브가 변경되었을 때 그 만큼 앱을 자주 업데이트해야 하므로 귀찮아지기 때문이다.