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 })
데이터베이스에서 해당이 맞는 회원을 삭제합니다.
이는 위험한 방식이므로 비추천합니다.