👮
【入門】DTOって結局ナニをNest.jsで学ぶ
まず、Nest.jsは、Node.js向けの効率的で拡張性の高いサーバーサイドアプリケーションフレームワークです。
DTOは、一般的なデザインパターンであり、さまざまなプログラミング言語やフレームワークで使われています。
Nest.jsでは、DTOが特にAPI開発でよく使用されます。
コントローラーに送られてくるデータをDTOで受け取り、バリデーションを行い、ユースケースに渡すという使い方が一般的です。
この記事では、DTOの基本概念とNest.jsでの活用方法を解説します。
(個人的に視覚的に理解したいタイプなので図解も作りました!)
目次
DTOとは何か
DTO(Data Transfer Object)は、アプリケーション間やレイヤー間でデータを転送するためのオブジェクトです。主に以下の目的で使用されます:
- データの構造を定義する
- 不要なデータの露出を防ぐ
- データのバリデーションを容易にする
DTOの役割
-
データ転送用:
DTOは、異なるレイヤー間(例えば、クライアントからサーバー、コントローラーからサービス、サービスからデータベースなど)でデータを転送するためのオブジェクトです。通常、HTTPリクエストやレスポンス、API呼び出しの際に使用されます。 -
データの整形・制限:
DTOは必要なデータのみを含みます。例えば、クライアントから送信されたデータを受け取る際、不要なデータ(パスワードや内部IDなど)は含まれないようにすることができます。 -
バリデーションに使用:
DTOには、class-validator
などを使ってバリデーションルールを定義することができます。これにより、受信したデータが正しいかどうかを検証するために使われます。
Nest.jsでのDTOの定義方法
Nest.jsでは、クラスを用いてDTOを定義します。また、class-validator
とclass-transformer
パッケージを使用して、バリデーションとデータの変換を行います。
必要なパッケージのインストール
npm install class-validator class-transformer
DTOの作成
例えば、ユーザー登録用のDTOを作成してみましょう。
class-validator
とclass-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