TypeORM TableInheritance

박진(TsTunas)·2023년 3월 6일
0

필요성

짜다보면 User라는 테이블 안에 Admin, Member로 운영자 계정과 회원 계정을 함께 넣고 싶을 수가 있다. 대부분 같은 컬럼을 공유하지만 Admin에는 있지만 Member에는 없고, Member에는 있지만 Admin에는 없는 컬럼이 있을 수가 있는데 이럴 때 쓴다.

코드 예시

import {
  ChildEntity,
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  Entity,
  OneToMany,
  PrimaryGeneratedColumn,
  TableInheritance,
  Unique,
  UpdateDateColumn,
} from 'typeorm';

@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'role' } })
export class User {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('varchar', { unique: true, nullable: true })
  email: string;

  @Column('varchar', { select: false })
  password: string;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @DeleteDateColumn()
  deletedAt: Date | null;
}

@ChildEntity('admin')
export class Admin extends User {
  ... Admin 고유 컬럼
}

@ChildEntity('member')
export class Member extends User {
  ... Member 고유 컬럼
}

코드 해설

보면 TableInheritance로 어떤 컬럼으로 ChildEntity들을 나눌지를 정하고 있다. 여기서는 role 컬럼으로 결정되었는데, role 컬럼 값이 admin이면 Admin 엔티티를 따라가며, role 값이 member이면 Member를 따라간다. Admin, Member는 extends User로 User의 모든 프로퍼티를 가지며 동시에 개별 컬럼을 가질 수 있다.
TypeOrm으로 데이터베이스를 초기화하면 User 테이블에는 공통 컬럼 + Admin 고유 컬럼 + Member 고유 컬럼이 다 존재한다. 다만, 필요하지 않은 컬럼은 null로 채워진다.

엔티티 사용법

User entity를 사용하는 방식대로 동일하게 사용하면 된다. 마치 Admin, Member만을 담은 테이블이 따로 존재하는 것처럼 작동한다.

profile
자바스크립트 전문가가 되고 싶은 아마추어

0개의 댓글