삭제 기능을 구현하면서 초기에는 예상하지 못했던 문제에 부딪혔다. 회원 탈퇴 시에 그 회원이 작성했던 리뷰 데이터도 모두 삭제해야 할까? 이 문제가 불거진건
1) delete의 사용이 위험할 수도 있다는 얘기를 듣고 프로젝트 SR 때부터 active/inactive로 탈퇴 유무를 나눠두었고
2) 데이터베이스의 users 테이블과 reviews 테이블이 다대다 관계로 연결되어 있어, 리뷰를 작성한 회원의 정보(users_id)가 reviews 테이블에도 속해있기 때문이었다.
만약 이게 실무였다면 기업의 입장에서 리뷰 데이터는 물론 회원 정보도 매우 소중한 자료일텐데, 그렇다고 무늬만 삭제를 할 수도 없고. 이제와서 데이터베이스를 수정하려니 막막하고... 고민하던 우리 팀은 헬프데스크를 통해 엔지니어분들의 조언을 구했다.
Q. 어떤 유저가 탈퇴시 users 테이블에서 삭제를 하고, 그 유저가 작성한 리뷰 데이터들도 reviews 테이블에서 delete를 하는 것이 적절한가요?
delete를 사용하는 것이 권장되지 않는다고 들은 것 같기도 하고, 리뷰 데이터까지 모두 삭제하는건 별로 좋은 방법이 아니라고 생각되기 때문에 사용이 꺼려집니다. 실무에서는 회원 탈퇴 처리시 delete를 사용하나요 아니면 active/inactive 로 탈퇴 유무를 나눠주게 되나요? 아니면 더 좋은 방법이 있나요?
A. 두 질문의 답은 서비스에 따라 선택하시면 됩니다.
MySQL은 외래키를 선언할때 외래키의 업데이트 / 삭제에 대해 행동양식을 지정할수 있습니다.
구글에 on cascade, on restrict, on set null 명령어를 검색해 보세요.
delete로 데이터를 바로 삭제하는 hard delete 방법, inactive로 표시하는 soft delete 방법 전부 장단점이 있습니다. 역시 서비스에 따라 이를 선택하시면 될듯합니다.
delete로 바로 계정정보를 삭제한다면, 이제 쿼리를 진행할때 탈퇴한 유저를 신경 쓰지 않으셔도 됩니다.
하지만, 만약 해당 유저의 데이터가 필요한 경우라면 어떻게 해야 할까요? 다시 이 유저를 불러와서 회원가입을 시키고, 필요한 데이터를 취득한 다음 다시 탈퇴를 해야 할까요?
그러면 만약 유저를 inactive 표시를 하는건 어떤가요?
위에서 탈퇴한 유저의 데이터가 필요한 경우 바로 가져다 쓸수 있습니다. 하지만 이 경우 쿼리문에서 이 유저의 데이터가 나타나지 않게끔 쿼리문을 작성해야 합니다.
또한 데이터가 유지됨으로, 데이터베이스 용량 차이가 발생하게 됩니다.
그리고 이런 soft delete는 개인정보 보호법을 준수해야합니다. 가끔 메일로 계정정보가 삭제된다는 메일을 받으신적 있으실겁니다. 그런 회사들이 soft delete 방법을 사용하는 경우 입니다.
이미 구현완료 된 hard delete 방법을 쓰면 알려주신 대로 on cascade, on restrict, on set null 명령어를 통해 외래키를 선언할때 외래키의 업데이트 / 삭제에 대해 행동양식을 지정해 줘야 할 것 같습니다.
그러면 active column을 어떻게 할지(살려둘지, 아니면 삭제할지) 에 대한 논의가 필요합니다
삭제하기로 한다면 이 논의가 있기 전 구현된 다른 API에서 find(All or On … 등){where:{active:1}} 이라는 조건이 붙은 것들이 종종 있습니다. 이 조건을 다 없애주어야 합니다.
삭제하지 않기로 한다면 Create{value;{}}에서 acitve:1 이라는 것을 (사용하지 않더라도) 적어는 주어야 합니다. 아니면 active column에 값이 null로 들어가기 때문입니다.
이에 대해 우리 팀의 의견은
1) 리뷰를 삭제하지 않는 편이 데이터 관리 차원에서 더 좋을 것이다.
2) 다만 익명의 사용자들이 사용할것을 고려하면 soft delete로 할 경우 탈퇴하더라도 리뷰가 남아있다는 것을 명시할 필요가 있다. 이때 사용자들이 거부감을 느끼진 않을까?
3) 삭제에 대한 거부감을 고려한다면, 리뷰 작성 전에 ‘작성하신 후기는 탈퇴 여부와 무관하게 삭제가 불가능하니 신중하게 작성해 주시기 바랍니다.’라고 안내창을 띄워주도록 하자.
또한 사용자 정보는 hard delete, 리뷰는 sofr delete(외래키 선언 시 on cascade, on restrict, on set null 명령어를 사용해 업데이트와 삭제에 대한 행동양식 지정->리뷰가 삭제되지 않도록 설정)로 처리한다면 리뷰가 남아있어도 문제가 없을 것이다.
로 모아졌다.
결과적으로 active 칼럼을 삭제하고 이에 따라 코드와 API를 수정하게 됐지만, 가볍게 구상했던 서비스에서 개인정보에 대한 이슈까지 고려해보게 되어 많이 배울 수 있었다.