소프트 삭제에 대한 냉혹한 진실

The hard truth about soft deletion

작성자
발행일
2025년 07월 23일

핵심 요약

  • 1 소프트 삭제는 레코드를 실제로 파괴하지 않고 '삭제됨'으로 표시하는 방식이지만, 구현 시 여러 복잡성이 발생합니다.
  • 2 개발자는 삭제된 레코드를 쿼리에서 수동으로 제외해야 하며, 종속 레코드 및 인덱스 처리에도 주의가 필요합니다.
  • 3 소프트 삭제의 도입은 신중하게 고려해야 하며, 데이터 백업이나 UI 개선과 같은 대안이 더 나을 수 있습니다.

도입

이 글은 C# 코드를 Rails 앱으로 포팅하는 과정에서 소프트 삭제(soft deletion) 방식에 대한 깊이 있는 논의를 다룹니다. 소프트 삭제는 레코드를 영구적으로 제거하는 대신 '삭제됨' 상태로 표시하여 사용자 경험에서만 제외하는 방식입니다. 이는 실수로 삭제된 데이터를 복원하거나 특정 기간 동안 기록을 유지해야 하는 법적 요구사항을 충족하는 데 유용할 수 있습니다. 예를 들어, GitHub에서 삭제된 브랜치를 복원하는 것과 같이 사용자가 '실행 취소' 기능을 필요로 하는 워크플로우에서 특히 유용하게 사용될 수 있습니다.

소프트 삭제는 분명한 장점에도 불구하고 여러 가지 복잡성을 수반합니다. 첫째, 소프트 삭제가 적용된 코드베이스에서 개발자는 데이터베이스 쿼리를 실행하거나 데이터를 표시할 때 삭제된 레코드를 항상 수동으로 제외해야 한다는 점을 기억해야 합니다. Active Record를 사용하는 경우 이를 돕는 젬(gem)이 있지만, 원시 SQL을 사용하거나 비-Rails 앱을 통해 데이터에 접근할 때는 개발자의 주의가 더욱 요구됩니다. 이는 ‘모든 사람이 항상 기억해야 할 일’ 목록에 추가되며, 실제로는 종종 누락될 수 있는 부분입니다.

둘째, 종속 레코드(dependent records) 처리에서 문제가 발생할 수 있습니다. 일반적인 삭제는 dependent: :destroy와 같은 옵션을 통해 관련 레코드도 함께 삭제되도록 보장합니다. 하지만 소프트 삭제 시에는 부모 레코드가 소프트 삭제로 표시될 때, 종속 레코드도 함께 소프트 삭제되도록 주의해야 합니다. 그렇지 않으면 의도와 달리 종속 레코드가 완전히 삭제될 수 있습니다. 이는 개발자가 소프트 삭제를 사용할 때 추가적으로 기억해야 할 또 다른 중요한 사항입니다.

셋째, 데이터베이스 인덱싱을 복잡하게 만듭니다. 기존 인덱스의 속도 이점을 유지하려면 데이터베이스가 부분 인덱스(partial index)를 지원하는 경우 비-삭제된 레코드만 포함하도록 인덱스 범위를 지정해야 합니다. 또한 고유성 제약 조건(uniqueness constraints)도 삭제된 레코드를 제외하도록 업데이트해야 합니다. 기존 레코드와 충돌하는 레코드를 ‘삭제 취소’해야 할 경우를 어떻게 처리할지도 고려해야 합니다. 이 모든 추가적인 고려 사항들은 개발 과정에서 오류를 유발할 가능성을 높입니다.

결론

결론적으로, 소프트 삭제의 도입 여부는 신중하게 결정되어야 합니다. 중요한 데이터 손실에 대한 우려가 있다면, 안정적이고 정기적인 백업만으로도 충분할 수 있습니다. 사용자의 의도치 않은 삭제 및 복원 요구가 있다면, UI를 개선하여 처음부터 삭제를 방지하는 것이 더 효과적일 수 있습니다. 단순히 '항상 그렇게 해왔기 때문'이라는 이유로 소프트 삭제를 유지하는 것은 재고해 볼 필요가 있습니다. 소프트 삭제와 관련된 버그 및 고객 지원 문제를 새로운 대안을 시도하는 불편함과 비교하여 평가하는 것이 중요합니다. 소프트 삭제는 개발자에게 많은 추가적인 주의와 작업을 요구하므로, 그 필요성을 면밀히 검토하고 대안을 고려하는 것이 현명합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!