myslq 데이터 자동삭제 과정

송민지·2022년 7월 24일
0

실전프로젝트

목록 보기
10/20

지난 수요일 드디어 기능구현이 끝났다.
프론트 담당하신 운철님과 드디어 끝났다고 기뻐하고 있었는데

뚜뚱-!

운철님이 일정 시간이 지나면 지나간 예약은 삭제해달라고 요청해주셨다.

그래서 처음에 생각했던것이 node-cron을 이용한 스케쥴러 작성이였다.
같은 조원인 선우님이 이미 스케쥴러를 작성하셨기 때문에 설명을 듣고 스케쥴러의 작동 순서를 손으로 쓰기 시작했다.

(손으로 쓴 로직 구성)
(지금봐도 대책없이 일을 크게 벌렸다는 생각이 든다)

요약하면

  1. 매일 자정 0시 0분에 bookings에서 모든 저장내역을 불러온다.
  2. 만일 오늘날짜와 예약날짜가 같으면, redis에 캐싱하고,
    2-1. mysql 저장내역은 삭제한다.
  3. 오늘 저장내역은 캐싱한 redis 에서 보여준다.
  4. 화상채팅이 종료되고 일정시간이 지나면, redis에 캐싱된 데이터를 삭제한다.

그런데 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

profile
기록하는 일상

0개의 댓글