Post

[Nest.js 학습일기] Entity Embedding, Table Inheritance

[Nest.js 학습일기] Entity Embedding, Table Inheritance

Entitiy Embedding

Entity를 작성할 때 다음의 과정으로 코드를 재활용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
export class Name{
  @Column()
  first: string;

  @Column()
  last: string;
}

@Entity()
export class StudentModel{
  @PrimaryGeneratedColumn()
  id: number;
  
  // 위에서 정의한 Name 클래스 재활용
  @Column(() => Name)
  name: Name;

  @Column()
  class: string;

}

entity_embedded

Inheritance

위와 기능적으로는 큰 차이가 없음. 다음과 같이 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export class BaseModel{
  @PrimaryGeneratedColumn()
  id: number;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

@Entity()
export class BookModel extends BaseModel{
  @Column()
  name: string
}

SingleBaseModel

사실 위의 방법들로도 충분하나 하나의 table로 사용하고 싶다면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Entity()
@TableInheritance({
  column: {
    name: 'type',
    type: 'varchar',
  }
})
export class SingleBaseModel{
  @PrimaryGeneratedColumn()
  id: number;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

@ChildEntity('computer')
export class ComputerModel extends SingleBaseModel{
  @Column()
  brand: string;
}

@ChildEntity('airplane')
export class AirPlaneModel extends SingleBaseModel{
  @Column()
  brand: string;
}

이와 같이 코드를 작성하면 SingleBaseModel이 DB에 생성되고 해당 테이블에 brand라는 칼럼이 추가되며, 어떤 child가 왔는지에 따라 typpe이 ‘computer’, ‘airplane’으로 표시된다.

This post is licensed under CC BY 4.0 by the author.