소프트 삭제는 분명한 장점에도 불구하고 여러 가지 복잡성을 수반합니다. 첫째, 소프트 삭제가 적용된 코드베이스에서 개발자는 데이터베이스 쿼리를 실행하거나 데이터를 표시할 때 삭제된 레코드를 항상 수동으로 제외해야 한다는 점을 기억해야 합니다. Active Record를 사용하는 경우 이를 돕는 젬(gem)이 있지만, 원시 SQL을 사용하거나 비-Rails 앱을 통해 데이터에 접근할 때는 개발자의 주의가 더욱 요구됩니다. 이는 ‘모든 사람이 항상 기억해야 할 일’ 목록에 추가되며, 실제로는 종종 누락될 수 있는 부분입니다.
둘째, 종속 레코드(dependent records) 처리에서 문제가 발생할 수 있습니다. 일반적인 삭제는 dependent: :destroy
와 같은 옵션을 통해 관련 레코드도 함께 삭제되도록 보장합니다. 하지만 소프트 삭제 시에는 부모 레코드가 소프트 삭제로 표시될 때, 종속 레코드도 함께 소프트 삭제되도록 주의해야 합니다. 그렇지 않으면 의도와 달리 종속 레코드가 완전히 삭제될 수 있습니다. 이는 개발자가 소프트 삭제를 사용할 때 추가적으로 기억해야 할 또 다른 중요한 사항입니다.
셋째, 데이터베이스 인덱싱을 복잡하게 만듭니다. 기존 인덱스의 속도 이점을 유지하려면 데이터베이스가 부분 인덱스(partial index)를 지원하는 경우 비-삭제된 레코드만 포함하도록 인덱스 범위를 지정해야 합니다. 또한 고유성 제약 조건(uniqueness constraints)도 삭제된 레코드를 제외하도록 업데이트해야 합니다. 기존 레코드와 충돌하는 레코드를 ‘삭제 취소’해야 할 경우를 어떻게 처리할지도 고려해야 합니다. 이 모든 추가적인 고려 사항들은 개발 과정에서 오류를 유발할 가능성을 높입니다.