Soft Delete란? 진짜로 지우지 않고 삭제하는 방법

Soft Delete란?

Soft Delete(소프트 삭제)는 데이터를 실제로 데이터베이스에서 제거하지 않고, ‘삭제된 것처럼’ 표시만 해두는 방식입니다. 반대로 데이터를 완전히 지워버리는 방식은 Hard Delete(하드 삭제)라고 부릅니다. 예를 들어 이메일 서비스에서 메일을 삭제하면 즉시 사라지는 게 아니라 ‘휴지통’으로 이동하는 것을 떠올리면 이해하기 쉽습니다. 실제로는 데이터가 어딘가에 남아있고, 사용자 눈에만 보이지 않을 뿐입니다.

동작 원리와 예시

Soft Delete는 보통 테이블에 deleted_at이나 is_deleted 같은 컬럼을 추가해서 구현합니다. 데이터를 삭제할 때 실제로 DELETE 쿼리를 실행하는 대신, 다음과 같이 값을 업데이트합니다.

  • UPDATE users SET deleted_at = NOW() WHERE id = 1;

이후 데이터를 조회할 때는 항상 WHERE deleted_at IS NULL 조건을 붙여서 삭제되지 않은 데이터만 보여줍니다. 최근에는 Django ORM, Laravel의 Eloquent, TypeORM 등 대부분의 프레임워크가 이 패턴을 기본 기능으로 지원하고 있어서 직접 컬럼을 관리하지 않아도 손쉽게 적용할 수 있습니다.

실무에서 왜 쓰는지

실무에서 Soft Delete를 선호하는 이유는 여러 가지가 있습니다.

  • 실수 복구: 사용자가 실수로 삭제해도 관리자가 다시 되살릴 수 있습니다.
  • 데이터 이력 추적: 언제 누가 삭제했는지 기록이 남아 감사(audit)나 통계 분석에 활용할 수 있습니다.
  • 참조 무결성 유지: 주문 내역처럼 다른 테이블과 연결된 데이터를 완전히 지우면 관련 데이터가 깨질 수 있는데, Soft Delete는 이런 문제를 방지합니다.
  • 법적/규제 요구사항: 금융이나 의료처럼 일정 기간 데이터 보존이 의무인 경우에도 유용합니다.

다만 단점도 있습니다. 삭제된 데이터가 계속 쌓이기 때문에 테이블 용량이 커지고, 모든 쿼리에 삭제 여부 조건을 빠짐없이 넣어야 하므로 개발자의 실수로 삭제된 데이터가 노출될 위험도 존재합니다. 따라서 개인정보처럼 민감한 데이터는 일정 기간이 지나면 배치 작업으로 완전히 삭제(Hard Delete)하는 정책을 함께 운영하는 경우가 많습니다. 즉, Soft Delete는 ‘안전한 삭제’를 위한 도구일 뿐, 영구 보관을 의미하는 것은 아니라는 점을 기억해야 합니다.

댓글 남기기