코딩마을방범대
스케쥴러(Scheduler)에 대하여 본문
728x90
스케쥴러란?
- 일정 시간마다 코드를 실행시킬 수 있음
- 스레드(sleep)을 이용하면 제대로 관리하지 못할 경우 exception이 날 수 있음
사용법
1. 메인 클래스에 어노테이션 선언
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class Task4SchedulerApplication {
2. 스케쥴링 기능을 사용할 메소드
- Scheduled, Async 어노테이션을 추가(사용할 클래스는 bean이여야함)
// 타임존은 제외 가능
@Async
@Scheduled(cron="0/60 * * * * ?", zone="Asia/Seoul")
public void test() {
System.out.println("1분마다 실행");
}
💡 Async을 사용하는 이유
- 스케줄러를 비동기적으로 실행해 PUSH를 보장할 수 있음
- 다음 스케줄러가 이전 스케줄러의 작업이 끝날때 까지 기다리지 않고 자신의 작업을 처리
※ Async의 경우 하나의 스레드만을 사용해 스레드풀이 아니므로,
따로 Config 파일을 통해 스레드풀을 이용할 수 있다.
아래 포스트 참고
https://sweet-rain-kim.tistory.com/28
Scheduled의 시간 표기 방법
- fixedRate
작업의 시작부터 카운트(단위 ms) - fixedDelay
작업이 끝난 시점부터 카운트(단위 ms) - cron
초, 분, 시, 일, 월, 주, (년) 을 지정해 스케줄러를 동작(년은 제외 가능)
cron에 대하여
1. cron 표현식
순서 필드명표현 가능한 값
1 | seconds | 0~59 , - * / |
2 | minutes | 0~59 , - * / |
3 | hours | 0~23 , - * / |
4 | day of month | 1~31 , - * ? / L W |
5 | month | 1~12 or JAN-DEC , - * / |
6 | day of week | 1-7 or SUN-SAT , - * ? / L # |
7 | years (optional) | 1970~2099 , - * / |
2. 특수문자의 의미
특수문자 의미 사용예
* | 모든 수를 의미 | seconds에서 사용하면 매초, minutes에서 사용하면 매분, hours에서 사용하면 매시간 |
? | 해당 항목을 사용하지 않음 | day of month에서 사용하면 월중 날짜를 지정하지 않음. day of week에서 사용하면 주중 요일을 지정하지 않음 |
- | 기간을 설정 | hours에서 10-12이면 10시, 11시, 12시에 동작 minutes에서 58-59이면 58분, 59분에 동작 |
, | 특정 시간을 지정 | day of week에서 2,4,6이면 월,수,금에만 동작함 |
/ | 시작시간과 반복 간격 설정 | seconds위치에 0/15로 설정하면 0초에 시작해서 15초 간격으로 동작 minutes위치에 5/10으로 설정하면 5분에 시작해서 10분 간격으로 동작 |
L | 마지막 기간에 동작 day of month, day of week에서만 사용 | day of month에서 사용하면 해당월 마지막 날에 수행 day of week에서 사용하면 토요일에 수행 |
W | 가장 가까운 평일 동작 day of month에만 사용 | 15W로 설정하면 15일이 토요일이면 가장 가까운 14일 금요일에 실행 15W로 설정하고 15일이 일요일이면 16일에 실행 15W로 설정하고 15일이 평일이면 15일에 실행 |
LW | L과 W의 조합 | 그달의 마지막 평일에 동작 |
# | 몇 번째 주와 요일 설정 day of week에 사용 | 6#3이면 3 번째 주 금요일에 동작 4#2이면 2번째 주 수요일에 동작 |
예제
0 0 12 * * ? | 아무 요일, 매월, 매일 12:00:00 |
0 15 10 ? * * | 모든 요일, 매월, 아무 날이나 10:15:00 |
0 0/5 14 * * ? | 아무 요일, 매월, 매일, 14시 매 5분마다 0초 |
0 0-5 14 * * ? | 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 |
0 10,44 14 ? 3 WED | 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 |
0 15 10 ? * MON-FRI | 월~금, 매월, 아무 날이나 10:15:00 |
0 15 10 ? * 6L 2002-2005 | 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00 |
0 15 10 ? * 6#3 | 매월 3번째 금요일 아무 날이나 10:15:00 |
0 15 10 L * ? | 아무 요일, 매월 마지막 날 10:15:00 |
💡 TIPS!
1. 강제 예외 발생 시키기
- throw
현재 메소드의 에러를 처리한 후에 상위 메소드에 에러 정보를 줌으로써 상위 메서드에서도 에러가 발생한 것을 감지 - throws
현재 메서드에서 자신을 호출한 상위 메서드로 Exception을 발생
즉, 예외를 자신이 처리하지 않고, 자신을 호출한 메소드에게 책임 전가
2. ArrayList 초기값 세팅
아래 방식은 전부 List<> 형태로 반환되므로, ArrayList로 반환 받고 싶은 경우 new ArrayList<>()로 감싸주기
- Arrays.asList()
Arrays.asList("1", "2", "3")
- List.of()
List.of("1", "2", "3")
- Double Brace Initialization({{ ... }})을 이용
new ArrayList<String>() {{
add("apple");
add("grape");
add("banana");
add("kiwi");
}};
- Stream을 이용
String[] arr = new String[] { "1", "2", "3"};
new ArrayList<>(Stream.of(arr)
3. Component란
- 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션
- @ComponentScan 을 통해 스캔됨
@ComponentScan 이란
@Component, @Service, @Repository, @Controller, @Configuration 어노테이션이 붙은 클래스 Bean 들을 찾아서 Context에 bean 등록을 해주는 어노테이션
728x90
'💡 백엔드 > Java' 카테고리의 다른 글
ModelMapper란 (0) | 2023.05.25 |
---|---|
Autowired를 지양하는 이유 & 정규표현식 (0) | 2023.05.25 |
SpringBoot에서 JSON 활용하기 (0) | 2023.05.25 |
Enum 에 대하여 (1) | 2023.05.25 |
Builder를 사용해야 하는 이유 & 포스트맨의 변수 (0) | 2023.05.25 |