[NestJS] Refactoring (1) - Entity Inheritance (with TypeORM)

hjh0403 2024. 5. 21. 02:59

TypeORM에서 엔티티들이 공통으로 갖는 컬럼이 있는 경우에는 엔티티 상속을 통해 중복되는 코드를 제거할 수 있다.

@Entity('item_consumable')
export class ItemConsumable {
  @PrimaryColumn()
  code: number;

  @Column()
  name: string;

  @Column({
    enum: ItemType,
  })
  itemType: ItemType;
  
  @Column({
    enum: ItemGrade,
  })
  itemGrade: ItemGrade;
  
  @Column()
  hpRecover: number;
  
  ...
}

@Entity('item_wearable')
export class ItemWearable {
  @PrimaryColumn()
  code: number;

  @Column()
  name: string;

  @Column({
    enum: ItemType,
  })
  itemType: ItemType;
  
  @Column({
    enum: ItemGrade,
  })
  itemGrade: ItemGrade;

  @Column()
  attackPower: number;
  
  ...
}

 

code, name, itemType, itemGrade가 두 엔티티에서 공통으로 사용되고 있다.

 

export abstract class Common {
  @PrimaryColumn()
  code: number;

  @Column()
  name: string;

  @Column({
    enum: ItemType,
  })
  itemType: ItemType;
  
  @Column({
    enum: ItemGrade,
  })
  itemGrade: ItemGrade;
}

 

위와 같이 중복되는 컬럼에 대한 추상 클래스를 선언한 후

 

@Entity('item_consumable')
export class ItemConsumable extends Common {
  @Column()
  hpRecover: number;
  
  ...
}

@Entity('item_wearable')
export class ItemWearable extends Common {
  @Column()
  attackPower: number;
  
  ...
}

 

해당 클래스를 상속받아서 엔티티를 생성하면 된다.