【NestJS】ゼロから始めるNestJS、環境構築の全手順（初心者向け🔰）

## 概要
NestJS を初めて触る人向けの、概要と初期環境構築の備忘録。
「NestJSとは何か？」そもそも基本概念を知りたい人、初歩的な環境構築を知りたい人向け。

|#|内容|
|---|---|
|1|**基本概念・環境構築**（今回）|
|2|[基本３概念、モジュール/コントローラ/サービス とは](https://qiita.com/to3izo/items/ecbec71817ab589f87d7)|
|3|[spec とは何か？](https://qiita.com/to3izo/items/ec3b46c13dd357a5522e)|

### 前提
- PC に「Node.js」がインストール済みであること
- 「Web アプリ」「フロントエンド（クライアントサイド）」「バックエンド（サーバサイド）」の言葉の意味がわかること
- 「Web サーバ」が何かを知っていること
- 「REST API」の基礎概念がわかること

### 環境
- Node.js： v18.15.0
- npm： v9.6.3
- NestJS： v9.3.0
- TypeScript： v4.7.4

## NestJS とは
NestJS（ネストジェイエス）とは、一言で表すと **「TypeScript で使用できるバックエンドのフルスタックフレームワーク」**
![nestjs_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/d1b6f605-cf62-68eb-2ba9-85a864f51973.png)
**"フルスタック"** ということは、そもそもフレームワークで TypeScript での記法・お作法が整理された上に、**バックエンドでやりたいことはおおよそ全部できるように機能が揃っている** ということ。少し違う表現をすると、「他にサードバーティのライブラリやモジュールを追加する必要がないフレームワーク」ということですね。

また、フロントエンドの Web アプリケーションフレームワークの中で、同様にフルスタックフレームワークである **Angular** にインスパイアされており、書き方が Angular に非常に近い。

PHP や Python、 Ruby などは既に主要なバックエンドの強力なフレームワークがあるが、TypeScript/JavaScript には、これといってそのような立ち位置のフレームワークはまだなかったので、そこに出てきたのが "NestJS" という印象。

## 初期構築手順
手動で１つ１つファイルを用意しても動くが、非常に効率が悪く、現実的ではないので、専用の公式コマンドツールを利用する。

コマンドツール **「Nest CLI」** をグローバルインストール（`nest` コマンドが PC で使用できるようになる）
```zsh
npm install -g @nestjs/cli
```
※ 入らなかったら頭に `sudo` 付けて再挑戦💪

インストール成功したか確認
```zsh
# バージョン確認コマンド
nest -v

# ちなみにヘルプコマンド
nest -h
```

プロジェクト作成する
```zsh
# プロジェクト生成コマンド
nest new demo-nestjs

# 対話形式
# パッケージ管理ツールはどれにする？
? Which package manager would you ❤️  to use? (Use arrow keys)
❯ npm 
  yarn 
  pnpm 

# 処理中のインジケータがオシャレ
▹▹▸▹▹ Installation in progress... ☕

🚀  Successfully created project demo-nestjs
👉  Get started with the following commands:

$ cd demo-nestjs
$ npm run start

                                         
                  Thanks for installing Nest 🙏
         Please consider donating to our open collective
                to help us maintain this package.

         🍷  Donate: https://opencollective.com/nest
```

これで構築完了！
サーバ起動して動作確認してみる
```zsh
# 生成されたプロジェクトディレクトリに移動
cd demo-nestjs

# 開発モードでサーバ起動
npm run start:dev

# 結果: 以下のように、出力が止まったら起動完了. リクエスト待ち状態
[15:24:35] Starting compilation in watch mode...
[15:24:37] Found 0 errors. Watching for file changes.
[Nest] 51875  - 2023/04/15 15:24:37     LOG [NestFactory] Starting Nest application...
[Nest] 51875  - 2023/04/15 15:24:37     LOG [InstanceLoader] AppModule dependencies initialized +12ms
[Nest] 51875  - 2023/04/15 15:24:37     LOG [RoutesResolver] AppController {/}: +16ms
[Nest] 51875  - 2023/04/15 15:24:37     LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 51875  - 2023/04/15 15:24:37     LOG [NestApplication] Nest application successfully started +1ms
```

👉 サーバ停止は `control + C`（Mac）/ `Ctrl + C`（Windows）
👉 バックエンドツールなので画面はない。
👉 curl コマンドや API 動作確認ツールで `http://localhost:3000` に GET でリクエストを飛ばし、HTTP 200 で `Hello World!` と応答が返ってくれば成功。
（ポート設定は `src/main.ts` でデフォルト 3000 番になっている）

![nestjs_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/931c9ecb-b00e-6712-f74d-e3f544d37a9e.png)
上図は、適当なツールから実際に GET リクエストを飛ばして HTTP 200（成功）が返ってきた例

## おまけ： 生成されたファイルの意味
プロジェクト作成時に自動生成されたリソースの概要を説明する。
基本的に src のファイル以外はあまり覚えなくても良い。

<table>
<tr>
  <th colspan="2">ファイル</th><th>説明</th>
</tr>
<tr>
  <th rowspan="5">src</th><th>app.controller.spec.ts</th><td>コントローラの単体テストコード</td>
</tr>
<tr>
  <th>app.controller.ts</th><td>コントローラ（要求の受付/要求元への応答 を担当する領域）</td>
</tr>
<tr>
  <th>app.module.ts</th><td>コントローラとサービスをまとめて管理する、「モジュール」という名の箱</td>
</tr>
<tr>
  <th>app.service.ts</th><td>サービス（詳細なデータ処理を書く領域）</td>
</tr>
<tr>
  <th>main.ts</th><td>最初にアクセスされるエントリーファイル、Web サーバも兼ねる</td>
</tr>
<tr>
  <th rowspan="2">test</th><th>app.e2e-spec.ts</th><td>E2E テストコード</td>
</tr>
<tr>
  <th>jest-e2e.json</th><td>テスト設定ファイル</td>
</tr>
<tr>
  <th colspan="2">.eslintrc.js</th><td>設定ファイル</td>
</tr>
<tr>
  <th colspan="2">.gitignore</th><td>バージョン管理対象外を設定するファイル</td>
</tr>
<tr>
  <th colspan="2">.prettierrc</th><td>設定ファイル</td>
</tr>
<tr>
  <th colspan="2">nest-cli.json</th><td>Nest CLI 設定ファイル</td>
</tr>
<tr>
  <th colspan="2">package-lock.json</th><td>node モジュールの依存関係定義ファイル</td>
</tr>
<tr>
  <th colspan="2">package.json</th><td>node モジュールの定義ファイル</td>
</tr>
<tr>
  <th colspan="2">README.md</th><td>本プロジェクトの概要説明書</td>
</tr>
<tr>
  <th colspan="2">tsconfig.build.json</th><td>TypeScript の設定ファイル</td>
</tr>
<tr>
  <th colspan="2">tsconfig.json</th><td>TypeScript の設定ファイル</td>
</tr>
</table>