iBetter Books
수정

Dart 프로젝트 생성과 실행

Dart SDK가 준비됐다면 이제 프로젝트를 만들 차례입니다. dart create 명령어 하나로 다양한 형태의 프로젝트를 시작할 수 있습니다. 각 템플릿이 어떤 구조를 생성하는지, 어떻게 실행하는지 실제로 해봅니다.


dart create 기본 사용법

dart create [옵션] <프로젝트명>

가장 단순한 형태입니다.

dart create my_project

옵션 없이 실행하면 기본 템플릿인 console이 사용됩니다.


프로젝트 템플릿 종류

-t 옵션으로 템플릿을 지정합니다.

dart create -t <템플릿> <프로젝트>
템플릿 용도
console CLI 프로그램 (기본값)
package 재사용 가능한 라이브러리 패키지
server-shelf shelf 기반 HTTP 서버
web 웹 앱 (dart2js 컴파일 대상)

이 교재에서는 console, package, server-shelf를 주로 사용합니다.


console 템플릿

가장 기본적인 CLI 프로그램 템플릿입니다.

dart create -t console hello_dartcd hello_dart

생성되는 구조입니다.

hello_dart/
├── bin/
│   └── hello_dart.dart    ← 진입점 (main 함수)
├── lib/
│   └── hello_dart.dart    ← 비즈니스 로직
├── test/
│   └── hello_dart_test.dart
├── pubspec.yaml
├── pubspec.lock
├── .dart_tool/
├── .gitignore
└── analysis_options.yaml

bin/hello_dart.dart를 열면 다음 내용이 보입니다.

import 'package:hello_dart/hello_dart.dart' as hello_dart;

void main(List<String> arguments) {
  print('Hello world: ${hello_dart.calculate()}!');
}

lib/hello_dart.dart에 비즈니스 로직이 들어갑니다.

int calculate() {
  return 6 * 7;
}

package 템플릿

다른 프로젝트에서 가져다 쓸 수 있는 라이브러리 패키지입니다.

dart create -t package my_utilscd my_utils
my_utils/
├── lib/
│   ├── my_utils.dart       ← 공개 API 진입점
│   └── src/
│       └── my_utils_base.dart  ← 실제 구현
├── test/
│   └── my_utils_test.dart
├── pubspec.yaml
└── analysis_options.yaml

bin/ 폴더가 없습니다. 패키지는 직접 실행하는 것이 아니라 다른 프로젝트에서 import 합니다.


server-shelf 템플릿

shelf 패키지를 사용하는 HTTP 서버 템플릿입니다.

dart create -t server-shelf my_apicd my_api
my_api/
├── bin/
│   └── server.dart         ← 서버 진입점
├── lib/
│   └── src/
│       └── handler.dart    ← 요청 처리 핸들러
├── test/
│   └── server_test.dart
├── pubspec.yaml
└── Dockerfile              ← Docker 배포용 파일 포함

bin/server.dart의 기본 내용입니다.

import 'package:my_api/src/handler.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;

void main() async {
  final server = await shelf_io.serve(
    handler,
    'localhost',
    8080,
  );
  print('Server running on port ${server.port}');
}

프로젝트 실행

dart run

프로젝트 루트에서 실행합니다.

# bin/ 안의 기본 파일 실행dart run# 특정 파일 실행dart run bin/hello_dart.dart# 패키지명으로 실행 (pubspec.yaml의 name 기준)dart run hello_dart

특정 파일 직접 실행

단일 .dart 파일은 dart 명령어로 바로 실행합니다.

# 스크립트처럼 직접 실행dart hello.dart# 또는dart run hello.dart

의존성 먼저 설치

처음 dart create로 만들면 의존성이 자동으로 설치됩니다. 하지만 git에서 clone 한 프로젝트라면 먼저 설치해야 합니다.

dart pub getdart run

핫 리로드와 감시 모드

Dart CLI에는 Flutter처럼 완전한 핫 리로드는 없지만, 파일 변경을 감지해 자동으로 재실행하는 --watch 모드가 있습니다.

참고: dart run --watch는 Dart 3.3+ 에서 지원됩니다.

# 파일 변경 시 자동 재실행dart run --watch# server-shelf 서버를 감시 모드로 실행dart run --watch bin/server.dart

--watch 없이 유사한 효과를 내려면 dart_frog dev(PART 06에서 다룸) 또는 watchexec 같은 외부 도구를 사용합니다.

# watchexec 설치 (macOS)brew install watchexec# 파일 변경 시 dart run 재실행watchexec -e dart dart run

컴파일과 배포

JIT 실행 (개발)

dart run bin/server.dart

AOT 컴파일 (프로덕션)

# 네이티브 실행 파일 생성dart compile exe bin/hello_dart.dart -o build/hello_dart# 실행 (런타임 불필요)./build/hello_dart

JavaScript 컴파일

dart compile js bin/hello_dart.dart -o build/hello_dart.js

VS Code에서 실행

터미널 없이 VS Code에서 바로 실행할 수 있습니다.

  1. bin/ 안의 .dart 파일을 엽니다.
  2. 상단 재생 버튼(▶) 클릭 또는 F5를 누릅니다.
  3. 하단 터미널 패널에 출력 결과가 나타납니다.

launch.json을 설정하면 실행 옵션을 저장할 수 있습니다.

// .vscode/launch.json{  "version": "0.2.0",  "configurations": [    {      "name": "Dart Run",      "type": "dart",      "request": "launch",      "program": "bin/hello_dart.dart"    }  ]}

프로젝트 생성 실습

세 가지 템플릿을 직접 만들어보겠습니다.

# 작업 폴더 생성mkdir ~/dart_practice && cd ~/dart_practice# console 프로젝트dart create -t console practice_clicd practice_cli && dart run && cd ..# package 프로젝트dart create -t package practice_libcd practice_lib && dart test && cd ..# server-shelf 프로젝트dart create -t server-shelf practice_apicd practice_apidart pub getdart run bin/server.dart &curl http://localhost:8080kill %1cd ..

정리

이번 챕터에서 다룬 내용입니다.

  • dart create -t <템플릿> 으로 프로젝트를 생성합니다.
  • console, package, server-shelf 세 가지 템플릿의 구조와 용도를 파악했습니다.
  • dart run으로 실행하고 --watch로 자동 재실행 모드를 활용합니다.
  • AOT 컴파일로 단일 실행 파일을 만들 수 있습니다.

다음 챕터에서는 VS Code 디버거와 dart analyze를 활용해 오류를 효율적으로 잡아내는 방법을 배웁니다.