개발을 하면서 아직 해결되지 않은 고민이 있었는데, 바로 '데이터 삭제를 어떻게 할 것인가?'였다. 개발을 공부한지 얼마 안되었을 때는 '그냥 DB에 delete 쿼리 날려서 조건에 맞는 레코드 삭제하면 되는거 아닌가?'라고 생각했었다. 하지만 팀 프로젝트를 하거나 실무를 경험했을 때 생각보다 데이터 삭제에는 여러 상황이 얽혀있기 때문에 상황에 맞추어 삭제 방식을 선택해야함을 알게 되었다. 그 중 Soft Delete와 Hard Delete에 대해 공부한 내용이다.

 

1. Soft Delete란?

데이터베이스에서 데이터를 삭제하지 않고, 사용자 입장에서는 데이터에 접근할 수 없게 하는 방식을 의미한다. 보통 테이블에 is_deleted컬럼을 만들어 boolean값으로 데이터를 사용여부를 결정하는 방식이다. is_delete = 0이면 조회 가능, is_deleted = 1이면 조회 불가능한 것처럼 말이다. 조건 컬럼이 들어가므로 is_deleted의 값을 체크하는 쿼리가 들어가야 한다.

// 예시
update user
set is_delete = 1
where user_name = "hello"

soft 삭제 시 사용자는 데이터가 삭제된 것처럼 해당 데이터에 접근 불가능하지만, 애플리케이션 DB에는 데이터가 여전히 존재한다. 때문에 내부에서 데이터를 계속 사용해야할 가능성이 있다면 soft delete 방식을 선택하는 것이 적합할 수도 있다.

 

2. Hard Delete란?

데이터베이스에서도 데이터를 직접 삭제하는 방식을 의미한다. 더이상 사용하지 않는 데이터를 DB에 저장하는 것은 저장공간을 낭비하는 것일 수 있다. 이런 경우 직접 데이터를 삭제함으로써 저장 공간을 확보할 수 있다. 

delete *
from user
where user_name = "hello";

 

 

3. 데이터를 물리적으로 삭제를 주의해야하는 이유는 뭘까? 

1. 사용자, 검색 기록과 같이 더 나은 서비스 개선을 위해 분석해야하는 데이터들이 있다.

2. 혹시나 데이터를 다시 복구해야하는 상황이 발생할 수 있다. 

3. update 쿼리가 delete 쿼리보다 몇 ms 더 빠르다.

4. 데이터는 곧 돈이다. 정보화 시대에서 데이터는 굉장히 중요하다. 

 

그렇기 때문에 직접적으로 데이터를 데이터베이스에서 삭제하는 Hard Delete 보다는, 데이터베이스에 데이터는 존재하지만 사용자가 접근할 수 없게 하는 삭제 방법인 Soft Delete가 하나의 방법이 될 수 있다.

 

그러면 모든 경우에 다 Soft Delete를 하면 되는걸까? 이에 대한 답은 NO 다. 모든 선택이 Trade Off인 만큼 Soft Delete가 애플리케이션에 단점으로 작용할 수 있는 상황도 있다. 

 

4. Soft Delete의 단점

여러 방면으로 사용될 수 있는 방식이 Soft Delete이지만 단점도 존재하고, 여러 상황을 고려하지 않고 무조건 soft delete를 사용할 경우 나쁜 영향을 미칠 수 있다.

 

Soft delete의 단점은 다음과 같다.

1. 테이블 크기가 조금 커진다(컬럼 하나 추가).

2. 실제로 사용되지 않는 데이터가 존재하기에 저장 공간이 무거워질 수 있다. 

3. 매번 삭제여부를 고려해야한다. (삭제여부를 고려해 쿼리나 로직을 작성해야한다)

 

5.  고민

음,, 상황에 맞춰서 선택해야한다는 거는 맞는데 그럼 각각 어떤 경우에 해당할까? 한번 생각해봤다. 내가 지금까지 프로젝트를 하면서 삭제를 해야했던 경우는 사용자 삭제(회원탈퇴), 피드 삭제, 댓글/대댓글 삭제, 카테고리 삭제가 있는 것 같다.

 

일단 사용자 삭제 같은 경우는 사용자 정보가 중요하고, 추후에 데이터 분석 시에 사용될 가능성이 있어 Soft Delete를 하면 좋을 것 같다. 

카테고리 삭제 같은 경우도 가계부에서 사용되는 카테고리라서 추후 월말 분석이나 연말 분석 시 카테고리별로 수입/지출을 분석해야할 수 있어 Soft Delete로 진행하면 될 것 같다. 또 카테고리 정보는 그렇게 DB 공간도 차지하지 않을 것 같다. 

 

반면에 피드나 댓글/대댓글은 분석하기에 데이터가 유저에 비해 너무 방대하기도 하고, 게시물이 있을 때 그것을 보여주기위한 로직이 더 중요하기도 하고, 계속해서 DB에 적재해두면 저장 공간을 꽤 차지할 것 같아 Hard Delete가 적합할 수 있을 것 같다. 

 

6.  결론

결론은 상황에 맞추어서 Soft Delete와 Hard Delete를 선택해서 사용해야한다는 것이다. 

셀프 분석을 해보자면,

Soft Delete는 서비스 개선에 중요한 데이터이고 DB 용량을 크게 차지하지 않는 데이터에 적용하면 될 것 같고

Hard Delete는 만료기한이 있거나 용량 차지하는 게 서비스 개선에 기여하는 것보다 더 큰 경우 (공간 낭비 > 서비스 효용) 적용하면 될 것 같다. 

 

서비스에서 어떤 것을 중요하게 여기고, 더 나은 서비스를 위해 분석해야할 데이터가 무엇인지 고민해볼 필요가 있는 것 같다. 

 

 

Reference

https://www.becomebetterprogrammer.com/soft-delete-vs-hard-delete/#Are_Soft_Deletes_Bad

https://resilient-923.tistory.com/419

+ Recent posts