Soft delete와 Hard delete를 비교해보자
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
});
- 연산시, Soft delete 데이터는 반드시 필터링(삭제 여부 칼럼: false)해야 한다.
- 스키마 구조 관점에서는 불필요한 조건을 추가하였으므로 쿼리가 직관적이지 않다.
- 물리적인 삭제가 아니므로 데이터 용량이 커질 수밖에 없다.
- 삭제 여부 칼럼 대신 삭제된 데이터만 저장한 테이블을 별도 생성해 관리할 수 있다.
- 데이터가 유지되어야 하는 속성(상태를 되돌릴 수 있는)을 가지거나 로그성 테이블(data tracking) 등에 사용할 수 있다.
Hard delete(물리 삭제)
- DELETE 명령어를 사용한다.
- 데이터 자체를 삭제하기 때문에 복원할 수 없다.
- 쿼리가 직관적이고, 데이터 용량을 효율적으로 사용할 수 있다.
- Sequelize에서 Soft delete가 적용된 테이블에 Hard delete를 실행하고 싶다면,
force: true
옵션을 추가한다.
// DELETE FROM 'post' WHERE 'id' = 1
await Post.destroy({
where: {
id: 1
},
force: true
});
- 보안이 요구되거나 중요도가 낮은 일회성 데이터 등에 적용할 수 있다.
데이터를 처리하는 두 방법의 장단점이 명확하기 때문에,
테이블의 특성, 비즈니스 상황에 따라 유연하게 적용하자.