Spring | 스프링 스케쥴러 사용하기

sally·2021년 5월 26일
3

project

목록 보기
4/5
post-thumbnail

일주일에 한번씩 자동으로 API에서 데이터를 가져와서 DB에 넣는 기능을 구현해야했다.
찾아보니 Spring에서 스케쥴러를 지원해서 정해진 스케쥴에 따라 반복하는 기능을 쉽게 구현할 수 있게 지원하고 있었다! yeah~~~!~!🤸‍♀️🤸‍♂️


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 설정하기

  1. 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분마다 실행
  • *
    모든 값

https://en.wikipedia.org/wiki/Cron#CRON_expression
자세한 설명은 여기로...👡

내가 원하는 조건만 입력하면 자동으로 크론 표현식을 만들어 주는 사이트도 있다!

http://www.cronmaker.com/


DB에 데이터를 넣는데 시간이 생각보다 오래 걸려서 스케쥴러가 실행되는 동안에 서버 점검 페이지도 띄워 봐야겠다!

profile
Believe you can, then you will✨

1개의 댓글

comment-user-thumbnail
2023년 6월 27일

'batch도 있고 quartz도 있는데 왜 scheduler?' 부분이 저도 궁금했는데 포스팅 감사합니다.

답글 달기