왜 Flutter는 Dart를 사용하는가?

아니 다른 좋은 언어 두고 굳이 왜…!

John Cho
Flutter Seoul
6 min readJul 22, 2019

--

Google의 최근 전략은 잘 모르겠지만 최근 몇년간 Google+의 종료, Inbox의 종료 등을 겪으면서 사람들이 Google 제품이 언제든지 없어질 수 있다고 생각하는 거 같다. 그렇다기엔 Gmail이나 Maps가 유지되고 있는 걸 보면 쉽게 없앨 거 같지는 않지만 말이다.

Dart는 2011년, Google이 개발한 Client-side 개발 언어다. 처음에는 JavaScript를 대체하기위한 언어로써 많이 소개되었고, 실제로 처음에 제공한 transcompile 결과물도 JS였다.

하지만 처음부터 Dart는 외면받았다.

  1. JS를 대체하기 위해서라면 CoffeeScript나 TypeScript를 사용할 수 있었고, Dart는 언어적 특성이 그렇게 세련되어보이지 않았고 러닝 커브가 높았다. 또한 당시에는 jQuery를 전세계에서 많이 사용했었는데, Dart와 jQuery를 결합해서 사용해야한다고 생각해보시라. (죽는다)
  2. Dart 만으로 이루어진 구현체가 마땅히 없었다. 그렇다고 웹 브라우저에서 바로 Dart가 동작하는 것도 아니었기 때문에 굳이 Dart라는 언어를 배울 필요는 없었다.

그래서 Dart는 2018년 Survey에서 배우지않아도 될 언어 1위라는 치욕을 맛보기도 하였다. 그러면 도대체 왜 Google은 굳이 Flutter를 Dart로 구현했을까? 또 Fuchsia에서 왜 Dart를 지원하기로 했을까?

클라이언트에 최적화된 언어

Dart의 플랫폼 지원 (from https://dart.dev)

Dart는 JIT(Just-In-Time) 컴파일을 통해 DartVM 위에서 동작하는 방식, AOT(Ahead-Of-Time) 컴파일을 통해 runtime에서 바로 동작하는 방식을 모두 지원한다.

JIT 컴파일은 인터프리터처럼 실행 전에 코드를 컴파일하지 않아도 되기 때문에, 코드 수정 때마다 발생하는 빌드 시간을 줄여서 개발자들이 더 편리하게 개발할 수 있다는 장점이 있다.

하지만 VM 위에서 동작하기 때문에 대부분의 코드가 그러하듯 성능상 Native 플랫폼에 비하면 느리다는 단점이 있는데, Dart는 AOT 컴파일도 지원하기 때문에 실제로 배포할 때에는 AOT 컴파일을 통해서 런타임에서 바로 동작하는 코드를 만들 수 있다.

예를 들어, Flutter를 예로 들어보자. Flutter는 아래 구조의 Architecture를 가지고 있다.

Flutter 아키텍쳐

Flutter는 Dart로 구성되어있는 코드들을 Flutter Engine을 통해서 Platform (Android, iOS, and so on)과 통신하게 되어있고, 이 과정이 JIT 컴파일이던 AOT 컴파일이던 상관 없이 동작한다. (Production build하면 AOT 컴파일된다)

또한 Dart의 중요한 개념 중 Snapshot이라는 개념이 있는데, Dart 프로그램이 최초로 실행될 때 느리게 실행되는 것을 방지하기 위해서 파일에 미리 몇개 파일을 패키징해두고 불러오는 방식이다. 이를 통해 최초 로딩 속도가 빨라지는 장점이 있다. 또한 Dart의 isolate를 사용하여 멀티 쓰레드를 지원할 수도 있다.

hot reload

Flutter의 hot reload를 이용하면 개발할 때 빌드 시간을 줄이고 거의 즉시에 가까운 속도로 개발하는 것이 가능하다. 이 기능이 Dart의 JIT 컴파일에 기반한 것으로, Dart가 JIT 컴파일을 지원함으로써 즉시 앱을 수정하고 실행시키는 것이 가능하다.

from https://Flutter.dev

또한 Dart는 표준을 가지고 있는 언어다. JavaScript의 표준이 ECMA-262고 TC39에서 관리하듯 Dart는 TC52에서 관리하고 있는 표준 언어다. 표준 번호로는 ECMA-408인데 Dart 2 버전이 아직 표준화되고 있기 때문에 Dart 1 버전이 현재로는 표준으로 남아있다.

Dart가 JavaScript를 대체하기 위한 언어라는 많은 오해가 있지만 사실 그렇지 않고, Dart는 Client Side에서 더 나은 개발을 위해 만들어진 언어라고 생각하는 것이 좋다.

Flutter 탄생설화

Flutter는 원래 Fuchsia의 UI Toolkit으로 시작되었다. Fuchsia는 Google에서 개발 중인 차세대 OS로 얼마 전 Google I/O에서도 언급되었고, 개발자 사이트가 오픈되는 등 활발하지는 않지만 꾸준히 움직임을 보여주고 있는 OS다.

Fuchsia에서 Flutter는 Vulkan 기반의 그래픽 렌더링 엔진인 Escher를 지원하고, 이를 통해서 Material Design 특유의 Shadow가 많은 디자인을 지원한다. (Google에 최적화되어있다.)

그리고 Fuchsia가 비교적 후발주자로 나온 OS이기 때문에 다른 플랫폼과의 결합도 중요한 포인트라고 생각한다면, Flutter가 멀티 플랫폼을 지원할 수 있어야한다고 결정했을 것이고 멀티 플랫폼을 지원하기에 용이한 언어인 Dart를 사용했다고 생각한다. (여기는 뇌피셜이다)

Fuchsia는 또한 OS 차원에서 Dart VM이 돌아가고있기 때문에 Dart를 이용해서 클라이언트를 개발하는 것이 더 용이하다.그 외에도

Flutter 코어 개발자가 Dartlang 코어 개발자다. (끝)

위에서 말했던 것처럼 Dart로 이루어진 구현체가 기존에 없었기 때문에 언어적 발전이 더딘 현상이 있었는데, Fuchsia와 Flutter를 구현하면서 Dart가 발전하는 계기가 되었다고 생각한다.

대표적으로 AOT 컴파일은 Dart 2가 나오면서 추가된 기능인데, AOT 컴파일을 통해서 Native에서도 빠른 어플리케이션을 만들 수 있게 되었으니 Dart에게도 좋고 구현체에게도 좋은 현상이라고 생각한다.

처음에는 Flutter에 매력을 느껴서 Dart를 공부하기 시작했지만 지금은 Dart 자체도 참 매력적인 언어라고 생각하고 있다. Dart에 대한 오해가 많이 풀렸으면 좋겠다고 생각한다.

--

--