# 기본 Dart 프로젝트 생성

#### Dart SDK 설치 확인

기본 Dart 프로젝트를 생성하기 전에, Dart SDK가 정상적으로 설치되었는지 확인하는 것이 중요하다. 터미널이나 명령 프롬프트를 열고, 다음 명령어를 입력하여 설치가 완료되었는지 확인한다:

```bash
dart --version
```

이 명령어를 통해 Dart 버전을 확인할 수 있으며, 만약 버전 정보가 제대로 표시되지 않는다면 Dart SDK가 제대로 설치되지 않았거나 경로 설정에 문제가 있을 수 있다.

#### 새로운 Dart 프로젝트 생성

Dart에서 제공하는 기본 프로젝트 템플릿을 사용하여 빠르게 프로젝트를 시작할 수 있다. Dart SDK에는 프로젝트 생성을 위한 템플릿이 내장되어 있으며, 이를 이용하여 다양한 유형의 프로젝트를 쉽게 생성할 수 있다. 터미널에서 프로젝트를 생성하는 방법은 다음과 같다:

```bash
dart create my_project
```

위 명령어는 `my_project`라는 이름의 새로운 Dart 프로젝트를 생성한다. 프로젝트 이름은 원하는 대로 변경할 수 있으며, 이 명령어를 실행하면 기본적으로 다음과 같은 디렉터리 구조가 생성된다:

```plaintext
my_project/
│
├── bin/
│   └── my_project.dart
├── lib/
├── test/
└── pubspec.yaml
```

각 디렉터리와 파일의 의미는 다음과 같다:

* `bin/`: 실행 가능한 스크립트 파일들이 위치하는 디렉터리이다. 기본적으로 `my_project.dart` 파일이 생성되며, 이 파일이 프로젝트의 진입점이 된다.
* `lib/`: 외부에서 사용할 수 있는 라이브러리 파일들이 위치하는 곳이다. 보통 메인 로직 파일은 여기에 작성한다.
* `test/`: 테스트 파일을 저장하는 곳이다. Dart에서 지원하는 단위 테스트 및 통합 테스트 코드를 여기에 작성한다.
* `pubspec.yaml`: 프로젝트 의존성 및 메타데이터를 정의하는 파일이다. 여기에서 패키지 관리, 버전 정보 등을 설정할 수 있다.

#### pubspec.yaml 설정

`pubspec.yaml` 파일은 Dart 프로젝트에서 매우 중요한 역할을 한다. 이 파일은 프로젝트의 의존성을 관리하며, Dart 패키지 매니저인 Pub을 통해 패키지를 설치하고 관리할 수 있다. 기본적으로 생성된 `pubspec.yaml` 파일의 구조는 다음과 같다:

```yaml
name: my_project
description: A new Dart project.
version: 1.0.0
environment:
  sdk: '>=2.12.0 <3.0.0'

dependencies:
  # 여기에 프로젝트에서 필요한 패키지들을 추가한다.
dev_dependencies:
  # 여기에 개발 중에만 필요한 패키지들을 추가한다.
```

* `name`: 프로젝트의 이름을 설정한다.
* `description`: 프로젝트에 대한 간단한 설명을 작성한다.
* `version`: 프로젝트의 버전을 설정한다.
* `environment`: SDK 버전 호환성을 설정하는 곳으로, 프로젝트가 지원하는 Dart 버전 범위를 명시한다.
* `dependencies`: 프로젝트에서 사용하는 패키지를 명시하는 곳이다. 예를 들어, HTTP 요청을 위한 패키지를 추가할 수 있다.
* `dev_dependencies`: 개발 과정에서만 사용하는 패키지를 설정하는 곳이다. 예를 들어, 테스트 패키지나 코드 포맷팅 도구를 추가할 수 있다.

이 파일을 수정한 후, 필요한 패키지를 설치하려면 터미널에서 다음 명령어를 실행한다:

```bash
dart pub get
```

이 명령어는 `pubspec.yaml`에 정의된 의존성을 설치하고, 프로젝트 내에서 사용할 수 있도록 설정한다.

#### 프로젝트 실행

Dart 프로젝트를 생성하고 설정을 완료한 후, 작성한 코드를 실행하여 동작을 확인할 수 있다. 기본적으로 생성된 `bin/my_project.dart` 파일은 다음과 같이 작성되어 있다:

```dart
void main() {
  print('Hello, World!');
}
```

이 코드를 실행하려면 터미널에서 다음 명령어를 입력한다:

```bash
dart run
```

위 명령어를 통해 `bin/` 디렉터리에 있는 Dart 스크립트가 실행되며, 터미널에 "Hello, World!"라는 메시지가 출력된다.

#### 프로젝트 구조 설명

앞서 기본적인 프로젝트 구조에 대해 설명했지만, 각 디렉터리와 파일을 더 구체적으로 살펴보자. 이러한 구조는 Dart 프로젝트를 체계적으로 관리하는 데 도움을 준다.

**1. `bin/` 디렉터리**

`bin/` 디렉터리는 Dart 프로젝트의 진입점(Entry Point)이 되는 파일을 저장하는 곳이다. 여기에서 실행 가능한 Dart 프로그램 파일을 작성할 수 있다. 기본적으로 생성되는 파일은 `my_project.dart`이다. 이 파일에 필요한 코드를 작성하고, 이를 통해 프로그램을 실행할 수 있다.

예를 들어, 프로그램의 주요 실행 파일에 프로그램 진입점 코드를 작성할 수 있다:

```dart
void main() {
  print('프로그램이 실행된다.');
}
```

이 디렉터리 안에는 여러 실행 파일을 둘 수 있으며, 프로그램의 다양한 실행 방식에 맞춰 파일을 분리하여 관리할 수도 있다. 프로젝트의 주요 실행 파일들은 `bin/` 디렉터리 안에 위치시켜 효율적인 코드 관리를 할 수 있다.

**2. `lib/` 디렉터리**

`lib/` 디렉터리는 프로젝트의 핵심 라이브러리 파일들이 위치하는 곳이다. 외부 프로젝트에서 이 프로젝트를 라이브러리로 사용하려면, 이 디렉터리 안에 있는 파일들이 노출된다. `lib/` 폴더는 Dart 프로젝트에서 기본적으로 라이브러리 파일을 관리하는 표준 위치이며, 코드를 모듈화하고 재사용성을 높이는 데 사용된다.

예를 들어, `lib/` 디렉터리에는 핵심 로직을 모듈화한 코드를 작성할 수 있다:

```dart
// lib/my_library.dart
String getGreeting(String name) {
  return 'Hello, $name!';
}
```

`lib/` 디렉터리에 정의된 코드는 `bin/` 디렉터리나 외부 프로젝트에서도 쉽게 참조할 수 있다.

**3. `test/` 디렉터리**

`test/` 디렉터리는 테스트 코드를 관리하는 곳이다. Dart는 기본적으로 강력한 테스트 프레임워크를 제공하며, 이 디렉터리에서 유닛 테스트(Unit Test)나 통합 테스트(Integration Test)를 작성하여 프로젝트의 코드가 제대로 동작하는지 확인할 수 있다.

예를 들어, `test/` 디렉터리에 간단한 테스트 파일을 작성할 수 있다:

```dart
import 'package:test/test.dart';
import 'package:my_project/my_library.dart';

void main() {
  test('getGreeting 함수 테스트', () {
    expect(getGreeting('Dart'), 'Hello, Dart!');
  });
}
```

이 코드는 `lib/` 디렉터리에서 작성한 `getGreeting` 함수에 대한 테스트를 작성한 것이다. `dart test` 명령어를 통해 테스트를 실행하고, 함수가 기대하는 대로 동작하는지 확인할 수 있다.

**4. `pubspec.yaml` 파일**

`pubspec.yaml` 파일은 프로젝트의 패키지 관리를 위한 설정 파일이다. Dart에서 제공하는 Pub 패키지 매니저를 통해 의존성 패키지를 설치하고 관리할 수 있다. 이 파일에서 의존성을 추가하면, 해당 의존성들이 자동으로 다운로드되어 프로젝트에서 사용 가능하게 된다.

또한, 이 파일은 프로젝트의 버전, 이름, 설명 등도 정의한다. 예를 들어, 프로젝트의 설명을 변경하고 의존성을 추가하는 방법은 다음과 같다:

```yaml
name: my_project
description: My first Dart project.
version: 1.0.1
dependencies:
  http: ^0.13.3
```

위 설정을 추가하고 `dart pub get` 명령어를 실행하면, `http` 패키지가 프로젝트에 추가되고 네트워크 요청을 쉽게 처리할 수 있게 된다.

#### 프로젝트 템플릿 선택

Dart는 다양한 템플릿을 제공하여 프로젝트를 쉽게 시작할 수 있도록 돕는다. 기본적으로는 단순한 콘솔 애플리케이션 템플릿이 생성되지만, 웹 애플리케이션이나 서버 애플리케이션 템플릿도 선택할 수 있다.

**서버 애플리케이션 템플릿**

서버 애플리케이션 프로젝트를 시작하려면, Dart의 서버 템플릿을 사용할 수 있다. 이 템플릿은 HTTP 서버를 빠르게 구성할 수 있도록 해준다. 다음 명령어를 통해 서버 애플리케이션 프로젝트를 생성할 수 있다:

```bash
dart create -t server-shelf my_server_project
```

이 명령어는 `server-shelf` 템플릿을 사용하여 서버 애플리케이션을 생성한다. 이 템플릿은 기본적인 HTTP 서버가 설정되어 있어, 간단한 웹 서버를 빠르게 구현할 수 있다.

#### 웹 애플리케이션 템플릿

Dart는 웹 애플리케이션 개발을 위한 템플릿도 제공한다. 이 템플릿을 사용하면 HTML, CSS와 함께 동작하는 Dart 코드를 작성할 수 있다. Dart는 브라우저에서도 실행될 수 있기 때문에, 웹 애플리케이션을 개발하는 데 매우 적합한 언어이다.

웹 애플리케이션 프로젝트를 생성하려면, 다음 명령어를 사용할 수 있다:

```bash
dart create -t web my_web_project
```

이 명령어를 실행하면 `my_web_project`라는 이름의 웹 애플리케이션 프로젝트가 생성된다. 프로젝트 디렉터리 구조는 다음과 같다:

```plaintext
my_web_project/
│
├── web/
│   └── index.html
├── lib/
│   └── main.dart
└── pubspec.yaml
```

각 파일과 디렉터리의 역할은 다음과 같다:

* `web/`: 웹 애플리케이션의 정적 파일들을 저장하는 디렉터리이다. `index.html` 파일이 기본적으로 생성되며, HTML 및 기타 웹 자산을 여기에서 관리한다.
* `lib/`: Dart 코드를 작성하는 디렉터리이다. 여기에는 `main.dart` 파일이 포함되며, 이 파일에서 웹 애플리케이션의 로직을 구현한다.
* `pubspec.yaml`: 의존성을 관리하는 파일이다. Dart 패키지 매니저인 Pub을 통해 웹 애플리케이션에서 사용할 패키지를 설치할 수 있다.

`main.dart` 파일은 다음과 같이 기본 설정이 되어 있다:

```dart
void main() {
  querySelector('#output')?.text = 'Hello, Dart!';
}
```

위 코드는 `index.html` 파일에서 `#output`으로 정의된 HTML 요소에 텍스트를 출력하는 예제이다. Dart의 `querySelector` 함수를 사용하여 HTML 요소를 선택하고, 해당 요소의 텍스트를 수정하는 방식으로 웹 페이지에 동적으로 데이터를 출력할 수 있다.

#### Flutter 프로젝트 템플릿

Dart를 사용하여 모바일 애플리케이션 개발을 하고자 한다면, Flutter 프로젝트 템플릿을 사용할 수 있다. Flutter는 Dart를 기반으로 한 프레임워크로, 안드로이드와 iOS를 모두 지원하는 크로스 플랫폼 모바일 애플리케이션을 개발할 수 있다.

Flutter 프로젝트를 생성하려면 먼저 Flutter SDK를 설치해야 한다. 설치가 완료된 후, Flutter 템플릿을 사용하여 새로운 프로젝트를 생성할 수 있다:

```bash
flutter create my_flutter_project
```

이 명령어는 `my_flutter_project`라는 Flutter 애플리케이션 프로젝트를 생성한다. Flutter 프로젝트의 디렉터리 구조는 Dart의 기본 프로젝트와는 다소 다르다:

```plaintext
my_flutter_project/
│
├── android/
├── ios/
├── lib/
│   └── main.dart
└── pubspec.yaml
```

각 디렉터리와 파일의 역할은 다음과 같다:

* `android/`, `ios/`: 각각 안드로이드와 iOS 플랫폼에 대한 설정 파일들이 포함된 디렉터리이다. 모바일 애플리케이션이 특정 플랫폼에서 어떻게 빌드되고 실행될지를 설정한다.
* `lib/`: Flutter 애플리케이션의 메인 로직을 작성하는 디렉터리이다. `main.dart` 파일에서 앱의 UI와 동작을 정의한다.
* `pubspec.yaml`: 의존성 관리 파일로, Flutter에서 사용하는 패키지와 자산을 설정한다.

Flutter의 `main.dart` 파일은 기본적으로 다음과 같이 설정되어 있다:

```dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Demo'),
        ),
        body: Center(
          child: Text('Hello, Flutter!'),
        ),
      ),
    );
  }
}
```

Flutter에서 Dart는 주로 UI 요소와 상호작용하며, Flutter 위젯을 사용하여 앱의 화면을 구성한다. 위 예제는 간단한 Flutter 애플리케이션으로, 텍스트를 화면 중앙에 표시하는 방식이다.

#### 의존성 관리 및 패키지 사용

Dart 프로젝트에서 외부 라이브러리 또는 패키지를 사용하는 것은 매우 중요하다. Dart 생태계는 다양한 패키지를 제공하며, 이를 통해 프로젝트의 기능을 확장할 수 있다. Dart 패키지 매니저인 Pub을 사용하여 쉽게 의존성을 추가하고 관리할 수 있다.

**Pub.dev에서 패키지 검색 및 설치**

패키지를 설치하기 위해서는 먼저 Pub.dev에서 적합한 패키지를 검색해야 한다. Pub.dev는 Dart와 Flutter 패키지를 호스팅하는 사이트로, 다양한 패키지를 검색하고 설치할 수 있는 플랫폼이다. 웹사이트에서 검색 필터를 사용하여 프로젝트에 필요한 기능을 제공하는 패키지를 찾을 수 있다.

필요한 패키지를 찾으면, `pubspec.yaml` 파일에 해당 패키지를 추가해야 한다. 예를 들어, HTTP 요청을 처리하는 `http` 패키지를 추가하려면, `pubspec.yaml` 파일에 다음과 같이 명시한다:

```yaml
dependencies:
  http: ^0.13.3
```

이 설정을 추가한 후, 터미널에서 다음 명령어를 실행하여 패키지를 설치한다:

```bash
dart pub get
```

이 명령어는 `pubspec.yaml`에 명시된 모든 의존성을 다운로드하고 프로젝트에서 사용할 수 있도록 설정한다.

**의존성 관리**

의존성을 관리하는 것은 프로젝트 유지보수에 매우 중요하다. Dart에서는 패키지의 버전을 직접 관리할 수 있으며, 특정 버전 범위를 지정하여 의존성 충돌을 방지할 수 있다. `pubspec.yaml` 파일에서 버전 제약을 설정하는 방법은 다음과 같다:

```yaml
dependencies:
  http: '>=0.13.0 <0.14.0'
```

이 설정은 `http` 패키지의 버전이 `0.13.0` 이상, `0.14.0` 미만인 경우에만 해당 패키지를 설치하도록 제한한다. 이는 다른 패키지와의 버전 충돌을 방지하고, 안정적인 빌드를 유지하는 데 도움이 된다.

**개발 의존성**

일반적인 의존성 외에도, Dart에서는 개발 중에만 사용하는 패키지들을 따로 관리할 수 있다. 이를 개발 의존성(`dev_dependencies`)이라고 하며, 주로 테스트 프레임워크나 코드 포맷팅 도구 등이 여기에 포함된다.

예를 들어, 테스트 패키지를 개발 의존성에 추가하는 방법은 다음과 같다:

```yaml
dev_dependencies:
  test: ^1.16.0
```

이 설정을 통해 테스트 패키지를 프로젝트에서 사용할 수 있으며, 개발 및 테스트 단계에서만 해당 패키지가 필요하다. 실행 단계에서는 이 의존성들이 포함되지 않으므로, 프로젝트의 크기를 최소화할 수 있다.

#### 패키지 업그레이드

프로젝트에서 사용 중인 패키지를 최신 버전으로 업그레이드하는 것도 중요하다. Dart의 Pub 패키지 매니저는 이를 자동으로 처리할 수 있도록 도와준다. 모든 패키지를 최신 버전으로 업그레이드하려면, 다음 명령어를 사용한다:

```bash
dart pub upgrade
```

이 명령어는 `pubspec.yaml` 파일에서 지정된 범위 내에서 가장 최신 버전의 패키지를 다운로드한다. 만약 특정 패키지를 최신 버전으로 강제 업그레이드하고 싶다면, `pub upgrade` 명령어 뒤에 패키지 이름을 명시하면 된다:

```bash
dart pub upgrade http
```

이 명령어는 `http` 패키지를 최신 버전으로 업그레이드하며, 다른 의존성은 그대로 유지한다.

**의존성 충돌 해결**

패키지를 설치하거나 업그레이드할 때, 서로 다른 패키지 간에 버전 충돌이 발생할 수 있다. Dart에서는 이를 `pub`을 통해 쉽게 해결할 수 있다. 충돌이 발생했을 때, `pub get` 또는 `pub upgrade` 명령어는 충돌하는 의존성에 대한 경고 메시지를 표시하며, 이를 해결하기 위한 방법을 제시한다.

충돌을 해결하려면 `pubspec.yaml` 파일에서 명시된 버전 제약을 수정하거나, 상위 버전의 패키지를 설치하여 의존성 충돌을 방지해야 한다.

#### Dart 프로젝트와 의존성 관리의 중요성

Dart 프로젝트에서 의존성 관리는 코드의 확장성 및 유지보수에 큰 영향을 미친다. Pub 패키지 매니저를 사용하면 필요한 기능을 손쉽게 추가할 수 있으며, 패키지의 버전을 효율적으로 관리하여 안정적인 프로젝트 운영을 할 수 있다.

Dart의 강력한 패키지 생태계를 활용하여 프로젝트의 성능과 기능을 확장할 수 있으며, 올바른 의존성 관리를 통해 향후 프로젝트의 유지보수 비용을 크게 줄일 수 있다.
