데이터 백업, 로그 정리, 오래된 데이터 삭제, 통계 데이터 갱신, 자동 보고서 생성, 주기적 프로시저 실행 등에 사용| 장점 | 단점 |
|---|---|
| - 애플리케이션 없이 DB 단독으로 실행 가능 |
Oracle(DBMS_SCHEDULER, DBMS_JOB)
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'DAILY_CREALUP_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DELETE FROM LOG_TABLE WHERE log_date < SYSDATE -30; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0', -- 매일 2시에 실행
enable = TRUE
);
END;
CRON 스타일의 주기 설정 가능MySQL/MariaDB(EVENT)
-- 이벤트 스케줄러 활성화 (일회성)
SET GLOBAL event_scheduler = ON;
-- 또는 my.cnf 설정(영구적)
-- event_scheduler=ON
-- 이벤트 생성
CREATE EVENT delete_old_logs
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAQL 1 MINUTE
DO
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
event_scheduler 활성화 필요EVERY 구문)PostgreSQL(pg_cron, pgAgent or OS cron)
-- pg_cron 사용
SELECT cron.schedule('0 2 * * *', $$DELETE FROM logs WHERE created_at < NOW() - INTERVAL '30 days'$$);
-- OS crontab
0 2 * * * psql -U postgres -d mydb -c "SELECT delete_old_logs();"
pg_cron = PostgreSQL 확장 모듈(DB 내부에서 CRON 표현식으로 실행)pgAgent = pgAdmin에서 제공하는 스케줄러OS의 cron + psql 명령어| DBMS | 스케줄러 기능 | 스케줄 정의 방법 | 특징 |
|---|---|---|---|
| Oracle | DBMS_SCHEDULER | PL/SQL, Repeat Interval | 강력하고 정밀함 |
| MySQL/MariaDB | EVENT | CREATE EVENT |
간단하지만 제한적 |
| PostgreSQL | pg_cron / pgAgent | 확장 설치 or OS cron | 외부 도구 필요 |
| 항목 | 스프링 스케줄러 (@Scheduled 등) | DB 스케줄러 (DBMS 내장 기능) |
|---|---|---|
| 실행 위치 | Java 애플리케이션 (서버) | DB 서버 내부 |
| 작업 범위 | 비즈니스 로직 전반 (외부 API, DB, 파일 등) | DB 내부 로직 (SQL, 프로시저 등) |
| 언어/구현 | Java 코드 | SQL / PL(SQL) 코드 |
| 장점 | ✅ 외부 연동 유리 | |
| ✅ 복잡한 로직 구현 용이 | ||
| ✅ 로깅/모니터링 도구 연동 쉬움 | ||
| ✅ Git 등 버전 관리 쉬움 | ✅ DB만 있어도 동작 (애플리케이션 필요 없음) | |
| ✅ 트랜잭션 처리에 유리 | ||
| ✅ 애플리케이션 재배포 없이 스케줄 변경 가능 | ||
| 단점 | ❌ 애플리케이션 다운 시 스케줄 정지 | |
| ❌ 클러스터 환경에서 중복 실행 이슈 존재 가능 | ❌ 복잡한 로직/외부 연동 어려움 | |
| ❌ 버전 관리/테스트 어려움 | ||
| ❌ 에러 로깅/알림 기능 미비 | ||
| 중복 방지 | 컨테이너/인스턴스 수에 따라 설정 필요 (예: Lock) | DB는 1개이므로 기본적으로 단일 실행 |