본문 바로가기
nestJS

NestJS | TypeORM Column Annotation

by 리잼 2024. 11. 12.
반응형

UserModel.ts

import {
  Column,
  CreateDateColumn,
  Entity,
  Generated,
  JoinColumn,
  ManyToMany,
  OneToMany,
  OneToOne,
  PrimaryColumn,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
  VersionColumn,
} from 'typeorm';
import { ProfileModel } from './profile.entity';
import { PostModel } from './post.entity';
import { TagModel } from './tag.entity';

// 특정값 제한
export enum Role {
  USER = 'user',
  ADMIN = 'admin',
}

@Entity()
export class UserModel {
  // ID
  //@PrimaryGeneratedColumn() // 자동 ID 생성
  // Primary Column
  // Primary Column 은 모든 테이블에서 기본적으로 존재해야한다.
  // 테이블 안에서 각각의 Row를 구분 할 수 있는 칼럼
  // @PrimaryColumn()

  //@PrimaryGeneratedColumn('uuid)
  // PrimaryGeneratedColumn -> 순서대로 값이 올라감 ex) 1, 2, 3, 4 ~

  // UUID
  // asdfa1234asdf-asdf2234asdf-2324asdfdd-asdfsdf32
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  // 제목
  // @Column({
  //   // 데이터베이스에서 인지하는 칼럼 타입
  //   // 자동 유추, 특정 값이 필요하면 넣는다
  //   type: 'varchar',
  //   // 데이터베이스 칼럼 이름
  //   // 프로퍼티 이름으로 자동 유추
  //   name: 'title',
  //   // 값의 길이
  //   // 실제 입력 할 수 있는 글자의 길이가 300
  //   length: 300,
  //   // null 이 가능한지
  //   nullable: true,
  //   // true면 처음 저장할 때만 값 지정 가능
  //   // 이후엔 불가능
  //   update: true,
  //   // find()를 실행할 때 기본으로 값을 불러올지
  //   // 기본값이 true
  //   select: false,
  //   // 기본 값
  //   // 아무것도 입력 안했을 때 들어가는 값
  //   default: 'default value',
  //   // 칼럼 중 유일무이한 값이 돼야 하는지 ex) 이메일 ..
  //   unique: false,
  // })
  // title: string;

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

  // 데이터 생성일자
  // 데이터가 생성되는 날짜와 시간이 자동으로 찍힘
  @CreateDateColumn()
  createAt: Date;

  // 데이터 수정일자
  // 데이터가 수정되는 날짜와 시간이 자동으로 찍힘
  @UpdateDateColumn()
  updateAt: Date;

  // 데이터가 업데이트 될 때마다 1씩 올라간다.
  // 처음 생성되면 값은 1
  // save() 함수가 몇 번 불렸는지 기억한다.
  @VersionColumn()
  version: number;

  @Column()
  @Generated('uuid') // auto increment
  additionalId: string;

  @OneToOne(() => ProfileModel, (profile) => profile.user, {
    // find() 실행 시 마다 항상 같이 가져올 relation
    eager: false,
    // 저장 할 때 relation을 한번에 같이 저장 가능
    cascade: true,
    // Null 가능 여부
    nullable: true,
    // 관계가 삭제 됐을 때
    // no action -> 아무것도 안함
    // cascade -> 참조하는 Row 삭제
    // set null -> 참조하는 Row 에서 참조 id 를 null로 변경
    // set default -> 기본 셋팅으로 설정
    // restrict -> 참조하고 있는 Row 가 있는경우 참조당하는 Row 삭제 불가
    // onDelete: 'RESTRICT',
  })
  @JoinColumn()
  profile: ProfileModel;

  @OneToMany(() => PostModel, (post) => post.author)
  posts: PostModel;

  @Column({ default: 0 })
  count: number;
}

TypeORM 어노테이션 정리 

1. @Entity()

  • 데이터베이스에서 이 클래스를 하나의 테이블로 인식한다. 이 데코레이터가 붙은 클래스는 TypeORM에서 관리하며
    자동으로 테이블이 생성된다.
@Entity() export class UserModel { ... }

2. @PrimaryGeneratedColumn()

  • 자동으로 증가하는 숫자 ID를 생성한다. 주로 기본 키로 사용.
  • 옵션
    • 'uuid': UUID 형식의 고유 식별자를 자동으로 생성
    • 'increment': 자동 증가 숫자 (기본값)
@PrimaryGeneratedColumn() id: number;

@PrimaryGeneratedColumn('uuid') id: number;

3. @Column()

  • 컬럼을 정의하고 다양한 옵션을 통해 세부 설정이 가능하다.
  • 옵션
    • type: 컬럼의 데이터 타입 (varchar, int, boolean 등).
    • length: 문자열 길이.
    • nullable: true 설정 시, NULL 값 허용.
    • unique: true 설정 시, 고유 값 강제.
    • default: 기본값 설정.
@Column({ type: 'varchar', length: 300, nullable: true, default: 'default value' }) title: string;

4. @CreateDateColumn()

  • 레코드가 생성된 시간을 자동으로 기록한다. 값은 INSERT 시에만 설정되고, 이후 수정되지 않는다.
  • 데이터 생성 일시를 추적할 때 용이.
@CreateDateColumn() createdAt: Date;

5. @UpdateDateColumn()

  • 레코드가 마지막으로 수정된 시간을 자동으로 기록한다. 값은 UPDATE 시마다 자동으로 갱신된다.
  • 데이터 수정 일시를 추적할 때 사용한다.
@UpdateDateColumn() updatedAt: Date;

6. @VersionColumn()

  • 레코드가 수정될 때마다 이 값이 자동으로 증가 ( save() 함수 )
  • 데이터 충돌 방지를 위해 사용 (특히 동시성 이슈 해결).
@VersionColumn() version: number;

7. @Generated()

  • 자동으로 값을 생성해주는 컬럼. 주로 'uuid' 옵션을 사용하여 고유 식별자를 생성한다.
@Column() @Generated('uuid') additionalId: string;

8. @OneToOne()

  • 두 엔티티 간의 1:1 관계를 설정한다. 외래 키를 통해 다른 엔티티와 연결됨.
  • 옵션:
    • cascade: 관련된 엔티티를 함께 저장하거나 삭제.
    • eager: 항상 관계된 데이터를 함께 조회.
    • onDelete: 연결된 엔티티가 삭제될 때의 동작을 설정합니다 (CASCADE, SET NULL, RESTRICT 등).
@OneToOne(() => ProfileModel, (profile) => profile.user, { cascade: true, nullable: true }) @JoinColumn() profile: ProfileModel;

9. @OneToMany()

  • 두 엔티티 간의 1관계를 설정. 주로 배열 형태로 다른 엔티티를 연결할 때 사용.
@OneToMany(() => PostModel, (post) => post.author) posts: PostModel[];

10. @ManyToMany()

  • 두 엔티티 간의 N관계를 설정. @JoinTable()과 함께 사용하여 연결 테이블을 생성.
@ManyToMany(() => TagModel, (tag) => tag.users) tags: TagModel[];

 

 
반응형

'nestJS' 카테고리의 다른 글

NestJS | TypeORM Table Inheritance  (0) 2024.11.12
NestJS | TypeORM Entity Embedding  (2) 2024.11.12
NestJS | Docker, TypeORM 설치  (0) 2024.11.12
NestJS | 의존성 주입, 제어의 역전  (0) 2024.11.06
NestJS | Config (env)  (0) 2024.08.25