Dart 2.1 발표 — 성능과 사용성 개선

Dart 2.1 발표 — 성능과 사용성 개선

Dart 2.1의 안정 릴리스를 발표해요. 더 작은 코드 크기, 더 빠른 타입 검사, 타입 오류에서 더 나은 사용성, 그리고 사용자 경험을 만들 때 생산성을 높여 주는 새로운 언어 기능을 담고 있어요. 이 글에서는 Dart 2가 어떤 과정을 거쳐왔는지부터 2.1에서 바뀐 핵심 내용을 하나씩 살펴볼게요.

출처: Announcing Dart 2.1: Improved performance and usability

본문

오늘 우리는 Dart 2.1의 안정 릴리스를 발표해요. Dart 2를 업데이트한 이번 릴리스는 더 작은 코드 크기, 더 빠른 타입 검사, 타입 오류에 대한 더 나은 사용성, 그리고 사용자 경험을 만들 때의 생산성을 높여 주는 새로운 언어 기능을 담고 있어요.

Dart 2 정착시키기

Dart 2는 Dart 플랫폼에 대한 커다란 업그레이드였어요. 초기 웹 뿌리에서, 모바일과 웹 전반에 걸쳐 풍부한 사용자 경험을 빠르게 개발하기에 적합한 주류 프로그래밍 언어로의 전환을 완성했죠. Dart는 가상 머신(VM)을 제공하면서도 네이티브 머신 코드와 JavaScript로 모두 컴파일되는 점에서 다소 독특한 언어예요. 이는 개발과 운영 모두에서 다양한 플랫폼의 서로 다른 요구를 지원해 줘요.

Dart 2로의 전환 과정에서 우리는 복잡한 앱을 만드는 대규모 팀을 지원하기 위한 사운드 타입 시스템을 추가하고, 모바일 기기에 최적화된 네이티브 코드를 생성하는 새로운 컴파일러를 지원하며, 웹 플랫폼 도구를 완전히 재작업했어요. Dart는 단일 코드베이스로 iOS와 Android용 아름다운 네이티브 경험을 만드는 빠르게 성장하는 도구 키트인 Flutter를 구동해요. 또 Google Ads 같은 Google의 가장 큰 프로젝트 일부에서도 쓰이는 언어이기도 해요.

지난 8월 Dart 2 출시 이후 우리는 전체 생태계를 Dart 2로 옮기는 작업을 해 왔어요. dartlang.org 웹사이트를 모든 곳에서 Dart 2 예시를 쓰도록 전환했고, Dart 1.x 패키지를 마이그레이션하기 위한 도구와 문서를 제공했어요. Dart 2의 큰 변화가 기존 Dart 개발자에게 마이그레이션 작업을 요구했다는 걸 잘 알고 있고, 미래를 위한 새로운 기반을 함께 만들어 준 분들께 매우 감사해요. 이제 우리의 초점은 이 투자를 활용해 성능과 생산성 개선으로 이어나가는 데로 옮겨가요.

Dart 2.1 언어 지원: int에서 double로의 변환

새 Flutter 개발자들은 padding을 지정하거나 폰트 크기를 설정할 때 흔히 이런 분석 오류에 막혀요. 시스템 관점에서 보면 이 오류는 타당해요. API는 한 타입(double)을 기대하는데 개발자는 다른 타입(int)의 값을 지정하니까요. 그런데 사용성 관점에서 보면 좀 어리석게 느껴져요. int에서 double로의 변환은 아주 사소하니까, 왜 그냥 해주지 않을까요? Dart 2.1은 이제 int가 조용히 double로 평가될 수 있는 위치를 추론해요.

Dart 2.1 언어 지원: mixin

우리는 Dart의 mixin 지원도 개선했어요. 아직 Dart mixin을 접해보지 못했다면, Romain Rastel이 쓴 훌륭한 Dart mixin 소개를 읽어볼 가치가 있어요. Dart 2.1은 mixin을 위한 새 문법을 도입하는데, mixin으로만 사용할 수 있는 클래스를 정의할 수 있는 새로운 mixin 키워드를 제공해요. 또 mixin이 다른 클래스를 extends할 수 있게(이전에는 Object만 확장 가능했어요) 하고, 슈퍼클래스의 메서드를 호출할 수 있게 지원을 추가했어요.

Object가 아닌 클래스를 확장하는 예시 중 하나는 Flutter의 애니메이션 API에서 찾을 수 있어요. 여기서 SingleTickerProviderStateMixin — 한 프레임만큼 애니메이션을 진행시키는 티커(ticker)를 제공하는 프레임워크 클래스 — 는 일반적인 TickerProvider 인터페이스를 구현하는 mixin을 선언해요. 애니메이션의 위치는 상태로 간주되기 때문에 애니메이션은 상태를 가진 위젯(stateful widget)에만 적용돼요. 새 mixin 지원 덕분에, Flutter의 State 클래스를 확장하는 클래스만 그 mixin을 사용할 수 있다고 선언함으로써 이를 표현할 수 있게 됐어요.

Dart 2.1 컴파일 타임 타입 검사

Dart 2의 사운드 타입 시스템은 개발 중에 타입이 명시한 계약을 어겼을 때 알려줘서 여러분을 보호해요. 예를 들어 Flutter용 상태(state) 클래스를 만든다고 해 볼게요. 이 클래스는 프레임워크의 State 클래스를 확장할 거예요. State 클래스는 자신이 상태를 담고 있는 StatefulWidget을 전달받을 것을 기대해요.

이제 프로그래밍 실수를 해서 — 예를 들어 — StatefulWidget 대신 StatelessWidget의 하위 클래스를 전달했다고 하면, 타입 정보 덕분에 도구가 실수를 잡아내고 즉시 경고를 보여줘요.

이런 편집 시 타입 검사는 Dart 2.0(Dart Analyzer가 구동)에서 추가됐어요. 그런데 이런 타입 검사를 기대할 만한 또 다른 지점이 있어요. 바로 컴파일 타임, 즉 Flutter 릴리스 빌드를 할 때예요. 이 검사는 Dart 2.0에서 불완전해서, 잘못된 소스 코드가 아무 오류 없이 컴파일되는 사용성 문제가 생길 수 있었어요. Dart 2.1에서는 이 검사가 완성되었고, Analyzer와 Dart 컴파일러가 동일한 검사를 담고 있어요.

Dart 2.1 성능 개선: Flutter 개발자를 위해

Dart 2는 Flutter 앱처럼 우리 VM에서 실행되는 AOT 컴파일 코드에서 일반적으로 Dart 1.x보다 빨랐어요. 다만 몇몇 드문 경우에는 새 타입 시스템이 추가한 포괄적인 검사 때문에 바람직하지 않은 20–40%의 오버헤드가 발생했어요. Dart 2.1에서는 AOT 컴파일 코드와 JIT(just-in-time) 컴파일로 VM에서 돌아가는 코드 모두에서 타입 검사 비용을 크게 줄였어요.

이점을 얻는 구체적인 사례 하나는 우리 개발자 도구(VM으로 실행돼요)에요. 큰 벤치마크 앱(Flutter Gallery의 여러 복사본을 이어 붙인 것) 하나에 대한 코드 분석이 예전에는 약 41초가 걸렸는데, 이제 약 25초로 줄었어요.

Dart 2.1 성능 개선: 웹 개발자를 위해

우리는 웹에서 실행되는 Dart 코드의 코드 크기와 컴파일 시간도 개선했어요. dart2js의 출력 크기에 집중했는데, 좋은 결과가 나오고 있어요. 우리 샘플 중 하나에서 축소(minified) 출력 크기 17% 감소와 컴파일 시간 15% 개선을 확인했어요.

핵심 SDK 너머의 변화

위에서 언급한 Dart SDK의 변화에 더해, 핵심 SDK 밖에서도 흥미로운 변화가 몇 가지 있어요.

Protocol buffers(줄여서 protobuf)는 구조화된 데이터를 직렬화하는 플랫폼 중립적 메커니즘이에요. Google 내부에서 광범위하게 쓰이고, Google 밖에서도 — 예를 들어 gRPC의 일부로 — 강력하게 채택되고 있어요. Dart는 이제 공식 지원되는 protobuf 언어가 되었고, 핵심 protocol buffers 웹사이트튜토리얼레퍼런스 문서를 모두 추가했어요.

knative를 들어본 적이 있을 거예요. Kubernetes 기반의 플랫폼으로, serverless 워크로드를 빌드·배포·관리하기 위한 것이에요. 우리는 최근 knative에서 Dart 코드를 서빙하는 지원을 조사했고 작은 샘플을 만들었어요. 이는 대부분의 Dart 앱 개발자에게는 너무 저수준일 수 있지만, 플랫폼 관점에서는 매우 흥미롭다고 생각해요. Google Cloud에서 Dart 코드를 서빙하는 지원(예: Flutter 앱의 백엔드)을 개선하기 위한 중요한 구성 요소가 될 거라고 기대해요.

Dart 2.1 받아보기

Dart SDK 2.1은 Dart 홈페이지에서 받을 수 있어요. Flutter 개발자라면, Dart 2.1은 곧 출시될 Flutter 1.0 릴리스에 포함돼 있어요.

DartPad를 Dart 2.1로 업데이트했고, int-to-doublemixin 샘플을 추가했어요.

다음은 무엇인가

우리는 Dart 2 플랫폼 기반을 활용한 여러 2.x 릴리스를 내놓을 계획이에요. 이 릴리스들은 프레임워크 파트너와 앱 개발자의 요구를 바탕으로 삼을 거예요. 2019년에는 다음 영역들을 조사할 예정이에요.

  • Dart 언어의 지속적인 진화: Dart 2.2를 위해 여러 변화를 조사하고 있는데, const 표현식의 개선과 새 Set literal 지원 등이 포함돼요. 2.2 너머로는 Unicode 문자열 지원을 살펴보고 있고, 더 나은 null safety를 제공할 수 있을지도 조사하고 있어요.
  • 사용자 인터페이스 만들기에 최적화된 언어로서 Dart를 더 개선: Dart 2는 새 타입 시스템과 선택적인 new로 그 여정을 시작했고, Dart 2.1은 int-to-double 값 추론을 더했어요. 지금은 위젯 리스트의 조건문, 객체 컬렉션을 다른 컬렉션으로 확장, 심지어 문장을 세미콜론으로 끝내야 하는 필요성 제거 같은 잠재적 개선들을 조사하고 있어요.
  • 더 나은 성능: 컴파일된 Dart 코드의 크기와 성능을 계속 줄여 나갈 거예요. 멀티코어 프로세서 활용 지원 개선, 다운로드와 시작 시간을 줄이기 위한 코드 크기 추가 축소, 그리고 크기와 런타임 성능 중 무엇이 더 중요한지에 대한 더 많은 제어를 고려하고 있어요.

Dart와 Flutter에 대해 더 알고 싶다면, 12월 4일에 열리는 온라인 이벤트 Flutter Live에 함께해 주세요. 웹에서 실시간으로 스트리밍될 거예요. 그 자리에서 로드맵에 대해 더 많은 이야기를 나눌 수 있게 되어 기대돼요.

여기까지예요. Dart 2.1을 즐겨 주세요!

더 알아보기