1. 소프트 삭제(Soft Delete)
- 데이터베이스를 다룰 때 일반적으로 데이터를 물리적으로 삭제하는 작업이 필요합니다.
- 그러나 비즈니스 요구사항에 따라 데이터를 영구적으로 삭제하지 않아야 하는 경우가 있습니다.
- 데이터 히스토리 추적
- 감사(Audit) 목적
- 참조 무결성(Reference Integrity) 유지
- 이런 상황에서는 데이터를 실제로 삭제하는 대신, 단순히 '삭제된 상태'로 표시하여 애플리케이션에서 접근할 수 없게 만들 수 있습니다.
- 이러한 기법을 소프트 삭제(Soft Delete) 또는 논리적 삭제(Logical Delete)라고 합니다.
2. 소프트 삭제란?
- 소프트 삭제는 데이터베이스 테이블에서 데이터를 물리적으로 삭제하는 대신, 해당 데이터를 '삭제됨'으로 표시하는 업데이트 프로세스를 수행합니다.
- 일반적인 구현 방법은 데이터가 삭제되었는지 여부를 나타내는 필드를 추가하는 것입니다.
2.1 예시: 물리적 삭제 vs 소프트 삭제
- 다음과 같은 구조의 상품 테이블이 있다고 가정해봅시다:
+----+------------------+--------+
| id | name | price |
+----+------------------+--------+
| 1 | Smartphone | 599.99 |
| 2 | Laptop | 999.99 |
| 3 | Wireless Earbuds | 129.99 |
+----+------------------+--------+
물리적 삭제
- 물리적 삭제의 경우, 다음과 같은 SQL 명령을 실행합니다:
DELETE FROM table_product WHERE id=1
- 이 명령은 id가 1인 제품을 데이터베이스 테이블에서 영구적으로 제거합니다.
소프트 삭제
- 소프트 삭제를 구현하려면 먼저 테이블에 삭제 여부를 나타내는 필드를 추가합니다:
+----+------------------+--------+---------+
| id | name | price | deleted |
+----+------------------+--------+---------+
| 1 | Smartphone | 599.99 | 0 |
| 2 | Laptop | 999.99 | 0 |
| 3 | Wireless Earbuds | 129.99 | 0 |
+----+------------------+--------+---------+
- 'deleted' 필드에는 0 또는 1 값이 들어갑니다.
- 1은 데이터가 삭제되었음을 나타냅니다.
- 0은 데이터가 삭제되지 않았음을 나타냅니다.
- 따라서 삭제 프로세스에서는 DELETE 명령 대신 다음과 같은 UPDATE 명령을 실행합니다:
UPDATE table_product SET deleted=1 WHERE id=1
- 이 방식으로 실제로 행을 삭제하지 않고 단지 '삭제된 상태'로 표시만 합니다.
- 데이터를 조회할 때는 삭제되지 않은 행만 가져오도록 필터를 추가합니다:
SELECT * FROM table_product WHERE deleted=0
3. Spring JPA에서 소프트 삭제 구현하기
- Spring JPA를 사용하면 소프트 삭제 구현이 훨씬 간단해집니다.
- 몇 가지 JPA 어노테이션만으로 이 기능을 구현할 수 있습니다.
- JPA는 대부분의 SQL 쿼리를 내부적으로 생성하고 실행하므로, 우리는 이 메커니즘을 활용할 수 있습니다.