# 물리적 삭제와 논리적 삭제
보통 데이터베이스의 데이터를 삭제하는 방법으로 크게 물리적 삭제
와 논리적 삭제
를 고려할 수 있다. 이것은 각각의 SQL 쿼리가 존재하는 것이 아닌 처리 방식에 대한 차이가 존재한다.
# 물리적 삭제
물리적 삭제는 DELETE
명령을 통해 데이터베이스에 직접 데이터를 삭제하는 방법이다. 삭제라는 과정을 통해 실제 데이터를 제거하는 것은 너무나 자연스러운 흐름이다.
# 논리적 삭제
논리적 삭제는 실제로 데이터를 삭제하는 것이 아니라 UPDATE
명령을 이용해서 삭제 플래그의 값을 갱신해주는 삭제 방법이다. 이러한 플래그 값을 boolean
으로 관리하여 SELECT
시점에 WHERE
를 통해 제외한 뒤 조회할 수 있다. 물리적으로 삭제된 것은 아니지만 논리적으로 삭제된 것 처럼 활용할 수 있다.
논리적 삭제는 데이터를 직접적으로 삭제하지 않기 때문에 중요한 정보를 담은 컬럼인 경우 플래그 변경을 통해 간단하게 복구가 가능하다. 또한 사용자 정보 보호에 관한 요구사항이 존재하는 경우 실제로 해당 데이터를 장기간 보관해야 할 때는 이러한 방식으로 삭제된 것 처럼 처리할 수 있다.
단점으로는 논리적인 삭제 이기 때문에 데이터베이스의 공간이 그대로 유지되며 데이터베이스에 데이터가 늘어나며 검색 속도에 영향을 끼치게 된다.
# 그래서 뭘 선택해야 할까?
정리하면 정답은 없다. 각 상황과 데이터의 특성에 따라 상황에 맞게 선택해야 한다. 가령 배달관련 도메인에서 배달이 취소 되었다고 가정한다. 해당 데이터를 물리적으로 삭제하는 것 보다 어떠한 음식과 장소에서 배달이 취소 되었는지에 대한 정보들을 확인해야 하기 때문에 논리적 삭제가 적합하다.
한 가지 예시로 우리 달록 (opens new window)에서는 일정을 공유하기 위한 카테고리를 구독
할 수 있다. 이러한 구독 정보는 삭제 되었을 때 사용자에게 유의미한 데이터를 제공할 필요가 없기 때문에 물리적 삭제를 진행해도 무방하다.
# References.
아사이 아츠시, 『SQL 첫걸음』, 박준용 옮김, (한빛 미디어, 2015), 174 ~ 177.