Computer Science/Database

DB Soft Delete VS Hard Delete

do_hyuk 2024. 3. 20. 08:52

Soft Delete 와 Hard Delete 란?

데이터베이스에서 데이터를 삭제하는 방법은 크게 두 가지로 나뉩니다.

 

  • Hard Delete
    우리가 잘 아는 Delete 문을 사용하여 실제 row를 삭제하는 방법

  • Soft Delete
    삭제 표시(deleted_at 필드에 현재 시간을 넣어주는 방법 등)를 해줌으로써 
    삭제된 필드라는 의미를 부여하는 방법

이 글을 쓴 이유

데이터간 관계있는 경우, join을 계속해서 해야하는 경우 Soft Delete를 이용하는 경우가 종종 있습니다.

 

다음 내용은 이벤트 티케팅 서비스에서 Soft Delete로 인하여 장애를 겪었던 이야기입니다.

좌석이 결제/예약이 되면 deleted_at으로 예약됨을 표시하고 있는 서비스에서 예약된 좌석을 뽑아내어 다시 재저장하는 
DB 마이그레이션 작업이 필요하게 되었는데, 작성자가 사용한 ORM 라이브러리에서는 해당 Soft Delete를 제대로 filter 하지 못하여,
예약된 좌석도 예약 가능으로 표시되어 같은 좌석이 무한으로 예약 되었다고 합니다.

결론은 다중 예약 문제로 인해 Soft Delete에 대해 다시 고민하기 시작했다는 경험 이야기입니다.

 

제가 생각하기에는 단순히 Soft Delete만의 이슈가 아니지만, 너무 당연하게 쓰고 있었다면,

내가 쓰고있는 방법에는 취약점이 없을까? 한번 더 고민해보게 되어 이 글을 작성했습니다.


Soft Delete의 문제점

1. 복잡성 증가 : delete에 대한 표시를 위해 로직을 이해해야 하고, 그렇지 못하면 데이터 노출, 부정확한 데이터를 만들어 낼 수 있습니다.

2. 인덱스, unique 등 제약조건 생성시 계속 "delete" 표시에 대한 것을 고려해야 되며 유지 관리를 복잡하게 할 수 있습니다.

3. soft delete를 하게되면 where조건으로 한번 더 데이터를 확인해야해서 비효율적일 수 도 있다.


Soft Delete의 대안

1. 삭제 데이터 따로 보관 :
과거 데이터에 대한 유지를 해야하는 경우 별도 삭제 데이터 스토리지에 저장하고, 본래 테이블에서는 Hard Delete 실행

 

2. Audit log(감사로그)를 이용하여 데이터 변경 기록 저장하기


결론

soft delete vs hard delete을 적용하는거는 상황에 따라 다르다.

어떤 데이터인가, 꼭 지워야하는가, 안 지우면 unique 처리는 어떻게 하는가 등등 여러가지 고민을 해보고 결정해야 한다.

where 조건이 붙는게 없는 것 보다 연산이 더 들어가긴하지만, soft delete을 해야되는 상황이거나 구현해서 얻는 이점이 더 크다면

감수하고 사용하는 것이 좋다.