Soft delete와 Hard delete를 비교해보자

Yeshin Lee
4 min readDec 12, 2023

TL;DR

  • Soft delete는 삭제 여부 칼럼을 생성하고 실제로는 삭제하지 않아 복구할 수 있다.
  • Hard delete는 데이터를 완전히 삭제하여 복구할 수 없다.
DELETE FROM table_name WHERE condition;

데이터베이스 내 테이블에서 데이터를 삭제할 때, 보통 위 명령어를 실행한다.

만약 복구할 가능성이 있는 데이터를 삭제하고 싶다면?

이때, 실제로 삭제하지 않았지만 삭제된 것처럼 보이는 Soft delete를 사용할 수 있다.

반대로 위 명령어의 실행 결과처럼 데이터를 완전히 삭제하는 방법을 Hard delete라고 한다.

DELETE임에도 반대되는 두 방법의 특징과 사용 예시를 알아보자.

Soft delete(논리 삭제)

  • UPDATE 명령어를 사용한다.
  • 데이터를 물리적으로 삭제하지 않고 삭제 여부 칼럼(sequelize: deleteAt 칼럼) 생성으로 ‘삭제되었음'을 표시한다.
  • Sequelize에서 모델 선언 시 paranoid: true 옵션을 추가한다.
// Sequelize 모델 정의
export const initPost = (sequelize: Sequelize) => {
...,
{ modelName: 'Post', sequelize, paranoid: true },
...
}

// UPDATE 'post' SET 'deleteAt'=[timestamp] WHERE 'deleteAt' IS NULL AND 'id' = 1
await Post.destroy({
where: {
id: 1
}
});

// soft delete로 삭제된 데이터를 복원하고 싶다면 restore 메서드를 사용한다
await Post.restore({
where: {
id: 1
}
});
  • paranoid: false 조건을 추가하면 Soft delete된 데이터도 검색할 수 있다.
await Post.findByPk(123);
await Post.findByPk(123, { paranoid: false });

await Post.findAll({
where: { foo: 'bar' }
});

await Post.findAll({
where: { foo: 'bar' },
paranoid: false
});

Hard delete(물리 삭제)

  • DELETE 명령어를 사용한다.
  • 데이터 자체를 삭제하기 때문에 복원할 수 없다.
  • 쿼리가 직관적이고, 데이터 용량을 효율적으로 사용할 수 있다.
  • Sequelize에서 Soft delete가 적용된 테이블에 Hard delete를 실행하고 싶다면, force: true 옵션을 추가한다.
// DELETE FROM 'post' WHERE 'id' = 1
await Post.destroy({
where: {
id: 1
},
force: true
});
  • 보안이 요구되거나 중요도가 낮은 일회성 데이터 등에 적용할 수 있다.

데이터를 처리하는 두 방법의 장단점이 명확하기 때문에,

테이블의 특성, 비즈니스 상황에 따라 유연하게 적용하자.

--

--