[TIL] Day 57 : typeOrm Entity 작성법

Q·2024년 7월 9일

TIL

목록 보기
58/59

예시

@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: 'varchar', unique: true, nullable: false })
  email: string;

  @Column({ type: 'varchar', select: false, nullable: false })
  password: string;

  @Column({ type: 'varchar', nullable: true })
  name: string;
  
  @Column({ type: 'int', default: 1000000 })
  points: number;

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

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @OneToMany(() => Booking, (booking) => booking.user, { cascade: true })
  booking: Booking[];

  @OneToMany(() => TransactionLog, (withdrawal) => withdrawal.sender)
  withdrawal: TransactionLog[];

  @OneToMany(() => TransactionLog, (deposit) => deposit.receiver)
  deposit: TransactionLog[];

  @OneToOne(() => RefreshToken, (refreshToken) => refreshToken.user)
  refreshToken: RefreshToken;
}

Entity 선언/설정

  • @Entity({ name: 'users' })
    Entity를 정의하겠다고 선언.
    Entity는 Typeorm으로 DB에 만들 테이블에 대한 정보를 담고 있다.
    prisma schema에서의 model와 같다.

  • { name: 'users' }
    해당 entity에 해당하는 테이블을 DB에 만들 때 테이블 이름을 설정.
    prisma schema에서 @@map('users')과 같다.

Column 선언/설정

  • @PrimaryGeneratedColumn()
    해당 column을 테이블의 primary key 로 쓰겠다고 선언.
    prisma schema에서 @id @default(autoincrement())와 같다.
    즉, type을 'int'로, primary key 설정을 true로, 그리고 auto_increment 설정까지 자동으로 해준다.

  • @Column()
    일반적인 column을 선언.
    괄호() 안에 객체로 name, type, default 값을 설정해줄 수 있고, select, unique, nullable 등의 true/false도 설정 가능하다.
    여기서 select는 false로 설정할 경우, find나 findOne 등으로 DB의 데이터를 조회할 때 해당 column을 지정해서 select 해주지 않는다면 기본적으로 해당 column을 omit한다는 뜻이다.

  • @CreateDateColumn()
    해당 테이블에 레코드가 삽입/저장될 때 레코드의 생성 시간을 기록하는 column이다.
    prisma schema에서의 @map('created_at') @default(now())와 같다.
    즉, name을 'created_at'으로, type을 datetime으로, default를 current_timestamp로 설정해준다.

  • @UpdateDateColumn()
    해당 테이블의 레코드를 수정할 때 레코드의 수정 시간을 기록하는 column이다.
    prisma schema에서의 @updatedAt() @map('updated_at')과 같다.
    즉, name을 'updated_at'으로, type을 datetime으로 설정하고, default_generated on update 설정까지 자동으로 해준다.

  • @DeleteDateColumn()
    해당 테이블의 레코드를 삭제(soft delete)할 때 레코드의 삭제 시간을 기록하는 column이다.

Relation 설정

  • @OneToMany()
    해당 테이블이랑, 다른 어떤 테이블 간에 1:N relation을 맺어준다.
    예를 들어 해당 테이블이 A이고, 테이블 B와 연결하려고 한다면,
    괄호 안에는 () => B, (b) => b.a 로 쓰면 된다.
    여기서,
    B는 연결할 Entity의 이름,
    b는 연결할 Entity, 즉 B를 이 entity에서 부를 이름,
    a는 해당 Entity, 즉 A를 B 쪽에서 부를 이름이다.

정리하자면,

@OneToMany(() => B, (b) => b.a)
b: B[]

이런 식으로 쓰면 된다.

  • @OneToOne()
    1:1 relation을 맺어준다.

  • @ManyToOne()
    N:1 relation을 맺어준다.
    위의 예시에서 @OneToMany()를 쓴 Entity가 A라면,
    @ManyToOne()은 Entity B 쪽에 써준다.

  • @JoinColumn()
    위의 예시에서 B의 어떤 column을 A의 어떤 column과 연관지을 것인지를 정해준다.
    여기서 A가 부모 Entity고, B가 자식 Entity가 되는데,
    자식 Entity인 B에서 @ManyToOne() 밑에 써준다.
    괄호 안에, 연관지을 A와 B Entity 각각의 column의 이름을 지정해준다.
    name은 해당 Entity(B)에서 연관지을 column 이름이고,
    referencedColumnName은 방금 그 column과 연결해줄 Entity A에서의 column 이름이다.

정리하자면,

@ManyToOne(() => A, (a) => a.b)
@JoinColumn({name: 'aId', referencedColumnName: 'id'})
a: A

이런 식이다.

prisma schema에서 @relation(fields: [aId], references: [id])과 같다.
즉 name이 fields 역할, referencedColumnName이 references 역할이다.

onDelete Cascade 설정

prisma schema에서처럼 onDelete: Cascade 설정을 하려면

@OneToMany()를 쓰는 쪽, 즉 1:N에서 1에 해당하는 A에서는

@OneToMany(() => B, (b) => b.a, {cascade: true})
b: B

@ManyToOne()을 쓰는 쪽, 즉 1:N에서 N에 해당하는 B에서는

@ManyToOne(() => A, (a) => a.b, { onDelete: 'CASCADE' })
@JoinColumn({name: 'aId', referencedColumnName: 'id'})
a: A

이렇게 해주면 된다.

0개의 댓글