스케쥴러(Scheduler)에 대하여

단비·2023년 4월 21일
0

학습

목록 보기
12/66

스케쥴러란?

  • 일정 시간마다 코드를 실행시킬 수 있음
  • 스레드(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를 보장할 수 있음
  • 다음 스케줄러가 이전 스케줄러의 작업이 끝날때 까지 기다리지 않고 자신의 작업을 처리

Scheduled의 시간 표기 방법

  • fixedRate
    작업의 시작부터 카운트(단위 ms)
  • fixedDelay
    작업이 끝난 시점부터 카운트(단위 ms)
  • cron
    초, 분, 시, 일, 월, 주, (년) 을 지정해 스케줄러를 동작(년은 제외 가능)

cron에 대하여

1. cron 표현식

순서 필드명표현 가능한 값
1seconds0~59 , - * /
2minutes0~59 , - * / 
3hours0~23 , - * /
4day of month1~31 , - * ? / L W
5month1~12 or JAN-DEC , - * /
6day of week1-7 or SUN-SAT , - * ? / L #
7years (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번째 주 수요일에 동작

💡 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 등록을 해주는 어노테이션

profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글