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;