Dart 2 안정 버전 출시와 Dart 웹 플랫폼

Dart 2 안정 버전 출시와 Dart 웹 플랫폼

오늘 우리는 Dart 2의 안정(stable) 릴리스가 즉시 사용 가능하다는 소식을 발표해요. 생산성, 성능, 확장성의 독특한 조합을 제공하는 Dart 웹 플랫폼의 재작성(rewrite)을 포함해서요.

Flutter 개발자는 이미 Dart 2의 혜택을 많이 누리고 있어요. Flutter가 몇 달 동안 Dart 2 SDK의 프리릴리즈 버전을 번들해 왔으니까요. 하지만 Dart 2의 안정 릴리스는 프레임워크와 언어의 긴밀한 결합 때문에 Flutter의 안정 릴리스를 향한 또 하나의 중요한 이정표예요. 아직 Flutter를 설치하지 않았다면 여기서 시작하세요.

Dart 2의 릴리스로 웹 개발자들은 이제 같은 언어, 라이브러리, 도구를 많은 웹 특화 개선과 함께 활용할 수 있어요. 웹 개발자라면 도구를 설치하고 첫 애플리케이션을 빌드하는 지침을 위해 Get Started 페이지에서 시작하세요.

출처: Announcing Dart 2 stable and the Dart web platform

본문

Dart: 커져 가는 흥분

Dart 2는 Dart가 모바일과 웹 애플리케이션을 위한 빠른 개발과 훌륭한 사용자 경험을 가능하게 하는 주류 프로그래밍 언어로 다시 태어나는 표시예요. 우리는 클라이언트 애플리케이션을 만드는 개발자가 생산적으로 일할 수 있도록 하고 싶어요. 보일러플레이트를 줄이고 비즈니스 로직에 집중할 수 있게 하는 언어, 프레임워크, 컴포넌트와 함께, 오류를 일찍 찾아내고 강력한 디버깅을 가능하게 하며 작고 빠른 런타임 코드를 전달하는 도구까지 제공해서요.

지난 1년 동안 Dart는 극적으로 성장했어요. 우리 자체 분석에 따르면 외부 사용이 10배 성장했어요. 지난 분기에 Dart는 pull request 기준으로 낸 GitHub에서 가장 빠르게 성장한 언어 중 하나였어요. StackOverflow 질문의 성장도 Dart의 모멘텀을 생생하게 보여줘요.

내부적으로 Dart는 Google이 웹 애플리케이션 개발에 쓰는 몇 안 되는 언어 중 하나로, Google Ads, Google Shopping, 그리고 우리 내부 인프라 팀까지 포함한 수십 개 프로젝트의 수백만 줄 코드가 사용돼요.

사실 여러분은 깨닫지 못한 채 이미 Dart를 쓰고 있을지도 몰라요. 인기 있는 Sass 스타일시트 전처리기가 최근 Dart로 재작성돼서 더 빠르고, 더 휴대 가능하며, 더 쓰기 쉬워졌어요. Sass는 이제 Homebrew와 Chocolatey에서 독립 실행형 실행 파일로 배포되고, npm에서는 순수 JavaScript로 컴파일돼요. Dart는 외부 의존성 없이 어디서든 애플리케이션을 설치하기 쉽게 만들고, Dart를 쓰는 사람과 쓰지 않는 사람 양쪽의 워크플로에 들어맞게 해줘요.

Dart 2는 세 영역에 집중해요. 언어의 강화와 정돈, 웹·모바일 프레임워크 지원 개발, 그리고 Google의 Dart 사용을 지원하는 도구·컴포넌트 일부를 외부 세계에 가져오는 것. 이 글의 나머지는 이 주제들을 탐구할 거예요.

Dart 2: 클라이언트 최적화 언어

우리가 2월에 강조했듯이, Dart 타입 시스템sound(건전)해요. 이는 많은 종류의 문제가 사용자가 애플리케이션을 실행하기 전에 — 분석과 컴파일 중에 — 발견된다는 뜻이에요. Google 내에서 Dart를 극도로 큰 앱으로 확장하면서, 타입 시스템이 개발 주기 초반에 더 많은 오류를 잡아내 더 높은 품질의 프로덕션 코드를 이끌어 냈어요.

Dart 2에서는 표현식이 그 정적 타입과 일치하지 않는 값으로 평가되는 상태에 빠질 수 없어요. 이는 코드베이스를 수백만 줄로 확장하고, 큰 리팩터링 프로젝트를 감당하고, 자신 있게 코드를 배포할 수 있다는 뜻이에요.

걱정하지 마세요. soundness가 보일러플레이트의 산더미를 의미하진 않아요. 타입 시스템은 고급 추론을 포함해요 — 제네릭 타입 인자까지도요.

final _field = [3.14, 6.28];

void main() {
  // No type parameter is provided, but <int> is inferred
  print([1, 2, 3].runtimeType); // List<int>

  // If types are unmatched, their common base type is used
  // int (1) and double (3.14) are both `num`
  print([1, 3.14].runtimeType); // List<num>

  // Inference goes beyond variables.
  // You can omit types on fields, too.
  print(_field.runtimeType); // List<double>
}

Dart 2 타입 시스템에 대해 더 알고 싶다면 이 페이지를 확인해 보세요.

이전 블로그 글에서 언급했듯 Dart 2는 몇 가지 핵심 영역에서 언어의 형식적 절차(ceremony)도 줄여요. 예를 들어 new 키워드는 이제 선택 사항이고, const 키워드는 상수 문맥 안에서 선택 사항이에요.

마지막으로, 우리는 여러 지원 도구를 통합하기 위해 뒤에서 많은 작업을 해왔어요. 이제 컴파일러와 런타임을 지원하는 공통 프런트엔드를 갖췄죠. 이는 지금 사용자에게 일관성을 보장하고, Dart가 계속 진화하면서 새 기능의 속도와 품질을 개선하겠다는 약속이에요.

웹에서의 Dart: 풍부하고 강력한 프레임워크

웹 애플리케이션은 처음부터 Dart의 사명에 중심이었어요. 사실 Google에서의 대부분의 Dart 개발은 웹 애플리케이션을 위한 것이에요. 그중 가장 큰 것 중 하나가 웹 경제의 수십억 달러를 뒷받침하는 Google Ads예요. 그들은 코드를 Dart로 마이그레이션하면서, 개발자 생산성과 애플리케이션 품질을 개선하는 동시에 UI 코드베이스 크기를 40% 줄였어요.

핵심 Dart SDK가 현대 브라우저 API에 접근하는 라이브러리를 제공하는 동안, 우리는 복잡한 웹 애플리케이션을 만드는 견고한 Angular 스타일 프레임워크도 지원해요. Dart 2의 일부로 출시된 AngularDart 5는 Dart의 사운드 타입 시스템과 (아래 설명할) 새 빌드 시스템을 활용해서, 개발 중 빠른 증분 빌드와 배포할 때 더 작은 컴파일된 JavaScript를 제공해요.

이번 릴리스의 주요 초점 영역 하나는 페이지 로드 시 처리되는 코드의 양을 개선해서 웹 페이지의 'time to interactivity'(상호작용 가능 시간)를 크게 줄이는 것이었어요. 많은 앱이 AngularDart 4에 비해 코드 크기가 절반 이상 줄었다고 해요.

Dart 웹 플랫폼의 개선을 선보이기 위해 우리는 HackerNews 사이트의 Dart 기반 클라이언트 구현을 Progressive Web App으로 구축했어요. 이는 인기 HNPWA 사이트에 다른 샘플 구현들과 함께 게시됐어요. Dart 웹 앱을 만드는 모범 사례를 사용해서, 현대 기기에서 1초 만에, 느린 3G 네트워크의 보잘것없는 모바일 기기에서 5초 안에 완전히 상호작용 가능한 풀 페처(feature-full) 경험을 출시할 수 있었어요. 이는 더 작은 앱에 최적화된 가벼운 웹 프레임워크와도 경쟁력 있는 수치예요.

우리의 프레임워크 투자는 업데이트한 핵심 컴포넌트로도 이어져요. 이제 날짜, 시간, 메뉴 Material 컴포넌트를 포함해 100개의 새 클래스를 쓸 수 있어요. 모든 컴포넌트는 컴포넌트 갤러리에서 살펴볼 수 있어요.

Dart 2를 위한 유연한 도구

Dart 2로 Dart는 웹 개발자가 기대하는 개발 사이클과 훌륭한 런타임 성능 특성을 가진, 일급(first-class) JavaScript 컴파일 언어가 됐어요. 이는 대부분의 JS 대상 언어가 제공하지 못하는 이점을 제공하면서 이루어져요. 바로 사운드 타입 시스템과 네이티브 모바일 앱에 대한 훌륭한 지원이죠.

Dart 2에서 우리의 웹 도구는 두 개의 상호 보완적인 JavaScript 컴파일러와 함께 100% JavaScript 개발 모델을 받아들여요. 개발 컴파일러인 dartdevc는 읽고 디버깅하기 쉬운 JavaScript를 생성하면서 빠른 증분 컴파일을 제공해요. 이를 통해 프로덕션 컴파일러인 dart2js는 모바일용 progressive web app과 데스크톱용 복잡한 엔터프라이즈 경험을 위한 고도로 최적화된 JavaScript를 만드는 데 집중할 수 있어요. 두 컴파일러 모두 Dart의 사운드 타입 시스템을 활용해 출력을 최적화해요.

우리의 웹 도구는 새 빌드 시스템에 기반해요. 이 시스템은 빠르고, 디버깅 가능하며, 확장 가능하도록 설계됐어요. 이제 직렬화 코드 생성, Sass를 CSS로 컴파일, Dart를 JavaScript로 컴파일 같은 작업이, 애플리케이션의 일부를 바꾸면서 빠른 증분 업데이트를 지원하는 하나의 툴체인에서 이루어져요. 빌드 시스템은 웹 너머의 용도도 지원하도록 설계됐어요. 예를 들어 Flutter 개발자가 JSON 직렬화 코드를 생성하는 데 쓰고 있어요.

Dart 2로 개발자 도구 세트도 확장됐어요. Android StudioIntelliJ IDEA, WebStorm을 포함한 JetBrains 도구 모음 지원 외에도, Dart Code 확장으로 Visual Studio Code도 지원해요. 그리고 실험을 위한 훌륭한 스크래치패드인 DartPad도 있는데, Dart 2를 위해 완전히 업데이트됐어요.

마지막으로 Dart SDK는 다른 유용한 도구 모음과 함께 제공돼요. 우리의 패키지 사이트와 함께 동작하는 패키지 매니저, 정적 분석기, 커맨드라인이나 패키지로 사용할 수 있는 린터, 그리고 Dart 스타일 가이드를 따르는 웹 문서코드 포맷팅 도구가 여기 포함돼요.

더 알아보기

FlutterDart 웹 툴셋으로 시작하는 지침을 확인해 보세요.

릴리스 노트는 Dart 1 이후 이뤄진 수많은 더 작은 개선의 상세한 기술 분석을 제공해요. 그중 일부는 기존 Dart 코드에 대한 브레이킹 체인지예요. Google 검색으로 해결할 수 없는 문제가 생기면 StackOverflow에서 시작하는 걸 추천해요. 업데이트를 받으려면 Dart Announcements 메일링 리스트를 구독하고 Twitter에서 팔로우하세요. Gitter 채팅방이나 r/dartlang 서브레딧 같은 커뮤니티에서 여러분을 만나는 것도 기뻐요.

감사의 말

Dart는 웹과 모바일 개발에 최적화된 범용 언어가 됐어요. 우리는 몇 년 동안 Dart 2를 작업해 왔는데, 그동안 생태계의 모든 측면에 닿았고 수백만 줄의 코드와 수백 개의 패키지를 마이그레이션해야 했어요.

DartFlutter 커뮤니티, 그리고 이 여정을 도와준 수백 명의 Google 엔지니어에게 감사드려요. 여러분 없이는 해낼 수 없었을 거예요!

더 알아보기