🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
Back
NestJs
13-상속을 이용한 BaseModel 구현

1. UpdateAt, CreateAt 자동 생성

postgres-data 폴더를 지워, db를 초기화한다.

users.entity.ts
1
// 생략
2
3
@Entity()
4
export class UsersModel {
5
// 생략
6
7
@UpdateDateColumn()
8
updateAt: Date
9
10
@CreateDateColumn()
11
createdAt: Date
12
}

users 엔티티에 위 어노테이션들을 적용하면 자동으로 생성, 수정일이 추가된다.

이떄 생성되는 utc(영국 세계기준) 기준으로 생성된다. 한국시간은 +9 해줘야 한다.


2. BaseModel 적용

다른 모델의 엔티티마다 updateAt, createAt가 추가되는 경우가 굉장히 많을 것이다.

posts.entity.ts
1
// 생략
2
3
@Entity()
4
export class PostsModel {
5
// 생략
6
7
@UpdateDateColumn()
8
updateAt: Date
9
10
@CreateDateColumn()
11
createdAt: Date
12
}

그래서 공통된 리소스를 모아놓기 위해 common 이라는 리소스를 만든다.

1
$ nest g resource
2
? common
3
? REST API
4
? No

src/common/entities/base.entity.ts 파일을 다음과 같이 만든다.

src/common/entities/base.entity.t
1
import { CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
2
3
@Entity()
4
export abstract class BaseModel {
5
@PrimaryGeneratedColumn()
6
id: number
7
8
@UpdateDateColumn()
9
updateAt: Date
10
11
@CreateDateColumn()
12
createdAt: Date
13
}

그리고 id, updateAt, craeteAt를 쓰는 엔티티(user, posts)에

  • 기존 id, updateAt, craeteAt를 지워주고,
  • BaseModel을 상속시켜주면 된다.
users.entity.ts
1
// users.entity.ts 생략
2
@Entity()
3
export class UsersModel extends BaseModel {
4
/*** 닉네임 특성
5
* 1) 길이가 20을 넘지 않을 것
6
* 2) 유일무이한 값이 될 것
7
*/
8
@Column({
9
length: 20,
10
unique: true,
11
})
12
nickname: string
13
14
/*** 이메일 특성
15
* 1) 유일무이한 값이 될 것
16
*/
17
@Column({
18
unique: true,
19
})
20
email: string
21
22
@Column()
23
password: string
24
25
@Column({
26
// role 특성의 타입을 RolesEnum의 모든 값들로 지정
27
enum: Object.values(RolesEnum),
28
default: RolesEnum.USER,
29
})
30
role: RolesEnum
31
32
@OneToMany(() => PostsModel, post => post.author)
33
posts: PostsModel[]
34
}
posts.entity.ts
1
// posts.entity.ts 생략
2
@Entity()
3
export class PostsModel extends BaseModel {
4
/*** 작성자 1명이 여러 개의 포스트를 작성
5
* 1) UserModel과 연동한다 (Foreign Key를 사용해서)
6
* 2) null이 될 수 없다
7
*/
8
// one에 해당하는 클래스 타입을 넣어주면 된다
9
// 이 클래스 타입을 두 번쨰 함수의 파라미터로 받을 수 있다.
10
// 어떤 파라미터와 연동시킬지 선택
11
@ManyToOne(() => UsersModel, user => user.posts, {
12
nullable: false,
13
})
14
author: UsersModel
15
16
@Column()
17
title: string
18
19
@Column()
20
content: string
21
22
@Column()
23
likeCount: number
24
25
@Column()
26
commentCount: number
27
}

이런 식으로 공통된 프로퍼티를 모아서, 반복되는 코드를 사용하지 않고, 엔티티를 구성할 수 있다.