피드로 돌아가기
Dev.toDatabase
원문 읽기
Filtered Index와 Global Query Filter 기반의 무결성 보장 Soft Delete 아키텍처
Implementing Soft Delete with Filtered Indexes in Entity Framework Core
AI 요약
Context
단순 IsDeleted 플래그 도입 시 발생하는 Unique Constraint 충돌 및 쿼리 중복 작성 문제 분석. 데이터 복구 경로 부재와 Cascade Delete로 인한 의도치 않은 데이터 삭제 위험 존재.
Technical Solution
- ISoftDeletable 인터페이스와 BaseEntity 구현을 통한 삭제 및 복구 라이프사이클의 표준화
- SaveChanges 오버라이드 기반의 ChangeTracker 가로채기를 통한 Delete 상태의 Modified 전환 처리
- OnModelCreating 내 Expression Tree를 활용하여 모든 ISoftDeletable 엔티티에 Global Query Filter 자동 적용
- DB Provider별 문법을 적용한 Filtered Index 설계를 통해 활성 데이터에 대해서만 Unique 제약 조건 유지
- DeleteBehavior.NoAction 설정을 통한 Soft Delete 메커니즘과 Cascade Delete 간의 충돌 방지
- IgnoreQueryFilters() 메서드를 활용한 관리자 뷰 및 복구 프로세스 전용 데이터 접근 경로 확보
실천 포인트
1. IsDeleted 플래그 도입 시 Unique Index에 Filtered Index가 적용되었는지 확인
2. 비즈니스 로직 내 Where(u => !u.IsDeleted) 중복 사용 여부를 점검하고 Global Query Filter로 전환
3. ExecuteDelete와 같은 Bulk Operation 사용 시 Change Tracker를 우회하여 Soft Delete가 작동하지 않음을 인지
4. 외래 키 설정 시 DeleteBehavior.NoAction 적용을 통해 물리적 삭제 연쇄 반응 차단