NestJS

NestJS×Prismaで作るCRUD API完全ガイド – TypeScriptとPostgreSQLで実装

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

はじめにと前提条件

このセクションでは、本記事全体の対象読者と到達目標を簡潔に示します。NestJS と Prisma を組み合わせることで 型安全かつ高速なデータアクセス が実現でき、実務で即戦力になるコードベースが手に入ります。この記事を読み終えると、ローカル環境で動くサンプルリポジトリを自分の手で構築し、GitHub Actions による CI/CD まで走らせられるようになります。

対象読者

  • NestJS を学び始めたばかりで、フレームワークの基本的な使い方を知りたい人
  • フロントエンド中心に開発してきて、バックエンドの型安全性やテスト手法を身につけたい人

この記事のゴール

  1. NestJS プロジェクトへ Prisma v5 を正しく組み込む(DI・リクエストスコープ)
  2. Article エンティティで CRUD API を完成させる(DTO・バリデーション)
  3. Jest と GitHub Actions でテスト&マイグレーションを自動化

NestJS プロジェクトの作成と環境構築

この章では、NestJS の雛形作成から TypeScript の設定確認までを順に行います。最初に開発基盤を整えることで、以降の手順がスムーズに進みます。

Node.js とパッケージマネージャのインストール

Node.js LTS (v20 系) を公式サイトからインストールし、pnpm をグローバルに追加します。pnpm は依存解決が高速でディスク使用量も抑えられるため、モノレポや CI 環境でも好評です。

Nest CLI のセットアップとプロジェクト生成

Nest CLI はプロジェクト雛形やモジュール自動生成を支援します。以下のコマンドで新規アプリケーションを作成し、パッケージマネージャは pnpm を選択してください。

生成されたディレクトリ構造(主要ファイル)を示します。src/ 以下に実装コードが集約されます。

TypeScript 設定の確認

NestJS が生成する tsconfig.jsonstrict モード が有効です。この設定がオンになっていると PrismaClient の型情報が完全に補完され、開発時のミスを大幅に減らせます。


Prisma の導入と設定

Prisma を NestJS に組み込む際の鍵は PrismaService(ラップしたクラス)をリクエストスコープで提供し、モジュール間で DI できるようにすることです。この章ではインストールからマイグレーション、サービス実装までを網羅します。

Prisma のインストールと初期化

開発依存として prisma とクライアントパッケージ @prisma/client を追加し、prisma init で雛形ファイルを作ります。

.env にデータベース接続情報を記載

本稿では PostgreSQL 15 を想定します。ローカル開発用 DB と、マイグレーション時に Prisma が内部で使用する shadow database の二つの URL を環境変数として管理します。

重要: shadow database には CREATEDB 権限が必要です。PostgreSQL の公式ドキュメント(Shadow Database – Prisma Docs)を参照し、権限付与を忘れずに行ってください。

スキーマ定義とマイグレーション実行

prisma/schema.prismaArticle モデルを記述します。ファイル全体を掲載し、インデントや属性の意味も簡単に解説します。

スキーマ保存後、ローカル DB にマイグレーションを適用します。

補足: prisma generatemigrate dev の実行時に自動で走りますので手動は不要です。

PrismaService の実装(リクエストスコープ)

公式ガイド(NestJS Request‑Scoped Providers)を参考に、PrismaClient を継承したサービスを作ります。Scope.REQUEST にすることで、トランザクションやミドルウェアでリクエスト単位の状態管理がしやすくなります。

次に、他モジュールからインジェクションできるように PrismaModule を作成します。

アプリ全体への PrismaModule の組み込み

AppModulePrismaModule をインポートすれば、どのモジュールでも PrismaService が注入できるようになります。


CRUD API の実装

ここからは Article エンティティを例に、DTO・バリデーション・サービス・コントローラの実装手順を示します。各コードブロックにはファイルパスと簡単な説明を書き添えているので、初心者でも全体像が掴みやすくなっています。

DTO(Data Transfer Object)の作成

DTO は class-validator と組み合わせてリクエストボディのバリデーションを行います。まずは記事作成用 DTO を定義します。

更新用 DTO は PartialType を活用して、全フィールドを任意にできます。

ArticlesService の実装(CRUD ロジック)

PrismaService を注入し、各メソッドで PrismaClient の API を呼び出します。エラーハンドリングは NestJS 標準の例外クラスを使用し、統一されたレスポンスフォーマットを実現しています。

ArticlesController のエンドポイント定義

ParseIntPipe を使うことで URL パラメータの型変換が自動的に行われ、コード内で数値として扱えるようになります。

ArticlesModule の結合

ArticlesModulePrismaModule とサービス・コントローラを束ねます。


テスト・CI/CD とデプロイ

本番環境へ安全にリリースするには、ユニットテストと e2e テストを自動化し、GitHub Actions 上でマイグレーションを走らせることが必須です。以下では Jest のモック戦略と、CI パイプライン全体像を示します。

Jest でのユニットテスト(サービス層)

PrismaClient は外部 DB に依存するため、テスト時は モックオブジェクトに差し替えて高速化します。test/articles.service.spec.ts の全容です。

e2e テスト(実 DB を使用)

Docker 上の PostgreSQL コンテナを起動し、実際のマイグレーションとエンドポイント呼び出しを行います。

変更点のポイント

  • pnpm prisma migrate deploypreview フラグを削除(Prisma v5 では不要)
  • --schema--skip-generate を付与し、CI 時の余計なビルド時間を短縮

CI パイプライン全体像とデプロイ手順

  1. シークレット管理:GitHub の Settings → Secrets に DATABASE_URLSHADOW_DATABASE_URL を登録。
  2. マイグレーション実行:上記の prisma migrate deploy が失敗したらジョブは即座に停止します。
  3. ビルド & デプロイ:テストがすべて成功したら、Docker イメージを作成し Render・Fly.io などの PaaS にプッシュするステップを追加できます(本稿では割愛)。

補足情報: 本番環境でも shadow database が必要です。DB 管理者に CREATEDB 権限付与を依頼してください(公式ドキュメント参照:https://www.prisma.io/docs/concepts/components/prisma-migrate/shadow-database)。


まとめと次のアクション

この記事で取り上げた内容は、NestJS v10 + Prisma v5 の実務レベル構成です。ポイントを再度整理すると以下の通りです。

項目 内容
開発基盤 Node.js LTS + pnpm + Nest CLI でプロジェクト作成
DB 設定 .envDATABASE_URLSHADOW_DATABASE_URL を記載し、shadow DB に CREATEDB 権限を付与
Prisma 導入 prisma init → スキーマ作成 → prisma migrate dev でマイグレーション
サービス層 PrismaService(リクエストスコープ)を作り、DI で注入
CRUD 実装 DTO + class‑validator + Service + Controller の標準構成
テスト Jest でユニットテスト、Docker PostgreSQL で e2e テスト
CI/CD GitHub Actions でマイグレーション自動実行(prisma migrate deploy) → テスト → デプロイ

今すぐできること

  1. 本リポジトリをクローンし、pnpm install && pnpm prisma migrate dev をローカルで走らせる。
  2. npm run start:dev で API が起動したら、Postman や VSCode の REST Client でエンドポイント (/articles) を叩く。
  3. GitHub にプッシュし、Actions タブで CI が成功することを確認。

次のステップ: 認証・認可(Passport, JWT)や GraphQL への移行、またはマイクロサービス化を検討すると、更なるスケーラビリティが得られます。


参考リンク

これで 型安全・テスト自動化された NestJS + Prisma バックエンド が完成です。ぜひ手元で動かして、実務プロジェクトにすぐ適用してください!

スポンサードリンク

-NestJS