물리삭제와 논리삭제

안녕하세요.

 

오늘은 물리삭제와 논리삭제에 대한 내용을 정리해보고자 합니다.

SQL을 배울때 기본적으로 특정 테이블의 레코드를 삭제처리할 때는 DELETE 쿼리를 아래와 같이 실행할 것입니다. (물리삭제)

DELETE FROM table WHERE seq = 1  -- 물리삭제 쿼리

그런데 제가 처음 실무를 접했을 때, 많은 테이블에서 DELETE 쿼리를 실행하지 않고 삭제처리를 하고 있었습니다. DELETE 쿼리를 실행하지 않고 어떻게 삭제처리를 할 수 있을까요?

 

바로 논리적인 개념의 컬럼을 추가하고 해당 컬럼을 UPDATE 실행을 하면 삭제되었다고 여기는 것입니다.

아래는 해당 논리 삭제의 UPDATE문 입니다.

UPDATE table is_delete = true, delete_time = now() WHERE seq = 1 -- 논리삭제 쿼리

 


왜 논리삭제를 하는가?

이것은 다양한 이유가 있겠지만 가장 우선적으로 떠오르는 것은 데이터가 유지되어야하는 속성의 테이블의 경우에는 논리삭제로 해당 테이블 레코드의 가장 마지막 순간을 남겨놓는 것으로 생각됩니다. 예를 들어, 특정 도메인을 관리하는 화면에서 해당 도메인 레코드를 삭제했다고 하더라도 운영자의 입장에서는 해당 유저가 특정 시각에 특정 도메인 레코드를 삭제했다는 사실은 인지해야 운영상에 서비스 고객에게 제공하는 서비스의 질이 더욱 높아질 가능성이 높기 때문입니다.

 

 

논리삭제의 장점과 단점에 대해서 알아보겠습니다. 논리삭제의 장/단점은 반대로 물리삭제의 단/장점이 될 수 있습니다.

논리삭제의 장점은 무엇인가?

논리삭제는 아무래도 삭제된 데이터를 SELECT로 조회할 수 있기 때문에 물리적으로 삭제하는 물리삭제보다는 조금더 데이터 관리상 안전한 편에 속합니다. 

 

논리삭제의 단점은 무엇인가?

단점은 아무래도 물리적으로 한번 쌓인 데이터는 삭제하지 못하는 구조이기 때문에 데이터베이스의 용량이 매우 비대해질 수 있습니다. 따라서 해당 테이블이 물리삭제 대상인지 논리삭제 대상인지에 대한 적절한 구분이 반드시 필요합니다.

또한 논리삭제는 DB 스키마 구조에서 불필요한 컬럼을 하나 차지하게 되므로 검색조건시에 삭제처리된 레코드의 경우 반드시 필터해주어야 하기 때문에 SELECT 조회시 불필요한 검색조건을 추가해야 합니다. 또한 SELECT 쿼리의 조회 성능 향상을 위해 반드시 index 필드를 설정해두어야 할텐데 해당 index 필드셋에 논리삭제 컬럼이 반드시 추가되어야 할 것입니다.(WHERE 랜덤 엑세스 최소화를 위해, 랜덤엑세스에 대한 자료는 여기를 확인해주세요.)

 

 

어떤 테이블 데이터를 물리삭제/논리삭제 해야하는가?

우선 위에서 언급했다시피 삭제되더라도 데이터가 유지되어야 할 법한 속성의 테이블에는 논리삭제를 도입하는 것이 좋습니다. 서비스 운영상 고객에게서는 다양한 삭제 케이스를 인입받게 되는데 그러한 상황에서의 대처를 유연하게 하기 위해서는 논리삭제가 유리합니다.

 

하지만 테이블의 레코드가 특정 상황에서만 필요하고 기록의 의미로써 유효하지 않다면 단순히 물리삭제로 처리해도 좋을 것 같습니다. 간단한 예시로는 특정 도메인간의 매핑이 있을 것 같습니다. 예를 들어, 통신사 가족결합을 한다고 했을 때, 부모님과 저의 관계는 가족결합이라는 서비스에 가입했을 때 유효합니다. 따라서 가족결합을 해지할 경우에 해당 번호간의 관계는 제거될 수 있으므로 가족결합 관계 매핑 테이블의 경우는 물리삭제를 도입할 수 있을 것 같습니다.

 

 

테이블에서 컬럼으로 삭제처리하는 것만이 논리삭제라고 할 수 있는가?

아니라고 생각한다. 위에서 가족결합 관계 매핑 테이블에서 기존 가족결합 상품 가입기록을 확인해야할 필요가 있다면 별도의 history 테이블에 쌓을 수 있습니다. 이러한 경우도 결국 특정 테이블에서는 물리적으로 삭제되지만 결과적으로 삭제된 내용을 다른 테이블에 기록하기 때문에 일종의 논리적 삭제라고 볼 수 있을 것 같습니다.(하지만 특정 테이블을 기준으로 한다면 물리삭제가 맞겠네요.)

또한, 동일한 스키마 구조를 가진 table과 delete_table을 유지하는 방법도 있을 것 같습니다.

 

댓글

Designed by JB FACTORY