본문 바로가기

SPRING

일정 시간이 되면 DB를 업데이트 시켜주는 스프링 스케쥴러

파이널 프로젝트로 예약사이트를 만들고 있는데, 일단 예약이랑 결제 취소는 되는데, 

예약날짜로부터 일정시간이 지났을 때

1.예약만걸어두고 결제를 안했다면 => 취소

2. 예약하고 결제까지 했다면 => 이용완료

이렇게 바꾸고 싶었다.

 

처음에는 오라클의 '잡 스케쥴러'를 써보려고 블로그 글 보면서 따라했는데... 자꾸 STATUS가 FAILED 가 떴다.

잘 몰라서 이유 찾기가 좀 힘들었다. 그래서 강사님께 여쭤보니 스프링 스케쥴러를 알려주면서 이걸로 하면 쉽게 할수 있다고 했다.

 

먼저, 제일 먼저 할 일은 계속 일정시간마다 진행할 프로시저를 만들었다.

create or replace PROCEDURE HAR_RESERVATION_DATE
IS
    ARG_RES_STATUS NUMBER;
BEGIN
 
    FOR i IN (SELECT RES_STATUS FROM HAR_RESERVATION ) LOOP
    
    ARG_RES_STATUS := i.res_status;   -- for문으로 나온 res_status를 변수에 집어넣는다.
    
    IF ARG_RES_STATUS = 0 THEN --status가 0(예약취소)고 오늘 날짜보다 느리면 3(예약취소)
         UPDATE HAR_RESERVATION SET RES_STATUS = 3 WHERE RES_DATE < SYSDATE AND ARG_RES_STATUS = 0;
    ELSIF ARG_RES_STATUS = 1 THEN --status가 1(결제완료)고 오늘 날짜보다 느리면 2(이용완료)
     UPDATE HAR_RESERVATION SET RES_STATUS = 2 WHERE RES_DATE < SYSDATE AND ARG_RES_STATUS = 1;
    END IF; 
    
    END LOOP;
    
    COMMIT;
END;

 

두번째, servlet_context.xml의 Namespaces에서 task를 체크하고 아래와 같은 태그를 추가해준다.

<task:annotation-driven/>

세번째, 해당 프로시저를 실행할 DAO와 Mapper파일을 생성한다. (예약관련 DAO와 MAPPER 밑에 추가 생성했음)

public void updateRevByScheduled(){
  try {
 	 sqlSession.update("shopPay.updateRevByScheduled");
  } catch(Exception e) {
	  e.printStackTrace();
  }
}
<update id="updateRevByScheduled" statementType="CALLABLE">
	<![CDATA[
		{CALL HAR_RESERVATION_DATE}
	]]>	
</update>

***mapper파일의 경우 그냥 CALL HAR_RESERVATION_DATE 만 썼을때 에러가 발생했다.

이유를 들어보니 매개변수가 없어서 얘가 계속 불러올 값이 있는줄 알고 대기타고 있고 그냥 계속 공백만 들어가서 그런거였다.....ㅎㅎ 그래서 나 끝났음!!을 나타내는 {}로 묶어주니 실행 잘됨~~~

 

네번째, DAO를 호출할 Component 생성!

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import kh.com.petbreedding.Shop.model.dao.ShopPayDao;


@Component
public class ScheduledRegistration {
	@Autowired
	private ShopPayDao shopPayDao;

	@Scheduled(cron = "0 0 0 * * *")   
	public void registration() {
		System.out.println("[ @Scheduled]registration 시작");
		shopPayDao.updateRevByScheduled();
		shopPayDao.updateRevByScheduled2();
		System.out.println("[ @Scheduled]registration 끝");
	}
}

예약테이블이 여러개면 위와같이 여러개 호출도 된당~~

** cron()을 통해서 시간을 정할 수 있다. 나는 매일 0시 0분 0초에 실행되게 만들어놨다. 

https://madplay.github.io/post/a-guide-to-cron-expression 

 

크론 표현식(Cron Expressions)

크론 스케쥴러(Cron Scheduler)에 사용하는 크론 표현식(Cron Expressions에 대해서 알아보자

madplay.github.io

 

서버를 구동시켜놓으면 Console창에서 설정해놓은 시간이 되었을 때 돌아가는 것을 확인할 수 있다.

(+++ 서버 구동안하면 실행안됨!)

'SPRING' 카테고리의 다른 글

JSTL) c:forEach item 2개일때 사용법  (0) 2021.07.02
OAUTH란  (0) 2021.06.17
No converter found for return value of type 에러 발생  (0) 2021.06.15
어노테이션 연결  (0) 2021.06.15
mapper.xml 생성하기  (0) 2021.06.10