많은 개발자들은 데이터베이스에서 데이터를 물리적으로 삭제하는 대신, 논리적 삭제 방식을 선호하곤 한다. 여기서 물리적/논리적이란 무엇이고, 왜 물리적인 삭제를 꺼리는 것인지 이유를 알아보려 한다.
물리적 삭제는 데이터 자체를 삭제하여 데이터베이스에서 데이터를 완전히 제거하는 방식이다.
논리적 삭제는 데이터 필드에 'isDelete'와 같은 삭제 여부를 나타내는 값을 추가해서, 데이터베이스 상에서 데이터가 남아는 있지만 '삭제된' 꼬리표를 붙여서 구분하는 방식을 뜻한다.
물리적으로 데이터를 삭제할 경우, 삭제된 데이터는 복구하는 것이 대단히 어려워진다.
삭제한 데이터가 나중가서 보니 필요한 것이었다.
삭제하면 안되는 데이터를 실수로 삭제해버렸다.
실제로 운영되는 서비스에서 고객 데이터와 같은 중요 데이터가 삭제되었다고 생각해보자. 당장 서비스에 발생되는 피해는 상당한 수준이고, 복구 자체가 불가능하다면 가히 재앙에 가까운 일이 일어나버리게 된다.
반면에 논리적 삭제의 경우 데이터베이스에는 여전히 데이터가 남아있기 때문에 나중가서 언제든 다시 사용할 수 있다.
데이터베이스는 결국 데이터의 집합체이다. 각각의 데이터들은 필요에 따라서 다른 데이터와 '참조' 등의 관계로 연결되어있곤 하다.
그런데 이런 복잡한 관계도 속에서 데이터를 물리적으로 삭제해버린다면? 참조 관계에 손상이 발생하면서 서비스 동작에 문제를 발생시키게 되고, 외래 키(FK) 관계에 놓여있는 데이터가 삭제되었다면 아예 해당 서비스가 에러와 함께 동작 불능에 빠질 수도 있다.
논리적 삭제를 이용하면 참조 관계를 유지한 채 데이터의 상태만 변경할 수 있어, 데이터 무결성을 보장할 수 있다.
데이터를 삭제하는 것은 쉽다. 다만 사용자 입장에서 쉽다는 것이지, 실제로 데이터베이스 내부에서는 상당한 자원을 필요로 하는 작업이다. 특히 대량의 데이터를 삭제할 경우에는 순간적으로 데이터베이스 성능에 큰 악영향을 미칠 수 있을 정도.
논리적 삭제는 데이터를 삭제하는 대신 필드 값을 업데이트하는 방식으로 상대적으로 자원 소모가 적어 성능 유지 측면에서 더 유리하다.
데이터 테이블 내부에 'isDelete' 필드를 추가하는 등의 방법으로 논리적 삭제 방식을 적용하면 된다. 논리적 삭제 방식에서는 데이터가 삭제된 것처럼 보이지만, 실제로는 안전하게 보관되기 때문에 필요 시 복구하거나 추적할 수 있다.
실제 상용 서비스에서도 계정을 삭제하거나 탈퇴하였다고 계정 데이터를 물리적으로 지우기보다는 일정 기간 동안에 논리적 삭제 방식으로 데이터를 보존시켜둔다. 추후 복구가 필요할 경우를 대비해두는 것이다. (물론 일정 기간이 경과하면 그때는 물리적으로 삭제해버린다.)
덕분에 좋은 정보 얻어갑니다, 감사합니다.