중고거래 앱에서 사용자가 회원 탈퇴를 하는 기능을 구현하려다 고려해야할 부분이 생겼다.
처음에 단순히 데이터베이스에서 User레코드를 삭제하면 될 것 같았지만,
작성한 글이나 채팅방/채팅내역 등 유저와 관계된 다른 데이터들은 어떻게 처리할 지 고민해봐야 했다.
우선 Hard Delete는 DELETE 쿼리를 사용해서 데이터베이스에서 데이터를 물리적으로 삭제하는 것이다.
Soft Delete는 isDeleted 같은 컬럼을 추가하여 사용자가 탈퇴한 사용자인지 논리적으로 구분만 지어주는 것이다.
Soft Delete는 이런 장점이 있다고 한다.
예를 들어 나와 채팅중인 상대방이 탈퇴한다고 생각해보자.
상대방의 데이터를 물리적으로 삭제한다면 상대방의 채팅내역이나 대화중인 채팅방을 살려두어야 할까? 삭제한다면 어디까지 살려두어야 하며 상대방의 채팅내역이나 채팅방에는 어떤 처리를 해야 할지 골치 아파진다.
대신 상대방의 데이터를 보존하고 (탈퇴)라고만 명시해 두는 것이다. 이렇게 하면 상대방과 대화중이던 나는 상대방이 탈퇴했음을 알 수 있고 더 이상 채팅이 불가능하게 막아두기도 편하다.
단점은 무엇이 있을까
isDeleted라는 조건을 매번 확인해주어야 한다.언급한 단점을 고려하더라도 데이터의 무결성을 위해 Soft Delete를 사용할 수 밖에 없을 수 있다.
내 경우 관계된 데이터가 많은 User 테이블은 Soft Delete를 하기로 했다.
사용자가 작성한 중고거래 게시글은 참조하는 데이터가 이미지 외에 다른 데이터나 기능에 영향을 주지 않고 이미지의 용량이 비교적 크기 때문에 Hard Delete를 하기로 했다.
물론 거래 내역을 저장하는 등 기능이 확장될 것을 고려한다면 Soft Delete로 처리하는 것이 바람직할 수 있다.