핵심 요약
복구·감사·참조 무결성이 중요하면 소프트 삭제(deleted_at 표시), 개인정보 삭제 의무·단순함·용량이 중요하면 하드 삭제다. 소프트 삭제는 모든 조회에 WHERE deleted_at IS NULL이 붙어야 하고 유니크 제약이 까다로워지는 비용이 있다.
1. 비교
| 소프트 | 하드 | |
|---|---|---|
| 복구 | 쉬움 | 백업 필요 |
| 쿼리 복잡도 | 필터 항상 필요 | 단순 |
| 개인정보 삭제 | 실제 미삭제(주의) | 완전 삭제 |
2. 소프트 삭제 주의
- 유니크 제약: 삭제된 행과 새 행의 email 충돌 → 부분 인덱스(
WHERE deleted_at IS NULL) - 모든 조회에 필터 누락하면 유령 데이터 노출 — ORM 전역 스코프로 강제
- 오래된 소프트 삭제는 주기적 하드 purge로 용량 관리
3. 함정
- 개인정보 보호법상 "삭제 요청"은 실제 삭제가 필요할 수 있다 — 소프트만으론 위반 소지
- 집계·통계에서 삭제 행을 빼먹거나 중복 포함하기 쉽다
자주 묻는 질문
소프트 삭제가 항상 더 안전한가요?
복구엔 유리하지만 개인정보 삭제 의무를 못 지킬 수 있고 쿼리·제약이 복잡해집니다. 법적 삭제 요건이 있는 데이터는 하드 삭제 또는 익명화를 병행하세요.
유니크 이메일이 소프트 삭제와 충돌해요.
활성 행만 대상으로 하는 부분 유니크 인덱스(WHERE deleted_at IS NULL)를 쓰면 삭제된 행과 충돌하지 않습니다.

댓글 0