Dev Study
NestJS コース

26. エンティティ — テーブルを表すクラス

エンティティは、データベースの1つのテーブルを表す TypeScript のクラスです。クラスに @Entity() を付けるとテーブルに対応し、各プロパティに @Column() を付けると列に対応します。主キーには @PrimaryGeneratedColumn() を付けると、自動採番される id 列になります。「クラス = テーブル、プロパティ = 列」という対応関係は、TypeORM に限らず多くの ORM に共通する基本発想です。

実務では1つのテーブルにつき1つのエンティティクラスを user.entity.ts のようなファイルで定義し、前レッスンの entities 配列に登録します。既習の DTO が「リクエストの形」を表すクラスだったのに対し、エンティティは「DB に保存される形」を表すクラスで、両者は役割が異なるため別物として分けて持つのが定番です。

つまずきポイントは、エンティティと DTO を兼用してしまうことです。エンティティにはパスワードハッシュなど外に出したくない列も含まれるため、これをそのままレスポンスで返すと情報漏えいにつながります。DB の形(エンティティ)と API の入出力の形(DTO)は分けて考えるのが安全です。

サンプルコード(フレームワーク環境が必要なため表示のみ)

import {
  Entity, Column, PrimaryGeneratedColumn,
} from "typeorm";

@Entity() // users テーブルに対応するクラス
export class User {
  @PrimaryGeneratedColumn() // 自動採番される主キー(id 列)
  id: number;

  @Column() // name 列
  name: string;

  @Column({ unique: true }) // email 列(重複を許さない)
  email: string;

  @Column({ default: true }) // 既定値つきの列
  isActive: boolean;
}
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗