방구석 IT

[Language] Dart 본문

실무 탐방/기술 탐방 및 소개

[Language] Dart

펭잉 2026. 6. 16. 12:31

Dart란?


Dart는 Google이 주도하는 클라이언트 중심 프로그래밍 언어다. 공식 문서는 Dart를 여러 플랫폼에서 빠른 앱을 만들기 위한 언어로 설명하며, Flutter와 함께 모바일, 웹, 데스크톱, 서버 도구까지 하나의 코드베이스로 다루는 생태계를 형성한다. 언어 자체는 C 계열 문법에 가깝지만, 사운드 널 세이프티, async/await, isolate 기반 동시성, JIT와 AOT를 모두 고려한 런타임을 핵심 특징으로 가진다.

Dart를 이해할 때 중요한 점은 “Flutter용 언어”로만 좁히지 않는 것이다. Flutter가 Dart 확산의 가장 큰 동력이지만, Dart SDK는 CLI 애플리케이션, 서버 사이드 프로그램, 코드 생성 도구, 테스트 도구, 웹 컴파일 타깃도 함께 제공한다. 즉 Dart는 UI 프레임워크에 붙어 있는 스크립트 언어가 아니라, 개발 생산성과 배포 성능 사이의 균형을 목표로 설계된 범용 언어에 가깝다.

Dart 로고는 Dart 언어 생태계의 공식 식별자로, Flutter 중심 앱 개발과 Dart SDK 기반 도구 개발을 함께 대표한다. 출처: Wikimedia Commons, Dart programming language logo.svg, Creative Commons Attribution 4.0 International.

Dart는 빠른 개발 피드백과 네이티브 수준 배포 성능을 동시에 노리는 언어이며, Flutter와 Dart SDK 생태계의 공통 기반이다.

실행 모델: JIT와 AOT를 함께 쓰는 언어


Dart의 강점은 개발 단계와 배포 단계에서 다른 실행 방식을 선택할 수 있다는 점이다. 개발 중에는 Dart VM의 JIT 실행을 활용해 빠른 재시작, 디버깅, hot reload 같은 피드백 루프를 만든다. 특히 Flutter 개발에서 UI 변경을 즉시 확인하는 경험은 이 구조에 크게 의존한다.

반대로 배포 단계에서는 AOT 컴파일을 통해 네이티브 기계어로 미리 변환할 수 있다. 모바일 앱이나 운영용 CLI, 서버 실행 파일에서는 시작 시간과 예측 가능한 성능이 중요하기 때문에 AOT가 유리하다. 웹에서는 JavaScript 또는 WebAssembly 계열 타깃으로 컴파일하는 경로도 존재한다. 이처럼 Dart는 “개발할 때 빠른 언어”와 “배포할 때 빠른 언어”를 분리해서 접근한다.

Dart 실행 모델은 개발 단계의 JIT, 배포 단계의 AOT, 그리고 isolate 기반 동시성을 조합해 플랫폼별 요구사항을 맞춘다.

Dart는 하나의 실행 방식에 고정되지 않고, 개발 생산성에는 JIT를, 운영 배포에는 AOT를 활용하는 구조를 가진다.

타입 시스템과 널 세이프티


Dart는 정적 타입 언어지만 타입 추론을 적극적으로 제공한다. 변수와 함수 시그니처에 타입을 명시할 수 있고, 문맥상 명확한 경우에는 컴파일러가 타입을 추론한다. 이 방식은 JavaScript보다 안정적인 리팩터링과 IDE 지원을 제공하면서도, Java나 C#처럼 모든 타입을 장황하게 적어야 하는 부담을 줄인다.

널 세이프티는 Dart 2.12 이후 중요한 전환점이 됐다. 기본적으로 변수는 null이 될 수 없고, null을 허용하려면 타입에 물음표를 붙여야 한다. 이 규칙은 런타임 NullPointer 계열 오류를 줄이고, API 계약을 코드에 명확히 남긴다. Flutter 위젯 트리처럼 상태와 비동기 이벤트가 섞이는 코드에서는 이 차이가 유지보수성에 직접 영향을 준다.

Dart의 타입 시스템은 정적 안정성과 빠른 개발 경험을 동시에 노리며, 널 세이프티는 앱 코드의 흔한 런타임 오류를 줄이는 핵심 장치다.

동시성: 스레드 공유보다 isolate 분리


Dart의 동시성 모델은 isolate를 중심으로 구성된다. 일반적인 스레드 모델은 여러 스레드가 같은 메모리를 공유하고 락으로 동기화하지만, Dart isolate는 각자 독립된 메모리와 이벤트 루프를 가진다. isolate 사이의 통신은 메시지 전달로 이뤄진다.

이 구조는 공유 상태 경쟁 조건을 줄이는 데 유리하다. 대신 큰 데이터를 자주 주고받으면 직렬화와 전달 비용이 생길 수 있다. 따라서 isolate는 모든 비동기 작업에 쓰는 도구가 아니라, UI를 막을 정도의 CPU 작업, 이미지 처리, 대량 파싱, 암호화 연산처럼 분리 비용보다 병렬화 이점이 큰 작업에 적합하다.

Dart isolate는 공유 메모리 기반 스레드보다 안전한 동시성 모델을 제공하지만, 메시지 전달 비용을 고려해 적용 범위를 선택해야 한다.

생태계와 사용처


Dart의 대표 사용처는 Flutter 앱 개발이다. Flutter는 iOS, Android, 웹, 데스크톱을 한 코드베이스로 겨냥하며, Dart는 UI 선언, 상태 관리, 비동기 I/O, 패키지 생태계를 담당한다. pub.dev 패키지 저장소, Dart analyzer, formatter, test, DevTools 같은 도구는 앱 개발의 기본 작업을 일관된 방식으로 묶어 준다.

서버나 CLI에서도 Dart는 선택지가 될 수 있다. 자체 실행 파일로 빌드할 수 있고, 타입 시스템과 async I/O를 활용해 도구성 프로그램을 만들기 쉽다. 다만 서버 생태계의 성숙도, 운영 레퍼런스, 라이브러리 폭은 Java, Go, Node.js, Python에 비해 좁을 수 있다. 팀이 Dart를 서버까지 확장하려면 Flutter와의 코드 공유 가치, 조직의 언어 표준, 관측성과 배포 도구 호환성을 함께 따져야 한다.

Dart는 Flutter에서 가장 강한 선택지지만, CLI와 서버에서도 사용할 수 있다. 다만 운영 생태계의 폭은 선택 전에 검토해야 한다.

선택 기준과 한계


  • 선택하기 좋은 경우: Flutter 기반 멀티플랫폼 앱, 빠른 UI 반복 개발, 모바일과 웹을 함께 고려하는 제품, 타입 안정성이 필요한 클라이언트 코드에 적합하다.
  • 주의할 경우: Flutter를 쓰지 않는 백엔드 중심 조직, 매우 큰 서버 생태계가 필요한 프로젝트, 특정 네이티브 SDK와 깊게 결합된 앱에서는 추가 검토가 필요하다.
  • 운영 관점: AOT 빌드, 패키지 버전 관리, 플랫폼별 네이티브 플러그인, isolate 사용 비용, Flutter 엔진 업데이트 주기를 함께 관리해야 한다.

Dart의 강점은 언어 자체보다 “언어, 프레임워크, 툴체인, 런타임”이 같은 방향으로 설계되어 있다는 데 있다. 반대로 이 결합이 약점이 될 수도 있다. Flutter를 쓰지 않는 환경에서는 Dart를 선택해야 할 이유가 줄어들고, Flutter에 강하게 의존하는 앱은 Flutter 엔진과 플러그인 생태계 변화에 민감해진다.

Dart 선택은 단순히 문법 취향이 아니라 Flutter, 툴체인, 배포 타깃, 팀의 운영 경험까지 포함한 생태계 선택이다.

사례


  • Dart official overview: Dart 공식 문서는 Dart를 여러 플랫폼에서 빠른 앱을 개발하기 위한 client-optimized 언어로 설명한다. 이 사례는 Dart가 단순한 Flutter 부속 문법이 아니라 앱 프레임워크와 툴체인을 받치는 범용 언어라는 점을 보여 준다. 출처: Dart overview
  • Dart language concurrency: Dart 공식 동시성 문서는 Future, Stream, event loop, isolate를 함께 설명한다. 이는 Dart가 비동기 I/O와 병렬 계산을 같은 모델로 뭉뚱그리지 않고, 이벤트 기반 비동기와 isolate 기반 병렬 처리를 분리해서 다룬다는 사례이다. 출처: Concurrency in Dart
  • Dart isolate guide: Dart isolate 문서는 큰 계산이 다른 작업을 일시적으로 막을 수 있을 때 isolate를 사용하라고 설명한다. Flutter 앱의 JSON 파싱, 이미지 처리, 암호화 연산처럼 UI 응답성을 해칠 수 있는 작업을 main isolate 밖으로 분리하는 운영 패턴을 뒷받침한다. 출처: Isolates
  • Flutter concurrency and isolates: Flutter 문서는 모든 Dart 코드가 isolate에서 실행되며 isolate가 독립 메모리를 가지고 메시지로만 통신한다고 설명한다. 이 사례는 Flutter 앱에서 main isolate가 UI 프레임을 담당하고, 무거운 작업은 별도 isolate로 분리해야 하는 이유를 보여 준다. 출처: Flutter concurrency and isolates
  • Dart VM documentation: Dart VM 문서는 개발용 JIT 실행과 배포용 AOT 컴파일, snapshot, 런타임 구조를 설명한다. 이는 Dart가 빠른 개발 피드백과 릴리스 성능을 서로 다른 실행 경로로 해결하는 언어라는 점을 보여 주는 사례이다. 출처: Introduction to Dart VM

'실무 탐방 > 기술 탐방 및 소개' 카테고리의 다른 글

[Language] ABAB  (0) 2026.06.18
[Language] Bash  (0) 2026.06.17
[Language] Swift  (0) 2026.06.15
[Language] Go  (0) 2026.06.12
[Language] Kotlin  (0) 2026.06.12