Backend

MySQL 회원탈퇴 30일 후 자동 삭제하기

DevJake 2022. 4. 29. 18:20

코딩 하다보니.. 서버에도 손대고, 말로만 듣던 MySQL 까지 손대게 되는구나..

MySQL 은 스케쥴러라는 기능이 있다. 

 

일단 처음에 스케쥴러가 on 인지 off 인지 확인부터 하고 시작한다. 

SHOW VARIABLES LIKE 'event%';

 

만약 off상태라면 on 으로 바꿔주고, 

SET GLOBAL event_scheduler = ON;

 

이건 현재 존재하는 모든 이벤트 스케쥴러 확인

select * from information_schema.events

 

MySQL내에서는 아니고, workbench로 접근해서  UPDATE 할 때, key값으로 수정하는게 아니면 에러가 발생하는 경우가 있다. 이런 경우엔, 일시적으로 safe mode 를 풀어서 UPDATE 후 다시 safe mode를 작동시킨다.  

SET SQL_SAFE_UPDATES = 0;
 
UPDATE Userinfo set usermail_idtype = 'withdraw_done', usermail_id = concat("removed_", id) where usermail_idtype = 'withdraw' and TIMESTAMPDIFF(minute, withdraw_date, now()) > 0;
 
SET SQL_SAFE_UPDATES = 1;

 

원래 삭제는 DELETE 를 반영해야 하지만, DELETE 를 반영해서 해당 계정을 완전 지워버리면, 기존에 작성한 글들에 연결된 작성자 정보에 문제가 생긴다. 

그래서, 개인정보보호법에 문제가 없도록, 회원가입시 사용자로부터 받은 usermail_id 는 삭제해버리고, 서버 내에서의 Primary Key로 사용하는 id 만 남겨놓도록 했다. (id는 uuid 로 자동 생성한 문자열)

아래와 같이 MySQL 스케쥴러에 회원 탈퇴 30일이 경과하면 삭제하는 코드를 넣는다.

하루에 한번 UTC 기준으로 23:57:07에 작동할 것이다.

CREATE EVENT del_userinfo_over30day
ON SCHEDULE EVERY 1 day
-- START '2022-04-30 23:57:07'
COMMENT '회원탈퇴 30일 초과 후 삭제'
DO
UPDATE Userinfo set usermail_idtype = 'withdraw_done', usermail_id = concat("removed_", id) where usermail_idtype = 'withdraw'
and TIMESTAMPDIFF(day, withdraw_date, now()) > 30;
 
CREATE EVENT '이벤트이름'
ON SCHEDULE EVERY 1 day  // 매일 작동, 월별, 일별, 시간별, 분 단위로도 지정 가능하다. 
Comment는 comment이고, 
DO 아래에 실행할 쿼리를 넣으면 된다. 

스케쥴러에 넣은 이벤트를 삭제할 때는, 

DROP event del_userinfo_over30day;