DB 삭제기록 유지 (paranoia)
Preservation DB (paranoia)
사이트 운영자는 자신의 홈페이지를 운영하면서 홈페이지 내 데이터가 삭제된다면, 그것이 그냥 삭제되도록 냅두는것이 아닌 삭제된 데이터에 대해 기록이 남겨져야 할 이유가 있습니다.
나중에 게시글 내 욕설로 인해 피해자가 가해자에게 고소를 하면, 게시글을 관리하는 사이트 운영자는고소의 시발점이 되는 (삭제된) 자료를 경찰이 요구를 하면 해당 게시글의 (삭제된) 기록에 대해 보여줘야 할 의무가 있기 때문입니다.
그래서, 이번 시간에는 삭제된 데이터를 보관하는방법에 대해 알려드리고자 합니다.
1) 이번 기능은 결과를 확인해 보려면 rails_db Gem이 깔려있어야 하는 기능입니다.
[참고 : http://blog.naver.com/kbs4674/221052908122 ]
2) Controller에서 삭제를 담당하는 def 명칭이 'destroy'여야 합니다. 이 명칭이 아니면 아마 이 기능에 있어 문제가 될 수 있습니다.
Paranoia (삭제 후, 데이터 DB 보존)
- /Gemfile 에서 다음 내용을 입력합니다.
gem 'paranoia', '~> 2.2'
그리고 내용 입력 후, 다음 내용을 명령어 입력창(터미널)에 입력을 해줍니다.
bundle install
- 명령어 입력창(터미널)에 다음 명령어를 입력해줍니다.
rails g migration AddDeletedAtTo(DB 기록을 남길 게시판DB명)
저같은 경우는 게시판 관련 DB명이 posts(/db/migrate/기간_create_posts.rb)라서 다음과 같이 입력했습니다.
rails g migration AddDeletedAtToPosts
위 명령어를 치면 /db/migrate 폴더 내에 'add_deleted_at_to_posts.rb' 라는 새로운 DB 파일이 생긴게 보일겁니다.
해당 파일을 열어주고, 다음을 입력해 줍니다.
class AddDeletedAtToPosts < ActiveRecord::Migration[5.1]
def change
add_column :(모델명)s, :deleted_at, :datetime
add_index :(모델명)s, :deleted_at
end
end
만약 post에 대한 DB를 보존해야 한다면
... add_column :posts, :deleted_at, :datatime add_index :posts, :deleted_at ...
- 입력 후, 명령어 입력창에 다음 명령어를 입력해줍니다.
rake db:migrate
- /app/model/post.rb 로 이동하시고, 'acts_as_paranoid'을 추가적으로 입력해 줍니다.
class Post < ApplicationRecord
acts_as_paranoid
...
end
- rails_db Gem을 통해 DB정보를 보여주는 사이트로 가서 post에 대한 Table을 보면
Deleted at이라는 새로운 컬럼(Column)이 생겨난 것을 확인할 수 있습니다.
그리고 게시글을 삭제하면 Deleted at에 삭제된 게시물에 대한 삭제 시간 및 Table에 보존되어있는것을 보실 수 있습니다.
원래 게시글이 삭제되면, 삭제시간이 기록이 안되고, Table에서도 기록이 다 사라집니다.
게시글 외에도 카테고리, 댓글 등에도 이 Gem을 적용할 수 있습니다.
방법은 Post(게시글)과 동일합니다.
참고
개인적으로, user.rb 모델에는 Paranoia를 적용하지 않으면 좋을 것 같습니다.
일단, 적용은 되는데 A 회원이 가입 및 탈퇴를 하고, 새로운 회원가입 시 A회원이 썼던 이메일 등을 재탕하고 가입을 시도하면 과거의 기록을 갖고있다 보니 충돌(?) 문제 때문인지 회원가입이 안되고, 오류가 발생합니다.
참고