-
Hard Delete와 Soft DeleteCS/데이터베이스 2023. 7. 17. 00:01728x90
개요
데이터베이스에서 회원탈퇴와 같은 일이 일어났을 때 userStatus를 탈퇴상태로 바꿀 건지, 회원의 정보를 모두 삭제할지 고민하곤 합니다.
hard delete와 soft delete에 대해 알아보고, 어떤 장단점이 있는지 알아보고자 합니다.
Soft Delete란?
논리적으로만 삭제하는 방법입니다.
사용자가 한때 접근할 수 있었지만 더 이상 접근할 수 없는 데이터로 만들어 사용할 수 없게 만드는 프로세스입니다.
회원상태가 USING(이용 중)이라면 WITHDRAW(탈퇴)로 상태만 변경하여 해당 데이터는 DB에 그대로 남아있게 됩니다.
UPDATE 쿼리가 발생합니다.
Hard Delete란?
데이터베이스에서 영구적으로 데이터를 삭제하는 일입니다.
DELETE 쿼리가 발생합니다.
다양한 관점에서 soft delete와 hard delete의 장단점을 바라보도록 하겠습니다.
데이터 복구의 용이성
Hard Delete의 경우에는 audit(history) 테이블에 데이터를 복사해 놓는 경우 복구를 진행할 수 있습니다.
하지만 Soft Delete의 경우에는 열만 Update만 진행하면 됩니다.
Soft Delete👍
활성 데이터 조회
Soft Delete의 경우에는 where 조건에 delete_falg = "0" 조건을 추가하는 것을 까먹었을 때 문제가 발생할 가능성이 있습니다.
반면 Hard Delete는 삭제된 데이터를 조회될 가능성이 없습니다.
Hard Delete👍
Database 성능
update가 delete보다 microseconds 만큼 빠릅니다.
감사 테이블의 삽입까지 생각해보거나 인덱스의 재배열까지 고려하면 update가 훨씬 빠릅니다.
(postgresql은 vacuum으로 인해 update, delete가 dead_tuple으로 쌓이는 DBMS마다 다른 특성도 고려해 볼 수 있습니다)
(MySQL innoDB의 경우에도 직접적으로 인덱스 재배열이 일어나지 않고 지연처리가 되어 사용자의 영향도는 없습니다.)
다만 delete의 인덱스 재배열때문에 서비스가 느려질 정도라면 insert도 느려질 테고 파티션이나 샤딩을 고려할 시점이 아닐까 생각됩니다.
Soft Delete👍
Database 기능 호환성
soft delete의 경우에는 ON Delete Cascading을 사용할 수 없습니다.
대안은 delete_flag의 UPDATE Trigger를 생성하는 것입니다.
Hard Delete👍
Application 성능
soft delete를 위해선 query에 조건이 필요하고 join을 수행할 때 이런 조건이 여러 개 있을 수 있습니다.
조건이 많은 것보다 적은 것이 빠르기 때문에 성능상으로 Hard Delete에 이점이 있습니다.
또한 테이블 크기가 계속 증가하기 때문에 테이블 크기가 증가하면 쿼리 속도가 느려질 수 있습니다.
Hard Delete👍
결론
어떤 데이터를 삭제하느냐에 따라 다르겠지만 일반적으로는 soft delete가 더 좋을 것 같습니다.
유저들이 서비스를 사용하면서 쌓고 있는 많은 데이터들이 범법 행위가 아닌 경우에는 마케팅이나 사업적인 방향에 활용할 수 있습니다.
참고자료
https://www.postgresql.org/docs/current/sql-vacuum.html
https://www.becomebetterprogrammer.com/soft-delete-vs-hard-delete/
https://abstraction.blog/2015/06/28/soft-vs-hard-delete
'CS > 데이터베이스' 카테고리의 다른 글
Deferred Join이란? - 이론편 (0) 2023.10.28 PostgreSQL 데드락 발생시키기 (0) 2023.08.23 캐시 전략 (0) 2023.07.10 Redis Intellij DataGrip 적용 (0) 2023.07.02 docker에서 postgresql table 확인 (0) 2023.06.27