본문 바로가기
Spring

[스프링] 스케줄러 설정 및 사용방법!!

by GoodDayDeveloper 2021. 2. 17.
반응형

안녕하세요. 오늘은 스프링 스케줄러을 통해서

특정시간에 자동으로 프로그램을 실행하는 방법에 대해 이야기해보겠습니다. 

저는 월요일부터 금요일까지 매일 새벽 5시가 되면 상태값을 0에서 7로 변경시키는 작업을 구현하려합니다.

(새벽에 어쩌구 저쩌구 한다 써놓으니 먼가 좀 섬뜩하네요.....)

 

 

 


 

 

작업순서는 XML-JAVA-SQL 순으로 진행하겠습니다.

(service, mapper는 생략하겠습니다.)

 

 

 

xml

 

 

xml을 새로 만들어줍니다.

 

 

 

저는 이부분에 context-scheduler.xml 란 녀석을 만들어 줄게요!

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
		http://www.springframework.org/schema/util
		http://www.springframework.org/schema/util/spring-util-3.1.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.1.xsd">

	<bean id="scheduler" class="com.test.scheduler.Scheduler" />
	<task:scheduler id="baseScheduler" pool-size="10" />

	<task:scheduled-tasks scheduler="baseScheduler">
		<task:scheduled ref="scheduler" method="autoUpdate" cron="0 0 5 * * MON-FRI" />
	</task:scheduled-tasks>
	
</beans>

 

빈 안에 xmlns를 선언해주고요~

 

bean에 id를 생성해주고 class에 스케줄러 파일의 위치를 넣어주면 됩니다. (경로 + 파일이름)

그리고 task:scheduler id에 바딩할 id를 작성해줍니다. (baseScheduler)

pool-size을 10으로 정의하여 스레드 풀은 10개를 유지하도록 합니다.

 

이젠 task:scheduled-tasks에 위에 언급했던 bean과 task:scheduler을 합치면 됩니다.

baseScheduler를 바인딩해주고요

주소는 bean id (scheduler) 로 설정하고 method는 JAVA에서 사용할 메소드를 지정하면 됩니다.

그리고 마지막으로 cron에서 시간을 지정하면됩니다.

저는 0 0 5 * * MON-FRI 로 설정하였는데

'월요일부터 금요일까지 매일 새벽 5시에 실행하라' 란 뜻이 됩니다.

 

 

 

 

 

 

cron의 공식예제는 대략적으로 아래와 같이 정리해 놓았습니다.

 

  • "0 0 * * * *" = the top of every hour of every day.
  • "*/10 * * * * *" = 매 10초마다 실행한다.
  • "0 0 8-10 * * *" = 매일 8, 9, 10시에 실행한다
  • "0 0 6,19 * * *" = 매일 오전 6시, 오후 7시에 실행한다.
  • "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30, 10:00 and 10:30 every day.
  • "0 0 9-17 * * MON-FRI" = 오전 9시부터 오후 5시까지 주중(월~금)에 실행한다.
  • "0 0 0 25 12 ?" = every Christmas Day at midnight
  • "0 0 0 * * *" = 매일 자정에 실행한다.
  • 0 */2 * * * * = 매일 2분마다 실행한다.

 

 

 

 

 

 

Java

 

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class, SQLException.class }, readOnly = false)
public boolean autoUpdate() throws Exception {
       
    System.out.println("스케줄링 테스트");
    
    return true;
}

 

 

xml에서 클래스와 메소드에 명시한것과 같이 Scheduler란 자바파일을 만든다음 autoupdate란 메소드를 생성합니다.

그리고 @Transactional 어노테이션을 설정해줍니다.

 

여기서 트랜잭션이란 데이터베이스의 상태를 변경시키는 작업 또는 한번에 수행되어야하는 연산들을 의미합니다.

작업이 끝나면 Commit 또는 Rollback이 되어야합니다.

 

propagation.required는 트랜젝션이 있으면 실행하고 없으면 새로운 트랜잭션을 실행하는것이며

readonly는 true인 경우 DML(insert, update 등..) 실행 시 예외가 발생이 됩니다.

 

@Transactional 괄호 안에 명시되어 있는 것은 대부분 디폴트값들이고...

그 외는 특정 예외 발생시 강제 롤백해주는 rollbackfor 정도가 있겠네요.

 

리턴값은 true가 되겠습니다. 

그 안에 일정시간에 로그가 찍히는지 테스트해봅니다.

 

 

 

 

 

저는 10시 11분에 설정해놨는데 정상적으로 텍스트가 출력되는것을 볼 수 있습니다.

여기까지 하면 스케줄러가 정상적으로 작동하는 겁니다!

 

 

 

반응형

 


 

 

 

 

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class, SQLException.class }, readOnly = false)
public boolean autoUpdate() throws Exception {
    
    TestVO testVO = new TestVO();
    
    List<TestVO> list = schedulerService.autoList(testVO);
        
    Date now = new Date();
    SimpleDateFormat nowDate = new SimpleDateFormat("yyyy-MM-dd");
    
    for(TestVO vo : list) {
        if("0".equals(vo.getState())) {
            
            Date edateTest = nowDate.parse(vo.getEdate());
            int compare = edateTest.compareTo(now);
            
            if(compare < 0 ) {
                
                searchVO.setIdx(vo.getIdx());
                schedulerService.autoUpdate(searchVO);
            }
        }
    }
        
    return true;
}

 

저는 추가적으로 여기에 새벽 5시가 되면 상태값이 0에서 7로 바뀔 수 있도록 프로그램을 만들어보겠습니다.

리스트값을 for문으로 돌리면서 상태값이 0이고 종료날짜가 현재날짜보다 적으면 업데이트 시킵니다.

 

 

 

Sql

 

<select id="autoList" parameterType="TestVO"  resultType="TestVO">
    SELECT 
        *
    FROM 
        tbl_test 
</select>	

<update id="autoUpdate" parameterType="TestVO">
    <![CDATA[
    UPDATE tbl_test SET
        state	= '7'			
    and
        idx = #{idx}
    ]]> 
</update>

 

생각보다 간단한 스프링 스케줄러였습니다~~~~

 

 

 

 

반응형

댓글