일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- java
- 입출력
- 혼공얄코
- SQL Mapper
- spring security 설정
- spring security
- 자바의정석
- 프로그래머스 붕대 감기
- 쿠키
- 붕대 감기
- 오버로딩
- 자바의 정석
- contiune
- 객체지향
- over()
- 오블완
- 다형성
- CPU
- hackerrank
- 오버라이딩
- 멀티태스킹
- 캡슐화
- 중첩 break
- 멀티프로세싱
- break 사용법
- continue 사용법
- 리눅스
- 티스토리챌린지
- 프로그래머스
- 붕대 감기 자바
- Today
- Total
쉽게 쉽게
[Spring] 스케줄러 구현 본문
▤ 목차
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가지가 있다.
- dispatcher-servlet.xml(설정파일)에서 <task:scheduled-tasks>를 이용해 bean을 등록하여 cron을 설정
- 직접 @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 표현식
- * : 모든 값을 의미
- ? : 특정한 값이 없음
- - : 범위를 뜻함
- , : 특별한 값일 때만 동작
- / : 시작시간 / 단위
- 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
https://highlighter9.tistory.com/33
https://zamezzz.tistory.com/197
https://galid1.tistory.com/494
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |
'개발공부 > Spring' 카테고리의 다른 글
[Spring] Spring Security 구현 (1) - 설정 (1) | 2024.10.31 |
---|---|
[Spring] tiles 적용 (5) | 2024.09.05 |
[Spring] static 변수에 autowired 설정 방법 (0) | 2024.07.29 |
[Spring] 게시글 조회수 중복방지 (1) | 2024.05.30 |
spring tiles 사용법 (0) | 2023.06.25 |