SQL

Soft Delete, Hard Delete (논리삭제와 물리삭제)

Lahezy 2023. 5. 9.
728x90

프로젝트를 하다가 이런 생각을 하였다

멤버를 삭제하면 그냥 진짜 바로 삭제해야 하나..?

근데 그렇게 되면 만약 유저가 잘못 누른 경우라면? 만약 이 사람이 우리 사이트를 악용해서 관련 기록을 찾아야 한다면? 의 의심이 들었다.

그리고 실제로 많은 서비스에서 일주일, 한 달간은 다시 로그인을 하면 회원 탈퇴를 해지할 수 있다.

 

그런 의심을 품고 프로젝트를 하다가 최근 새로운 강의를 들으면서 Soft delete라는 것을 알게 되었다.

 

Soft Delete(논리 삭제)

기존의 SQL DELETE 명령어를 이용해 직접 데이터를 삭제하는 방법은 Hard Delete(물리삭제) 방법이다.( 데이터 베이스에서 찐 삭제 -> 삭제한 이상 조회 할 수 없음 )

 

여기서 말하고자 하는 soft delete는 UPDATE 명령어를 이용해서 삭제여부를 확인할 수 있는 칼럼을 업데이트하고 조회(SELECT) 시에 해당 필드의 값이 비어져 있거나 없는 경우의 데이터만 조회하는 방법이다.

 

Hard Delete예시

예를 들어보자면

member id 이름 나이
1 룰루 20
2 랄라 10

위의 데이터를 hard delete를 하는 경우 

DELETE FROM member WHERE id = 2;
member id 이름 나이
1 룰루 20

과 같이 한 개의 행 자체가 삭제된다.

 

Soft Delete 예시

member id 이름 나이 삭제 여부 or 삭제 시간(deleted_at)
1 룰루 20 NULL
2 랄라 10 NULL

위의 데이터에서 만약 soft delete를 이용한다면 

UPDATE member SET deleted_at = NOW() WHERE id = 2;
member id 이름 나이 삭제 여부 or 삭제 시간(deleted_at)
1 룰루 20 NULL
2 랄라 10 2023-05-10 09:30:00 (데이터 베이스 서버의 시간  기준)

와 같이 변경된다.

이후 조회 시에는 삭제 시간이 있는 경우는 제거하고 조회하면 된다.

 

장점과 단점

단점

사실 그래서 기존의 프로젝트를 하면서 activate 필드를 이용해서 탈퇴를 하여도 관련 컬럼만 변경하고 데이터 베이스 자체를 삭제하지는 않도록 하였다. 근데 문제는 어떻게 조회기능을 사용할지였다.  모든 서비스 단에서 해당 필드가 있는지를 확인하는 쿼리문을 생성해야 하는 걸까? 에 대한 고민이었다. 

 

앞에서 말한 것처럼 논리 삭제를 수행하는 경우 조회 시 모든 경우에 해당 쿼리를 넣어 주어야 한다는 단점이 있다.

거기다 필드가 하나 더 늘어남으로 인해 데이터가 증가하고, 필요 없는 데이터가 남아 데이터 베이스의 용량이 커져 서버에 부담이 갈 수 있다.

 

요약하자면 복잡성이 증가하고 데이터 베이스 오류가 증가할 수 있다. 또한 외래키를 관리하는 것이 어렵다. (그냥 데이터 베이스 관리가 어렵다) 

 

장점

하지만 데이터 손실을 방지하고, 작업을 통해 데이터를 복구할 수 있다는 장점이 있다. 

 

 

관련된 논의는 지속적으로 많은 것 같다  대부분 hard delete 가 좋다는 의견이 많은 것을 보면 데이터가 중요한 경우라면 보존하고 아니라면 삭제하는 방향이 좋지 않을까?라고 개인적으로 생각했다. -:

추가로 soft delete 방법도 있지만 삭제한 데이터를 별도의 삭제 테이블에 저장하는 방법도 있다고 한다.

 

 

 

https://abstraction.blog/2015/06/28/soft-vs-hard-delete#recommendation

https://www.dolthub.com/blog/2022-11-03-soft-deletes/

https://velog.io/@taeha7b/hard-delete-softdelete

https://brandur.org/soft-deletion

https://www.inflearn.com/questions/304378/baseentity%EC%99%80-softdelete-%EC%A7%88%EB%AC%B8

728x90

'SQL' 카테고리의 다른 글

SQL  (0) 2023.04.10

댓글