← 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つの具体例で確認します。
公式ドキュメントで詳しく ↗