오라클의 Job Schedule과 동일하게 MariaDB에서도 Procedure가 있다면 별도의 언어를 사용하여 배치 프로그램을 생성하지 않고 MariaDB 이벤트 스케줄러를 사용하여 배치 처리를 할 수 있습니다.

 

Procedure를 사용해야 하기 때문에 JDBC 방식처럼 복잡한 작업이 동반되는 업무에는 적합하지 않고 단순히 DB들을 이용하여 작업하는 경우에는 작업 속도가 빠릅니다.

 

먼저 Event Scheduler를 사용하려면 DB에 기능이 활성화 되어있는지 쿼리를 이용하여 확인을 해야합니다.

 

SHOW VARIABLES WHERE VARIABLE_NAME = 'event_scheduler';

 

 

 

만약 위에 보이는 것처럼 OFF 상태라면 다음 쿼리로 활성화시켜줍니다.

 

SET GLOBAL event_scheduler = ON;

 

다시 한번 쿼리가 잘 적용되어 활성화 되었는지 확인합니다.

 

SHOW VARIABLES WHERE VARIABLE_NAME = 'event_scheduler';

 

 

 

이상 없이 적용 되었네요.

 

이제 DBEvent를 생성합니다.

쿼리는 아래와 같이 CREATE 명령을 사용하며 마지막에 실행되어야 하는 Procedure를 호출합니다.

 

CREATE EVENT EV_STATISTIC
    ON SCHEDULE every 1 MINUTE
    STARTS '2023-11-01 00:05:00'
    COMMENT '매분 1 이벤트가 실행된다.'
    DO
      call SP_STATISTICS(null);

 

테스트를 위해 1분에 한번씩 작동하도록 하였는데(every 1 MINUTE)

반복 주기는 아래와 같이 다양하게 선택해서 설정이 가능 합니다.

 

{YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

 

여기서 하나를 선택해서 반복 주기를 설정할 수 있습다.

 

이벤트 생성이 잘 되었는지 아래 명령을 이용하여 확인해봅니다.

 

SHOW EVENTS;

 

 

 

이벤트가 잘 생성 되었습니다.

 

만약 이벤트를 삭제하려면 Table 삭제와 비슷한 명령어를 사용합니다.

 

DROP EVENT EV_STATISTIC;

 

DB Tool을 이용하여 Event를 찾아보면 아래처럼 확인이 가능 합니다.

저는 DBeaver 사용중 입니다.

 

 

 

Interval Field 부분을 DAY로 변경하고 Comment를 수정하면 매일 1회 작동하는 배치로 변경이 가능 합니다.

 

- copy coding -


예전에 Quartz를 이용해서 작업할 때 보다는 @Scheduled annotation을 사용하면 배치 작업을 무척 쉽게 만들 수 있습니다.


spring boot Scheduler @Scheduled batch


얼마나 간단하고 쉬운지 한번 만들어 보겠습니다.


spring boot Scheduler @Scheduled batch


먼저 프로젝트를 하나 생성 합니다.


spring boot Scheduler @Scheduled batch


프로젝트 이름을 대충 적어주고


spring boot Scheduler @Scheduled batch


 

화면을 만들건 아니지만 일단 Web을 추가해서 생성 합니다.

 

이제 설정을 해줍니다.


Application 메인 파일을 열고

package com.copycoding.batch;

 

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.scheduling.annotation.EnableScheduling;

 

@SpringBootApplication

@EnableScheduling

public class BatchApplication {

 

        public static void main(String[] args) {

               SpringApplication.run(BatchApplication.class, args);

        }

}

 

@EnableScheduling 어노테이션을 추가해 줍니다.

 

그리고 실제 스케쥴 작업할 class 파일을 만듭니다.

 

package com.copycoding.batch;

 

import java.time.LocalDateTime;

 

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

 

@Component

public class ScheduleTask {

 

@Scheduled(fixedDelay = 2000)

public void task1() {

        System.out.println("The current date (1) : " + LocalDateTime.now());

}

       

@Scheduled(fixedDelayString = "${spring.task.fixedDelay}")

public void task2() {

        System.out.println("The current date (2) : " + LocalDateTime.now());

}}

 

중요한건 class 파일에 @Component를 설정해야 합니다이렇게 두개의 어노테이션을 적어주기만 하면 설정은 끝입니다.

이제 메소드를 만들고 @Scheduled를 이용해서 메소드의 작동 시간을 입력하고 코딩을 해줍니다위에 있는 프로그램을 실행하면


spring boot Scheduler @Scheduled batch


 

이런식으로 결과를 얻을 수 있습니다.  annotation만으로 쉽게 배치 작업이 완료 됩니다.

 

@Scheduled() 어노테이션에 들어가는 설정들을 정리해 보았습니다.

 

fixedDelay

@Scheduled(fixedDelay = 1000)

이전 작업이 종료된 후 설정시간(밀리터리세컨드) 이후에 다시 시작

fixedDelayString

@Scheduled(fixedDelay = “1000”)

fixedDelay와 동일 하고 지연시간(the delay in milliseconds)을 문자로 입력

fixedRate

@Scheduled(fixedRate = 1000)

설정된 시간마다 시작을 한다. 즉 이전 작업이 종료되지 않아도 시작.

fixedRateString

@Scheduled(fixedRateString = “1000”)

fixedRate와 동일 하고 지연시간(the delay in milliseconds)을 문자로 입력

initialDelay

@Scheduled(fixedRate = 5000, initialDelay = 3000)

프로그램이 시작하자마자 작업하는게 아닌 시작을 설정된 시간만큼 지연하여 작동을 시작 한다.(예제는 3초 후 부터 5초 간격으로 작업)

initialDelayString

@Scheduled(fixedRate = 5000, initialDelay = “3000”)

initialDelay와 동일 하고 지연시간(the delay in milliseconds)을 문자로 입력

cron

@Scheduled(cron = "* * * * * *")

첫번째 부터 위치별 설정 값은

(0-59)

(0-59)

시간(0-23)

(1-31)

(1-12)

요일(0-7)

zone

@Scheduled(cron = "0 0 14 * * *" , zone = "Asia/Seoul")

미설정시 local 시간대를 사용한다.

oracle에서 제공하는 문서를 참조하여 입력 한다.

https://docs.oracle.com/cd/B13866_04/webconf.904/b10877/timezone.htm

 

- copy coding -


1

+ Recent posts