Post

[Nest.js 학습일기] typeORM - Column Annotation, Property

[Nest.js 학습일기] typeORM - Column Annotation, Property

@Column()

옵션

해당 데코레이터엔 다음과 같은 옵션들을 추가할 수 있다.

  • type : varchar, int … (자동 추론)
  • name : 실제 데이터베이스의 컬럼 이름 (자동 추론)
  • nullable : null값 사용 가능 여부
  • update : 생성할 때만 값을 입력할 것이냐 (두번째 save의 경우 무시할 것이냐)
    • 현재 해당 기능은 typeScript의 오류인지 모르겠으나 error을 return 하지 않는다는 문제가 존재함
  • length : 몇글자 까지 가능하냐. 일반 string의 경우 varchar을 사용해야 길이를 셀 수 있음. (not text!)
  • select : find()로 가져올 때 기본적으로 가져오게 할 것이냐
  • default : 아무것도 넣지 않았을 때, 기본적으로 들어갈 값
  • unique : 이 값이 유일무이한 값을 지녀야 하는지

특수 데코레이터

특수 목적을 지니는 데코레이터

  • @PrimaryGeneratedColumn() : 자동으로 증가하는 기본키 (PK)
    • @PrimaryColumn()을 사용하면 기본키로 설정 가능하나 자동으로 증가하지 않기에 값을 입력해야함.
    • 'uuid'를 옵션으로 넣으면 기본키보다 복잡한 형태의 기본키 제공
      1
      2
      3
      4
      5
      6
      7
      8
      
      {
      "id": 1,
      "role": "user",
      "createdAt": "2024-12-02T21:22:42.832Z",
      "updatedAt": "2024-12-02T21:22:42.832Z",
      "version": 1,
      "additionalId": "d6b53d07-03a0-4f44-a24d-2cac7882cce7"
      }
      
  • @CreateDateColumn(), @UpdateDateColumn() : 생성 / 업데이트 시 날짜
  • @VersionColumn() : save된 횟수 (update된 횟수)

Enum의 활용

enum을 활용해서 역할군을 지정하거나 이런식으로 활용 가능

1
2
3
4
5
6
7
8
9
10
11
export enum Role {
  USER = 'user',
  ADMIN = 'admin',
}
// ...codes
  @Column({
    type: 'enum',
    enum: Role,
    default: Role.USER,
  })
  role: Role;
학습에 활용한 코드들
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import {
Column,
CreateDateColumn,
Entity,
Generated,
PrimaryGeneratedColumn,
UpdateDateColumn,
VersionColumn
} from "typeorm";

export enum Role {
USER = 'user',
ADMIN = 'admin',
}

@Entity()
export class UserModel {
// @PrimaryColumn()은 개인이 PK값을 직접 넣어줘야함.
// @PrimaryGeneratedColumn('uuid') => 데이터가 생성될 때 마다 1씩 올라가는 것과 달리
// 굉장히 복잡한 uuid로 생성한다는 의미
@PrimaryGeneratedColumn()
id: number;

@Column({
// type과 name은 자동 유추 가능
type: 'varchar',
name: 'title',
// 300자 까지 가능
length: 300,
// nullable
nullable: true,
// 생성할 때만 값 지정 가능
// typeScript의 오류인가, 오류를 밷지 않는 문제 존재함 현재
update: true,
// find()로 가져올 때, 기본적으로 가져오게 할 것이냐.
select: false,
// 아무것도 입력하지 않았을 때, 어떤 값을 넣을 것이냐
default: 'default value',
// 이 값이 유일무이한 값이여야 하는지
// 닉네임 관련해서 사용할 수 있을 듯?
unique: false,
})
title: string;

@Column({
type: 'enum',
enum: Role,
default: Role.USER,
})
role: Role;

@CreateDateColumn()
createdAt: Date;

@UpdateDateColumn()
updatedAt: Date;

// 업데이트가 몇번 되었는지 .. 업데이트 될 때 마다 1씩 올라감
// 즉 save 될수록 숫자 하나씩 증가
@VersionColumn()
version: number;

@Column()
@Generated('uuid')
additionalId: string;
}
This post is licensed under CC BY 4.0 by the author.