👮

【入門】DTOって結局ナニをNest.jsで学ぶ

2024/09/10に公開

まず、Nest.jsは、Node.js向けの効率的で拡張性の高いサーバーサイドアプリケーションフレームワークです。
DTOは、一般的なデザインパターンであり、さまざまなプログラミング言語やフレームワークで使われています。
Nest.jsでは、DTOが特にAPI開発でよく使用されます。
コントローラーに送られてくるデータをDTOで受け取り、バリデーションを行い、ユースケースに渡すという使い方が一般的です。
この記事では、DTOの基本概念とNest.jsでの活用方法を解説します。
(個人的に視覚的に理解したいタイプなので図解も作りました!)

目次

  1. DTOとは何か
  2. DTOの役割
  3. Nest.jsでのDTOの定義方法
  4. DTOの使用例
  5. データフローを図解
  6. まとめ

DTOとは何か

DTO(Data Transfer Object)は、アプリケーション間やレイヤー間でデータを転送するためのオブジェクトです。主に以下の目的で使用されます:

  • データの構造を定義する
  • 不要なデータの露出を防ぐ
  • データのバリデーションを容易にする

DTOの役割

  • データ転送用:
    DTOは、異なるレイヤー間(例えば、クライアントからサーバー、コントローラーからサービス、サービスからデータベースなど)でデータを転送するためのオブジェクトです。通常、HTTPリクエストやレスポンス、API呼び出しの際に使用されます。
  • データの整形・制限:
    DTOは必要なデータのみを含みます。例えば、クライアントから送信されたデータを受け取る際、不要なデータ(パスワードや内部IDなど)は含まれないようにすることができます。
  • バリデーションに使用:
    DTOには、class-validatorなどを使ってバリデーションルールを定義することができます。これにより、受信したデータが正しいかどうかを検証するために使われます。

Nest.jsでのDTOの定義方法

Nest.jsでは、クラスを用いてDTOを定義します。また、class-validatorclass-transformerパッケージを使用して、バリデーションとデータの変換を行います。

必要なパッケージのインストール

npm install class-validator class-transformer

DTOの作成

例えば、ユーザー登録用のDTOを作成してみましょう。
class-validatorclass-transformerを組み合わせてバリデーションやデータ変換を行います。

// create-user.dto.ts
import { IsString, IsEmail, IsNotEmpty, MinLength } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  @MinLength(6)
  password: string;

  @IsString()
  @IsNotEmpty()
  name: string;
}

DTOの使用例

コントローラーでの使用

// users.controller.ts
import { Controller, Post, Body } from '@nestjs/common';
import { CreateUserDto } from './create-user.dto';

@Controller('users')
export class UsersController {
  @Post()
  async create(@Body() createUserDto: CreateUserDto) {
    // サービスにデータを渡す
    return 'User created';
  }
}

バリデーションパイプの適用

Nest.jsでは、グローバルにバリデーションパイプを適用することで、DTOに対するバリデーションを自動的に行えます。

// main.ts
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

データフローを図解

以下の図は、クライアントからサーバーへのリクエストと、DTOを通じてサービスまでデータが渡る流れを示しています。
以下を想定。

  • フレームワーク: Nest.js
  • 言語: TypeScript
  • ORM: Prisma
  • バリデーションライブラリ: class-validator, class-transformer
  • アーキテクチャ: クリーンアーキテクチャ
  • 設計パターン: リポジトリパターン
  • ドメイン駆動設計(DDD): ドメインオブジェクトやユースケースを使用
  • データ転送オブジェクト(DTO): クライアントからのデータバリデーションとデータ構造管理

まとめ

DTOは、データの受け渡しやバリデーションを効率的に行うための強力なツールです。
Nest.jsでは、クラスとデコレーターを用いて簡単にDTOを定義し、バリデーションを実装できます。

Discussion