예시
@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()() => B, (b) => b.a 로 쓰면 된다.정리하자면,
@OneToMany(() => B, (b) => b.a)
b: B[]
이런 식으로 쓰면 된다.
@OneToOne()
1:1 relation을 맺어준다.
@ManyToOne()
N:1 relation을 맺어준다.
위의 예시에서 @OneToMany()를 쓴 Entity가 A라면,
@ManyToOne()은 Entity B 쪽에 써준다.
@JoinColumn()정리하자면,
@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
이렇게 해주면 된다.