일주일에 한번씩 자동으로 API에서 데이터를 가져와서 DB에 넣는 기능을 구현해야했다.
찾아보니 Spring에서 스케쥴러를 지원해서 정해진 스케쥴에 따라 반복하는 기능을 쉽게 구현할 수 있게 지원하고 있었다! yeah~~~!~!🤸♀️🤸♂️
서버에서 일괄처리를 하기 위해서 spring에서 3가지 방법을 제공하는데 batch, queart, scheduler가 있다. 이들의 차이점은
1)batch : 여러 job을 순차적으로 처리
2)quartz scheduler : 특정 job을 특정 시간에 처리
하기 위해서 사용된다고 한다.
나는 특정 시간에 특정 job(API에서 데이터를 가져오는)만 처리하면 되기 때문에 batch는 해당사항이 없고, quartz랑 scheduler중에 뭘 사용할지 고민했다.
찾아보니 quartz는 scheduler보다 구현하기 복잡했고, 스케쥴링의 세밀한 제어가 필요하거나 클러스터링이 필요할때 사용하면 좋을거 같았다. 나는 단순한 scheduling이 필요했기 때문에 scheduler를 사용하기로 결정했다. 땅땅!🔨
<?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:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
/*스케쥴러 사용하기 위한 xmlns*/
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
/*task 스키마*/
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">
2) 스케쥴러 파일이 존재하는 패키지 설정하기
root-context.xml 밑에 아래 코드를 추가하면 된다.
base-package="스케쥴러 파일이 있는 패키지 경로를 입력하세요!"
<!-- 스케쥴러 파일이 존재하는 패키지 -->
<context:component-scan base-package="com.kokoa.acait.scheduler"/>
<!-- 크론탭 설정에 -->
<task:scheduler id="jobScheduler" pool-size="10"/>
<task:annotation-driven scheduler="jobScheduler"/>
스케쥴러를 사용하기 위한 준비가 모두 끝났다. 바로 클래스 파일에 컴포넌트를 달아주면 스케쥴러를 사용할 수 있다.
DB를 연동하고 싶다면 Autowired로 service나 mapper를 연결해주면 된다. 나는 mapper를 이용했다.
autoUpdate 메소드 안에 지난 포스팅에서 작성했던 xml파싱해서 db저장하는 코드를 넣어서 완성(코드는 너무 길어서 생략했다 😋)
package com.kokoa.acait.scheduler;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class AcadScheduler {
private static final Logger logger = LoggerFactory.getLogger(AcadScheduler.class);
@Autowired
private AcademyMapper academyMapper;
// 매주 토요일 새벽 3시에 자동으로 시작하는 스케쥴러
@Scheduled(cron = "0 0 3 * * 6")
public void autoUpdate() throws Exception {
logger.info(new Date() + "스케쥴러 실행");
}
필드 | 허용되는 값 | 허용되는 특수문자 |
---|---|---|
초 | 0-59 | * , - |
분 | 0-59 | * , - |
시 | 0-59 | * , - |
일 | 1-31 | * , - ? L W |
달 | 1-12 or JAN-DEC | * , - |
요일 | 0-6 or SUN-SAT | * , - ? L # |
년도 | 1970-2099 | * , - |
MON, WED, FRI
=> 월요일, 수요일, 금요일2000–2010
=> 2000 년에서 2010 년 사이의 매년5L
=> 해당 월의 마지막 금요일15W
=> 15일이 토요일이라면 금요일날 실행5 # 3
=> 매월 세번째 금요일* / 5
=> 5분마다 실행https://en.wikipedia.org/wiki/Cron#CRON_expression
자세한 설명은 여기로...👡
내가 원하는 조건만 입력하면 자동으로 크론 표현식을 만들어 주는 사이트도 있다!
DB에 데이터를 넣는데 시간이 생각보다 오래 걸려서 스케쥴러가 실행되는 동안에 서버 점검 페이지도 띄워 봐야겠다!
'batch도 있고 quartz도 있는데 왜 scheduler?' 부분이 저도 궁금했는데 포스팅 감사합니다.