쉽게 쉽게

[Spring] 스케줄러 구현 본문

개발공부/Spring

[Spring] 스케줄러 구현

곱마2 2024. 6. 30. 19:41
반응형

▤ 목차

1. 스케줄러 설정

스케줄러는 일정주기마다 반복할 작업이 있을 경우에 사용하면 편리하다.

스케줄러를 구현하기 위해서는 몇 가지 설정이 필요하다.

xml에 설정을 추가해야 하는데 보통 dispatcher-servlet.xml에 추가하면 된다.

(xml 설정을 다루는 파일은 각기 다를 수 있다.)

 

1. Namespaces에서 task 추가

Namespaces 중 task를 추가해주면 된다.

추가가 성공하면 아래와 같은 설정이 추가되며 <task:> 태그를 사용할 수 있게 된다.

2. 스케줄러에 사용될 애노테이션 활성화

annotation-driven 설정 추가하여  @Schedule과 @Async 애노테이션을 활성화 시키면 된다.

단 스레드 풀의 크기나 다른 고급 설정을 제어하고 싶다면

<task:scheduler>를 추가하여 스케줄러를 명시적으로 정의해야한다.

<!-- annotation-driven으로 @Schedule@Async 애노테이션을 활성화 시키면 된다. -->
<!-- 기본 설정만으로도 충분하다면 이렇게 설정  -->
    <task:annotation-driven/>
    
<!-- 고급설정을 하고 싶다면 사용되는 스케줄러를 지정해야함   -->
<!-- 스케줄러 빈 정의 -->
    <task:scheduler id="scheduler" pool-size="10"/>
<!-- @Scheduled 어노테이션 활성화 및 스케줄러 지정 -->
    <task:annotation-driven scheduler="scheduler"/>

3. 스케줄러 component 경로 설정

@Component 어노테이션의 경우 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.

스케줄러를 Bean으로 등록하여 사용해야 하기에 필요한 설정이다.

component-scan의 경우는 이미 구현되어 있는 경우가 많아서 기존에 세팅되어 있는 경로를 활용하거나 (스케줄러를 세팅된 하위 경로에 구현) 스케줄러용 component-scan를 추가로 구현하는게 좋다.  

<context:component-scan base-package="스케줄러 클래스 경로" use-default-filters="false">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
</context:component-scan>

2. 스케줄러 구현

스케줄러를 구현하는 방법은 2가지가 있다.

  1. dispatcher-servlet.xml(설정파일)에서 <task:scheduled-tasks>를 이용해 bean을 등록하여 cron을 설정
  2. 직접 @Scheduled 어노테이션을 추가하여 cron을 설정

1. <task:scheduled-tasks> 사용

설정 파일에 미리 스케줄을 설정하는 방법이다.

<task:scheduled-tasks>
    <!-- 10초에 1번씩 -->    
    <task:scheduled ref="schedule" method="test" cron="0/10 * * * * ?"/>
</task:scheduled-tasks>

ref는 @Component, @Controller, @Service, @Repository 등 stereoType으로 등록된 빈 이름을 작성
ref에는 반드시 클래스 이름을 camelcase 명명법으로 작성해야 한다.

method는 스케줄러로 실행할 메서드명을 입력

@Component
public class Schedule {
	public void test() {
    	System.out.println("10초에 1번씩 console 찍기");
	}
}

 

2. @Scheduled 사용

@Scheduled를 사용해서 스케줄을 구현하는 방법이다.

@Component
public class Schedule {
	@Scheduled(cron="0/10 * * * * *")
	public void test() {
    	System.out.println("10초에 1번씩 console 찍기");
	}

}

3. Cron 표현식

cron 표현식

    • * : 모든 값을 의미
    • ? : 특정한 값이 없음
    • - : 범위를 뜻함
    • , : 특별한 값일 때만 동작
    • / : 시작시간 / 단위
    • L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)
    • W : 가장 가까운 평일
    • # : 몇째주의 무슨 요일을 표현

 예제

 

만약 Support for specifying both a day-of-week AND a day-of-month parameter is not implemented. 

라는 오류가 발생했다면

일자를 나타내는 4번째 필드와 요일을 나타내는 6번째 필드는 동시에 값을 지정할 수 없기때문에 나타나는 오류다.

해결을 위해서는 아래와 같이 마지막 요일 값을 ? 로 변경하면 된다. 

@Scheduled(cron="0 0 5 * * *")  → ERROR 발생
@Scheduled(cron="0 0 5 * * ?")  → 수정완료

https://wooncloud.tistory.com/75

 

[Spring] 스케줄러 Cron 사용하기

스프링 프로젝트를 개발하면서 시스템이 커지고 DB 또는 다양한 서비스를 위해 어떤 모듈들을 주기적으로 실행해야 할 때가 옵니다. 그럴 때 사용하는 것이 스케줄러입니다. 스프링에서 스케줄

wooncloud.tistory.com

https://highlighter9.tistory.com/33

 

스프링 스케쥴러 (@Scheduled) 설정 및 사용하기

일정 시간/주기마다 호출되어야하는 작업이 필요할때 스프링 스케쥴러를 사용하면 간편하게 구현할 수 있다. 스케쥴러를 사용하기 위해서는 간단한 설정이 필요하다. 설정은 어노테이션을 추

highlighter9.tistory.com

https://zamezzz.tistory.com/197

 

[Cron] 크론(cron) 표현식 정리

■ Cron (크론) cron이란? 유닉스 계열의 잡 스케줄러 ● Cron 표현식 - 필드 Cron 스케줄러의 정규 표현식입니다. 7개의 각 필드로 구성되어 있으며, 각 필드의 내용은 아래와 같습니다. 자세한 설명은

zamezzz.tistory.com

https://galid1.tistory.com/494

 

Spring - @Bean 어노테이션과 @Component 어노테이션(DI) - 2

@Component, @Bean 프로그램이 거대해 짐에 따라 XML을 이용하여 IOC Container를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@)이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데이

galid1.tistory.com

잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다.

 

 

 

반응형