지난 수요일 드디어 기능구현이 끝났다.
프론트 담당하신 운철님과 드디어 끝났다고 기뻐하고 있었는데
뚜뚱-!
운철님이 일정 시간이 지나면 지나간 예약은 삭제해달라고 요청해주셨다.
그래서 처음에 생각했던것이 node-cron을 이용한 스케쥴러 작성이였다.
같은 조원인 선우님이 이미 스케쥴러를 작성하셨기 때문에 설명을 듣고 스케쥴러의 작동 순서를 손으로 쓰기 시작했다.
(손으로 쓴 로직 구성)
(지금봐도 대책없이 일을 크게 벌렸다는 생각이 든다)
요약하면
그런데 node-cron에서부터 막혀서 선우님과 같이 머리를 싸맸다.
너무 힘들어서 선우님이 자고나서 다시 작업하자 하셨고 오늘 새벽에 자기 직전 무심코 mysql 자동삭제를 구글에 검색하니 글이.. 꽤 있었다 (1차 쇼킹)
눈이 번쩍띄이면서 글을 읽어보았더니 프로젝트의 DB가 MYSQL이면 DB기반의 스케쥴러 방식을 사용할 수 있다고 한다.
show variables like 'event%';
mysql의 이벤트 스케쥴러 상태를 확인 할 수 있는 쿼리다.
만일 on이 아니면
set golbal event_scheduler = on;
으로 바꾸면 된다.
// 참고 코드
create event
if not exists 이벤트 이름
on schedule
every 1 day // 하루에 한번 실행 매일 반복
on completion not preserve
enable
comment ''
do //실행 문
end
이 예문을 기본으로 sql쿼리를 작성했다.
CREATE EVENT deleteBooking ON SCHEDULE EVERY 1 second ON COMPLETION PRESERVE ENABLE DO delete from bookings where endTime < TIME(DATE_SUB(NOW(), INTERVAL 3 MINUTE));
풀어보자면
CREATE EVENT deleteBooking on schedule : 스케쥴리스트에서 Booking을 삭제하는 이벤트를 만든다.
EVERY 1 minute ON COMPLETION PRESERVE ENABLE : 1분마다 확인하는데, 실행이 끝나더라도 스케쥴은 보존한다.
delete from bookings where endTime < TIME(DATE_SUB(NOW(), INTERVAL 3 MINUTE)) : endTime이 지금시간보다 3분 늦으면 삭제한다.
사실 노드 크론을 이용해서 스케쥴러 작성 후 redis를 쓰려했는데 이렇게 끝이 났다.
db에도 event scheduler가 있는지도 처음알게되었고 종종 요긴하게 사용가능할듯 하다.
(이제 프론트에서 원하는 양식대로 보내드리면 끝난다 )
(혹시 모르니 sql data type 맞춰놓자..)
https://dion-ko.tistory.com/86
https://www.thegeeksearch.com/how-to-create-alter-and-drop-events-in-mysql/
https://adowndude.tistory.com/3