Node.js

[NestJS] TypeORM 논리 삭제(soft delete)와 물리 삭제(hard delete)

임채성 2022. 11. 9. 16:00

백엔드에서 삭제를 하는 방식은 두가지가 있습니다.

  • 논리 삭제: 저장된 데이터를 사용하지 않아서 논리적으로만 삭제하는 방법
  • 물리 삭제: 저장된 데이터를 실제로 삭제해버리는 방법

그렇다면 왜 논리 삭제를 사용할까요?

 

 

이유는 다양합니다.

  • AI 학습 데이터로 사용하기 위함.
  • 주고받은 채팅일 시, 법적인 문제가 생겼을 때 증거로 사용해야 하기 위함.
  • 관계(릴레이션)가 맺어져 있을 때 문제가 생김.

 

물리 삭제는 위험하며 귀찮은 방식이기 때문에 대부분의 서비스에서 논리 삭제를 이용합니다.

 

 

여기까지가 이론이고 이제 코드로 봅시다.


TypeORM이 논리 삭제와 물리 삭제를 확인해봅시다.

 

논리 삭제(soft delete)

@Entity('users')
export class User {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  @Column({ unique: true })
  username!: string;
  
  @Column()
  password!: string | null;
  
  @CreateDateColumn()
  createdAt!: Date;

  @UpdateDateColumn()
  updatedAt!: Date;

  @DeleteDateColumn()
  deletedAt!: Date | null;
}

이렇게 엔티티를 구현해둔 후

await this.repository.softDelete({ id: user.id })

softDelete가 된다면 deletedAt에 삭제한 시간 갱신되면서 null이 아니게 됩니다.

TypeORM에서는 이를 논리적인 삭제로 보고 이후 DB에서 값을 가져오는 쿼리를 보낼때 필터링하여 가져오지 않게 처리해줍니다.

 

 

물리 삭제(hard delete)

await this.repository.delete({ id: user.id })

데이터베이스에서 해당이 맞는 회원을 삭제합니다.

이는 위험한 방식이므로 비추천합니다.