💭

NestJS入門

2025/03/06に公開

はじめに

NestJSのメリット・デメリット、環境構築といったNestJSがどんなものかを紹介したいと思います。

背景

次の現場の技術を理解するため、せっかくなので学習したことを残しておきたいともいます。

NestJSとは

NestJSは、TypeScript で構築された、バックエンド開発のための Node.js フレームワークです。Angular の影響を受けて開発されているようです。
https://docs.nestjs.com/
Nest.jsでは、モダンJavaScriptとTypeScriptを使用して、高いテスト可能性、保守性、拡張性を備えたアプリケーションを作成可能です。
また近年主流となっているReactやVue、Svelteと同じTypeScriptで書けるということにある。 バックエンドでもフロントエンドと同じTypeScriptが使えるということです。フロントエンドとバックエンドで使う言語変える必要がない利点がNestJSの使用される意義になります。

NestJSのメリット

Nest.jsを使用するメリットには以下のようなものがあります。

  • パワフルでユーザーフレンドリー: このフレームワークは開発者にとって使いやすく、複雑な機能であっても簡単に扱うことができます。Nest.jsを採用することでチームでの開発をすぐに始められ、セキュリティなどの要素は組み込みの性能をそのまま活用することで、ビジネスロジックを書くことに集中できます。
  • Angularスタイルの構文(バックエンド): Angularは、アーキテクチャと構造化に集中した、人気のフロントエンドフレームワークです。Nest.jsは言うなれば「バックエンドのAngular」として機能し、Angularのスタイルと構文を使用してエンタープライズプロジェクトの構造化を支援します。
  • TypeScript: Nest.jsは標準でTypeScriptをサポートし、コンパイルエラーや警告を提供することで、パフォーマンスや保守性の高いアプリケーションを素早く書くことに貢献します。VSCodeとの親和性が高く、アクセス性の高い開発環境が確保できます。
  • 徹底したドキュメント: Nest.jsはあらゆるフレームワークと比較しても高いレベルのドキュメントを誇り、学習や理解を深めるのに有用です。ドキュメントにざっと目を通すだけで問題の解決策を知ることができ、デバッグの時間を削減できます。
  • 優れたアーキテクチャと素早い開発: Nest.jsは、最初のMVP(※注釈:機能を最低限にした試作品)を作成する場合でも、実際のアプリケーションを作成する場合でも、アプリケーションを構築する際の手間の削減に貢献します。Nest.jsを採用することで、すぐに作業を開始できる強固な構造とアーキテクチャが手に入り、開発プロセスの向上が期待できます。

NestJSのデメリット

前項にてNestJSの良いところを紹介しました。そんなNestJSにもデメリットはあります。その内容が以下になります。

  • 初心者には難しい: Nest.jsは、Angularの基礎知識を持っていない駆け出しの開発者が学びマスターするには少し難しいかもしれません。さらに、すべてのJavaScript開発者がTypeScriptを使っているわけではないので、これがネックになる可能性もあります。他の技術と同じように、習得するには実際に使ってみる必要があります。
  • デバッグが大変: TypeScriptにはたくさんのメリットがありますが、特にTypeScriptを使い始めた開発者にとっては、デバッグの苦労が多くなる点は否定できません。

環境構築

ここからは、実際に NestJS を使ってみたいと思います。
まずはみんな大好きHello World!を出していきます。

準備

まず、Nest CLI をインストールします。ただしNode.jsはすでにインストールされているものとします。

npm install -g @nestjs/cli

Nest CLI を用いて、プロジェクトを作ります。project-name には、任意の名前を入れます。

nest new project-name

これにて、開発準備は終了です。次に作成されたファイルを見ていきましょう。

app.module.ts

以下が、ルートモジュールになります。
ルートモジュールはNestがアプリケーショングラフの構築の始点です。Nestはモジュールとプロバイダの関係と依存関係を解決するために使用する内部データ構造です。

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [], // モジュールを要素として入れる配列
  controllers: [AppController], // ルーティングを記述したControllers
  providers: [AppService], // 処理を記述したProviders
})
export class AppModule {}

@Moduleデコレータに、ControllersProvidersが配列でまとめられているオブジェクトを渡しているのがわかりますね。

app.controller.ts

app.controller.tsを見ていきましょう。
前項のAppControllerの内容が以下になります。
プロジェクト生成時にすでに1つルーティングが定義されています。
ここでは、GET /で、AppServiceクラスに記述されたgetHelloメソッドが実行されるようになっています。

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    // AppServiceクラスに記述したgetHelloメソッドを実行
    return this.appService.getHello();
  }
}

app.service.ts

続いて、ロジックが記述されたAppServiceクラスを見てみます。
こちらもプロジェクト生成時にすでに1つメソッドが定義されています。
先ほど出てきた、getHelloメソッドが定義されています。このgetHelloメソッドはHello World!と返すようになっています。

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

main.ts

最後に、このmain.tsでNestFactoryを使ってインスタンスを生成し、listenメソッドで起動します。ポートは引数で設定でき、デフォルトは3000です。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  // NestFactoryでインスタンスを生成
  const app = await NestFactory.create(AppModule);
  // ポート番号を引数で指定できる
  await app.listen(3000);
}
bootstrap();

実行

それでは、実際に実行してみます。
以下のコマンドを打ち、http://localhost:3000/にアクセスしてみます。

npm run start

無事、Hello World!が表示されました!

おわりに

今回NestJSのメリット・デメリット、環境構築を紹介させていただきました。今回はHello World!の表示まででしたが、次はメソッドの追加やAPIの実装を行ってみようと思います。
読んでくださり、ありがとうございました。

91works Tech Blog

Discussion