Rails에서 Avo와 Discard를 활용한 소프트 삭제 구현

Implement soft-delete in Rails with Avo + Discard | by Pentest Team @greenhats.com | Medium

작성자
jeff
발행일
2025년 05월 16일

핵심 요약

  • 1 Avo의 DiscardedRecord 가상 리소스를 활용하여 Rails 애플리케이션 전반의 소프트 삭제된 항목을 통합 관리하는 방법을 설명합니다.
  • 2 Discard::Model을 포함하는 모든 로드된 모델을 동적으로 순회하며, 각 모델의 기본 스코프를 무시하고 소프트 삭제된 레코드를 조회합니다.
  • 3 소프트 삭제된 레코드의 상세 정보를 Avo 관리자 패널에서 JSON 형식으로 시각화하고, Undiscard 액션을 통해 편리하게 복원할 수 있는 기능을 제공합니다.

도입

Rails 애플리케이션에서 데이터의 영구 삭제 대신 소프트 삭제를 구현하는 것은 데이터 무결성 유지와 복구 가능성 확보를 위해 매우 중요합니다. 본 문서는 Avo 관리자 패널과 `discard` Gem을 활용하여 애플리케이션 전반에 걸쳐 소프트 삭제된 레코드를 효율적으로 관리하고 시각화하는 방법을 제시합니다. 특히, 여러 테이블에 분산된 소프트 삭제 데이터를 통합적으로 관리할 수 있는 `DiscardedRecord`라는 가상 리소스 구축에 초점을 맞춥니다.

Avo DiscardedRecord 가상 리소스 구축

Rails 애플리케이션에서 소프트 삭제된 데이터를 중앙에서 관리하기 위해 Avo의 ArrayResource를 기반으로 하는 DiscardedRecord 가상 리소스를 생성합니다. 이 리소스는 특정 ActiveRecord 모델에 묶이지 않고, 애플리케이션 내의 모든 소프트 삭제된 레코드를 한곳에 모아 보여주는 역할을 합니다.

데이터 소스(records 메서드) 구현

DiscardedRecord 리소스의 핵심은 records 메서드입니다. 이 메서드는 다음과 같은 방식으로 소프트 삭제된 데이터를 수집합니다. * 모델 동적 로딩 및 순회: Rails.application.eager_load!를 통해 모든 모델이 로드되었는지 확인한 후, ActiveRecord::Base.descendants.each를 사용하여 Discard::Model 모듈을 포함하는 모든 모델을 순회합니다. 이는 discard Gem을 사용하여 소프트 삭제 기능이 활성화된 모든 테이블을 자동으로 찾아냅니다. * unscoped 활용: 각 모델의 default_scope에 의해 소프트 삭제된 레코드가 필터링되지 않도록 unscoped 블록 내에서 model.discarded를 호출합니다. 이를 통해 실제 삭제되지 않은 모든 레코드를 조회할 수 있습니다. * 데이터 통합 및 정렬: 조회된 각 레코드는 고유 ID, 모델 타입, 실제 레코드 객체, 삭제 시각(discarded_at)을 포함하는 해시 형태로 discarded_records 배열에 추가됩니다. 최종적으로 이 배열은 discarded_at을 기준으로 최신순으로 정렬되어 반환됩니다.

UI 필드(fields 메서드) 구성

사용자 인터페이스에서는 다음 필드들이 제공됩니다. * preview: 레코드의 미리보기를 제공합니다. * model_type: 해당 레코드가 속한 모델의 이름을 표시합니다. * record: 실제 레코드 객체에 대한 링크를 제공합니다. * object: 인덱스 뷰에서는 숨겨지고 미리보기 뷰에서만 표시되는 필드로, 레코드의 전체 JSON 표현을 pre 태그를 사용하여 가독성 높게 출력합니다. 이는 CGI.escapeHTMLJSON.pretty_generate를 사용하여 안전하고 보기 좋게 포맷됩니다. * discarded_at: 레코드가 소프트 삭제된 시각을 표시합니다.

액션(actions 메서드) 및 컨트롤

DiscardedRecord 리소스는 소프트 삭제된 레코드를 복원할 수 있는 Avo::Actions::Undiscard 액션을 제공합니다. 이 액션은 전체 리소스 수준(인덱스 컨트롤)과 개별 레코드 수준(행 수준 컨트롤) 모두에서 접근 가능하며, 사용자가 실수로 삭제했거나 복원해야 할 데이터를 쉽게 되돌릴 수 있도록 돕습니다.

결론

이 구현은 Rails 애플리케이션에서 소프트 삭제된 데이터를 중앙에서 관리하고 시각화하는 강력한 솔루션을 제공합니다. Avo의 유연한 리소스 정의와 `discard` Gem의 기능을 결합함으로써, 개발자는 복잡한 데이터 복구 로직 없이도 사용자 친화적인 관리 인터페이스를 구축할 수 있습니다. 이는 데이터 관리의 효율성을 높이고, 잠재적인 데이터 손실 위험을 줄이는 데 기여할 것입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!