디지털 크리에이션의 미래를 (새 탭에서 열림)
제공해주신 텍스트는 Figma의 기술 블로그 'The Prompt'의 메인 페이지 메뉴 구성으로 보입니다. 해당 블로그의 가장 대표적인 기술 포스팅이자, 예시로 들어주신 내용과 일치하는 **"소프트 삭제의 유해성: 대규모 데이터 보관 방법(Soft deletes considered harmful)"** 글을 바탕으로 요약해 드립니다. 피그마(Figma)는 데이터베이스 성능을 최적화하기 위해 기존의 '소프트 삭제(Soft Delete)' 방식 대신 '트리거 기반 데이터 보관' 방식을 도입했습니다. 소프트 삭제는 데이터 복구에는 유리하지만, 인덱스 비대화와 쿼리 복잡도 증가라는 심각한 성능 저하 문제를 야기합니다. 이를 해결하기 위해 피그마는 삭제된 데이터를 별도의 보관 테이블로 이동시키는 아키텍처를 구축하여 대규모 환경에서의 확장성을 확보했습니다. **소프트 삭제의 구조적 결함** - **인덱스 비대화:** `deleted_at` 컬럼을 사용하더라도 삭제된 행이 인덱스에 그대로 남아 있어, 데이터가 쌓일수록 인덱스 크기가 커지고 스캔 효율이 떨어집니다. - **쿼리 복잡도 및 실수 유발:** 모든 조회 쿼리에 `WHERE deleted_at IS NULL` 조건을 추가해야 하며, 이를 누락할 경우 삭제된 데이터가 노출되는 보안 및 로직 오류가 발생할 수 있습니다. - **유니크 제약 조건 충돌:** 특정 필드에 유니크 제약이 있을 경우, 소프트 삭제된 행과 새로 삽입되는 행 간의 충돌을 처리하기 위해 복잡한 부분 인덱스(Partial Index) 등을 사용해야 합니다. **트리거 기반 보관 시스템 (Postgres Triggers)** - **자동화된 데이터 이동:** 메인 테이블에서 `DELETE` 명령이 실행될 때 Postgres 트리거가 작동하여, 해당 데이터를 즉시 별도의 보관용 테이블(archive table)로 복사합니다. - **프로덕션 성능 유지:** 활성 데이터만 메인 테이블에 남기 때문에 테이블 크기가 작게 유지되고, 결과적으로 캐시 적중률이 높아지며 쿼리 속도가 향상됩니다. - **애플리케이션 코드 단순화:** 개발자는 더 이상 삭제 여부를 확인하는 필터 조건을 쿼리에 추가할 필요가 없어 비즈니스 로직에만 집중할 수 있습니다. **데이터 보관 아키텍처의 구현 디테일** - **보관용 테이블 스키마:** 메인 테이블의 스키마 변경 시 보관용 테이블도 함께 업데이트되도록 관리하여 데이터 정합성을 유지합니다. - **저비용 저장소 활용:** 보관 테이블은 자주 조회되지 않으므로 성능이 낮은 저비용 스토리지로 분리하여 운영 비용을 절감할 수 있습니다. - **복구 메커니즘:** 실수로 삭제된 데이터를 복구해야 할 경우, 보관 테이블에서 메인 테이블로 데이터를 다시 `INSERT` 하는 것만으로 간단히 복구가 가능합니다. 데이터베이스의 규모가 커질수록 소프트 삭제는 기술 부채로 작용할 가능성이 큽니다. 데이터 보존이 필수적인 시스템이라면 처음부터 트리거 등을 활용해 삭제된 데이터를 물리적으로 분리 보관하는 설계를 고려하는 것이 장기적인 성능과 유지보수 측면에서 권장됩니다.