프로젝트를 하며 spring 프레임 워크를 이용한 스케줄링은 해봤지만 서버 또는 디비에서 하는 방법을 시도 하게 되었다.
스케쥴링하는 방법은 다양하다.
Spring 프레임워크 스케줄링: @Scheduled 어노테이션을 사용해 애플리케이션 내에서 작업을 주기적으로 실행.
Crontab 서버 스케줄링: 쉘스크립트로 작업을 작성하고 crontab으로 서버에서 자동 실행.
pg_cron 데이터베이스 스케줄링: PostgreSQL의 pg_cron 확장을 이용해 DB 내 작업을 스케줄링.
일정 주기로 오래된 데이터를 자동삭제 , 주간보고서 생성, 데이터 유지 관리 등의 작업
일정주기로 오래된 데이터 자동 삭제, 주간 보고서 생성, 데이터 유지관리 등의 작업
Spring 스케줄링은 애플리케이션 내 간단한 작업 자동화에 적합.
Crontab은 시스템 작업에 유리하고, 독립적인 서버 관리에 최적.
pg_cron은 데이터베이스 중심의 작업 스케줄링에 최적화.
특정시간에 특정작업을 해야한다.
1. 위의 특정작업에 대해 function 및 procedure 등 특정 작업에 호출할 수 있는 정의를 한다.
CREATE OR REPLACE PROCEDURE proc_del_data(IN retention_period character varying)
LANGUAGE plpgsql
AS $procedure$
begin
-- INSERT 쿼리
INSERT INTO tableA (sn, reg_dt, del_dt)
SELECTsn, reg_dt, NOW() AS del_dt
FROM tableB
WHERE reg_dt < date_trunc('day',NOW()) - (retention_period::integer * interval '1 month') - interval '1' day;
-- DELETE 쿼리
DELETE FROM tableA
WHERE reg_dt < date_trunc('day',NOW()) - (retention_period::integer * interval '1 month') - interval '1' day;
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION 'procedure error occurred: %', SQLERRM;
END;
$procedure$
;
touch /home/test/proc_del_data.sh
nano /home/test/proc_del_data.sh
crontab -e
하면 크론탭 설정된 목록들과 함께 편집할수 있다.
단축키 i 를 누르면 insert가 되어 원하는 크론탭 설정을 해주면 된다.
===== 작업리스트 구성 방식 ======
첫번째 필드 : 분 (0~59)
두번째 필드 : 시 (0~23)
세번째 필드 : 일 (0~31)
네번째 필드 : 월 (1~12)
다섯번째필드: 요일(0~7) // 0,7 = 일요일, 1 = 월요일
여섯번째필드: 실행할 명령
crontab -l // 예약된 작업리스트 출력
crontab -e // 예약된 작업 리스트 수정
crontab -r // 예약된 작업 리스트 목록 삭제