nestjs

Entity Annotation

Entity Annotation

  • @PrimaryGeneratedColumn() : PK, 자동으로 ID를 생성
  • @PrimaryGeneratedColumn('uuid') : 128비트 짜리 문자열을 생성
  • @PrimaryColumn() : generated 가 아니기 때문에 무조건 직접 값을 넣어주어야 한다.
  • @Column() : 칼럼 생성
  • @CreateDateColumn() : 데이터 생성 날짜와 시간 자동으로 생성
  • @UpdateDateColumn() : 데이터가 업데이트되는 날짜와 시간 자동으로 생성
  • @VersionColumn() : 데이터가 업데이트 될 때마다 1씩 올라감 (처음 생성시 값은 1) 정확하게는 save() 함수가 몇 번 불렸는지 기억함
  • @Column() @Generated(’increment’) : 자동으로 1씩 증가하는 데이터

여기서 신경써야할 점이 있다. uuid 를 설정할 때는 number 타입이 아닌 string 타입으로 선언해주어야 한다는 것이다.

이렇게 하지 않으면 에러가 발생한다.

@Column({}) property

@Column({ update: false })
  createdAt: Date;
  • length : 입력할 수 있는 글자의 길이
  • nullable : null 가능 여부
  • update : 업데이트 가능 여부
  • select : 데이터를 조회할 때 기본적으로 이 칼럼을 가져올 것인지 결정
  • default : 기본값
  • unique : PK처럼 중복되는 값이 없도록 하는 것

enum

enum RolesEnum {
	USER = 'user',
	ADMIN = 'admin',
}

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

Entity Embedding

상속과 비슷한 개념. 중복되는 내부 칼럼을 한 번에 작성해서 재사용한다. 이 방법보다는 상속을 많이 사용한다.

이때 재사용 되는 것들을 선언하는 테이블의 경우에는 Entity 라는 키워드를 붙여주지 않는다.

// 재사용되는 것들 선언
export class Name{
  @Column()
  first: string;

  @Column()
  last: string;
}

// 사용
  @Column(() => Name)
  name: Name;

테이블 상속

일반적인 상속과 똑같은 개념과 유사한 로직으로 이루어져있다.

Embedding 과 마찬가지로 @Entity 라는 키워드를 적어주지 않는다.

export class BaseModel {
  @PrimaryGeneratedColumn()
  id: number;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

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