batch도 있고 quartz도 있는데 왜 scheduler?
서버에서 일괄처리를 하기 위해서 spring에서 3가지 방법을 제공하는데 batch, queart, scheduler가 있다. 이들의 차이점은
1)batch : 여러 job을 순차적으로 처리
2)quartz scheduler : 특정 job을 특정 시간에 처리
하기 위해서 사용된다고 한다.
나는 특정 시간에 특정 job(API에서 데이터를 가져오는)만 처리하면 되기 때문에 batch는 해당사항이 없고, quartz랑 scheduler중에 뭘 사용할지 고민했다.
찾아보니 quartz는 scheduler보다 구현하기 복잡했고, 스케쥴링의 세밀한 제어가 필요하거나 클러스터링이 필요할때 사용하면 좋을거 같았다. 나는 단순한 scheduling이 필요했기 때문에 scheduler를 사용하기로 결정했다. 땅땅!🔨
spring scheduler 설정하기
- root-context.xml 설정하기
scheduler를 사용할때 추가적인 의존성이 필요하지 않다. 어노테이션을 이용해서 사용하면 된다. 그럼 어노테이션을 사용하기 위한 xml 설정을 해보자!
1) bean에 필요한 xmlns와 스키마 추가하기
<?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"/>
scheduler 실행하기
스케쥴러를 사용하기 위한 준비가 모두 끝났다. 바로 클래스 파일에 컴포넌트를 달아주면 스케쥴러를 사용할 수 있다.
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 | * , - |
- Comma(,)
목록의 항목을 구분
ex) MON, WED, FRI => 월요일, 수요일, 금요일 - Dash(-)
범위를 정의
ex) 2000–2010 => 2000 년에서 2010 년 사이의 매년 - L
'L'은 'Last' 즉 마지막을 지정
ex) 요일 필드에 5L => 해당 월의 마지막 금요일 - W
일 필드에서 허용. 주어진 요일에 가장 가까운 평일(월-금)을 지정
ex) 15W => 15일이 토요일이라면 금요일날 실행 - #
요일 필드에서 허용. 뒤에 1-5사이의 숫자가 와야함
ex) 5 # 3 => 매월 세번째 금요일 - ?
특정 값이 없다 - /
빈도 지정
ex) * / 5 => 5분마다 실행 - *
모든 값
728x90
'Study > 개발일지' 카테고리의 다른 글
[백엔드TIL] 도커와 도커 컴포즈 활용 (0) | 2023.09.21 |
---|---|
[백엔드TIL] AWS 서비스의 활용경험(81일차) (0) | 2023.09.20 |
[백엔드TIL] Array, LinkedList에 대해 설명(79일차) (0) | 2023.09.18 |
[백엔드TIL] Spring security 로그인 실패 시 예외처리 방식(78일차) (0) | 2023.09.18 |
[백엔드WIL] DB캐싱 (16주차) (0) | 2023.09.15 |