Dart 2.10 발표 — 통합된 dart 도구와 null safety 로드맵
Dart 2.10 발표 — 통합된 dart 도구와 null safety 로드맵
Dart 2.10(two-dot-ten)는 프로젝트 생성, 코드 분석·포맷팅, 테스트, 앱 컴파일까지 하나로 모은 통합 dart 개발자 도구를 선보여요. 또 null safety 로드맵과 일정, 기존 코드를 null safety로 마이그레이션할 때의 원칙까지 함께 설명해요.
본문
By: Michael Thomsen & Kevin Moore
오늘 우리는 Dart의 새 릴리스, 버전 2.10(two-dot-ten)을 발표해요. 이번 릴리스는 새롭게 통합된 Dart 개발자 도구를 담고 있어요. 프로젝트 생성, 코드 분석·포맷팅, 테스트 실행, 앱 컴파일 같은 모든 개발자 요구를 위한 단일 도구죠. 또 null safety 로드맵과 일정에 대한 업데이트, 그리고 기존 코드를 null safety로 마이그레이션하는 원칙에 대한 논의도 포함돼 있어요.
새롭게 통합된 Dart 개발자 도구
Dart는 Flutter SDK의 기반을 이뤄요. Flutter 앱을 구동하는 언어와 런타임을 제공할 뿐 아니라, 포맷팅·분석·테스트 같은 많은 핵심 개발자 작업도 지원해요. 그런데 Flutter가 단일한 범용 개발자 도구(flutter 명령)를 갖는 반면, Dart는 역사적으로 많은 작은 개발자 도구(예: dartfmt, dartanalyzer)를 가져 왔어요. Dart 2.10에는 flutter 도구와 매우 유사한, 새롭게 통합된 dart 개발자 도구가 있어요. 이 새 도구는 새 프로젝트와 패키지 생성, 코드 분석·포맷팅, 프로젝트 실행·컴파일·테스트 같은 모든 일반적인 작업을 지원해요. 사용하려면 간단히 dart 명령을 실행하면 돼요.
dart help를 실행해서 2.10 dart 도구에 대해 알아볼 수 있어요.
Flutter는 Flutter SDK에 이 새 Dart 도구를 포함해요. 오늘 출시된 Flutter 1.22 SDK부터, PATH에 있을 법한 <flutter-sdk>/bin 디렉터리에는 flutter와 dart 명령이 모두 들어 있어요. Flutter 개발과 일반적인 Dart 개발을 모두 한다면, 다른 것을 추가로 설치할 필요 없이 단일 Flutter SDK에서 두 개발자 경험을 모두 얻을 수 있어요.
참고: 두 번째 Dart SDK를 다운로드해 설치하고 싶다면(아마 다른 버전이 필요해서겠죠), 기본으로 쓰고 싶은
dart도구의 SDK가PATH환경변수 맨 앞에 오는지 확인하세요.
다가올 안정 릴리스들에서 우리는 이 dart 도구에 더 많은 기능을 추가하고, 더 작은 도구들(dartdoc, dartfmt, dartanalyzer 등)을 점진적으로 deprecated 처리할 계획이에요. 내년에는 단일 dart 도구만 담은 Dart SDK를 배포할 것으로 예상해요. 지금부터 Dart 명령을 실행할 때 — 터미널에서 수동으로든 CI(지속적 통합) 스크립트에서든 — 새 도구로 전환할 것을 권장해요. 빠지거나 의도대로 동작하지 않는 것이 있으면 피드백을 주세요.
null safety를 기대하며
몇 달 전 첫 기술 프리뷰를 출시한 이후 null safety에 대한 강한 관심을 경험했어요. 우리 모두 null safety를 찾기 어려운 null 오류를 피하는 도구로, 그리고 보너스로 사운드 null safety에서 기대하는 성능 개선도 기대하고 있어요. 더 자세히 배우고 싶다면 새 Understanding null safety 페이지를 추천해요. 짧은 영상을 선호한다면 몇 달 전 Flutter Day 이벤트의 null safety 영상을 확인해 보세요.
null safety를 언제 쓸 수 있을까요? 현재 일정은 다음과 같아요.
- Flutter에서 technical preview 2로 실험: 우리는 Flutter의 대부분을 성공적으로 마이그레이션했어요. 곧 — 아마 다음 달 안에 — 완전한 Flutter 프레임워크 마이그레이션을 마치고 Flutter에서 실험적 사용을 활성화할 준비가 될 거예요. Flutter 샘플에서 null safety를 시도하고, Flutter 앱과 패키지의 시험 마이그레이션도 할 수 있을 거예요. 실험 플래그를 전달해야 하고, 프로덕션에 쓰거나 마이그레이션한 패키지를 게시하면 안 돼요.
- beta로 조기 패키지 마이그레이션: 올해 후반에 성능 튜닝을 마치고, 기능이 의도대로 동작하고 하위 호환성이 견고하다는 확신을 줄 충분한 테스트 커버리지를 갖추게 될 거예요. 그 시점에 기능의 베타 버전을 게시하고, 실험 플래그를 전달할 필요가 없어질 거예요. 패키지 소유자들이 기능이 안정 릴리스에 준비됐다는 마지막 검증을 겸해 자신의 패키지를 null safety로 마이그레이션하기 시작하길 바래요.
- stable로 프로덕션 사용: 베타 출시의 피드백에 따라 남은 문제를 고친 뒤 stable로 게시할 거예요. 구체적인 일정을 말하긴 어렵지만, 내년 초를 생각하고 있어요. 기능이 stable이 되면 null safety가 널리 채택되어, 스토어에 null-safe 앱이 게시되고 pub.dev에 안정 버전의 null-safe 패키지가 많이 게시되길 바래요.
null safety로 마이그레이션하는 원칙
우리의 null safety 마이그레이션 지침 원칙을 공유하고 싶어요.
준비가 되면 도입하세요
null safety는 Dart 타입 시스템에 대한 근본적인 변화예요. 변수 선언의 기본을 바꾸는데, 우리는 변수를 기본적으로 non-nullable로 만들기로 결정했기 때문이에요.
String s; // A String or null. String s; // A String, not null.
이런 근본적인 변화는 강제 도입을 고집한다면 엄청나게 파괴적일 거예요. 우리는 여러분이 때가 됐다고 판단할 때 결정하도록 하고 싶어요. 그래서 null safety는 옵트인(opt-in) 기능이에요. 준비가 되기 전에는 null safety를 켜도록 강요받지 않고 최신 Dart와 Flutter 릴리스를 쓸 수 있어요. 아직 null safety를 켜지 않은 앱이나 패키지에서 이미 null safety를 켠 패키지에 의존하는 것도 가능해요.
단계적으로, 순서대로 도입하세요
우리는 코드를 순서대로 마이그레이션할 것을 강력히 권장해요. 의존성 그래프의 잎(leaf)부터 마이그레이션하는 식이에요. 예를 들어 C가 B에 의존하고 B가 A에 의존한다면, A를 null safety로 먼저 마이그레이션하고 그다음 B, 그다음 C 순서예요. A, B, C가 라이브러리든 패키지든 앱이든 이 순서가 적용돼요.
왜 순서가 중요할까요? 의존성이 마이그레이션되기 전에 코드를 마이그레이션해서 어느 정도 진전을 이룰 수는 있지만, 의존성이 마이그레이션 중 API를 바꾸면 두 번째 마이그레이션 작업을 해야 할 위험이 있어요. 우리는 어떤 의존성이 마이그레이션됐는지 찾는 데 도움이 되는 도구를 제공할 거예요. 패키지 작성자라면 API가 깨질 위험을 피하기 위해, 모든 의존성이 마이그레이션될 때까지 기다렸다가 null-safe 버전을 게시하세요.
자동화된 도구로 마이그레이션 비용 줄이기
의존성이 준비되고 마이그레이션을 하기로 정했다면, 우리의 마이그레이션 도구를 쓸 수 있어요. 이 도구는 기존 코드를 모두 분석해서 어떤 선언이 non-nullable일 수 있는지(그대로 두기), 어떤 것이 nullable이어야 하는지(선언에 ? nullability 표식이 필요)를 찾아요.
마이그레이션 도구는 대화형이라서, 도구가 추론한 nullability 속성을 검토할 수 있어요. 도구의 결론에 동의하지 않으면 nullability 힌트를 추가해 추론을 바꿀 수 있어요. 예를 들어 일부 리팩터링이 필요하더라도 API를 non-nullable로 만들고 싶다면, 도구에 알리고 마이그레이션 분석을 다시 실행하면 돼요. 마이그레이션 힌트 몇 개를 추가하는 것만으로도 마이그레이션 품질에 큰 영향을 줄 수 있어요.
완전히 사용해야 완전한 이점
모든 코드 — 그리고 의존하는 패키지 — 가 마이그레이션되면, 코드를 사운드 null safety로 실행할 수 있어요. 그 전까지 코드는 지금처럼 실행·컴파일되지만, 완전히 사운드한 null safety는 완전한 런타임 검증과 컴파일러 최적화를 가능하게 해요. 사운드 null safety로 테스트를 실행하면 런타임 null 어설션 문제를 피하는 데 도움이 되고, 사운드 null safety로 앱을 컴파일하면 더 작은 컴파일 출력과 더 빠른 실행 같은 현재·미래의 최적화를 보장받을 수 있어요.
다음 단계
새 dart 개발자 도구는 오늘부터 Dart 2.10 SDK와 Flutter 1.22 SDK에서 사용할 수 있어요. 이미 Flutter SDK가 있다면, flutter upgrade를 실행하기만 해도 dart 명령이 있는 Dart SDK를 얻을 수 있어요. 이걸로 Dart 2.10이 내장된 Flutter 1.22 SDK를 얻게 될 거예요. 우리는 새 dart 도구로 즉시 전환하고, 빠지거나 의도대로 동작하지 않는 것이 있으면 피드백을 주시길 권장해요.
null safety에 대한 소식이 곧 — 아마 다음 달 안에 — 더 있을 거예요. Flutter 팀이 실험에 쓸 수 있도록 null-safety 지원 Flutter 프레임워크를 준비할 것으로 기대하고 있어요. 업데이트는 Flutter 블로그에서 지켜봐 주세요. 그동안 Null Safety가 적용된 DartPad로 null-safe Dart 코드를 실험해 보고, null safety 문서를 읽어 기능 설계를 더 알아볼 수 있어요.