All Day Tired

@Scheduler, cron표현식 사용 본문

Back/Spring

@Scheduler, cron표현식 사용

yu.dev 2024. 10. 27. 20:14

이번 프로젝트 하면서 스케줄러를 사용해야할 때가 왔다...

그래서 과장(놈)한테도 물어봤지... 스케줄러 따로 설정하는거 필요 없냐? 그냥 어노테이션만 쓰면 되냐?

근데 과장(놈) 왈 어 그냥 어노테이션만 쓰면 된다

그래서 스케줄러 돌려야하는 메소드 위에 어노테이션 @Scheduler(cron="0/40 * * * * * ") 이렇게 써줬는데 안 됨... 왜..? 과장이 하라는대로 다 해줬잖아....

근데 안 된 이유가 있다....ㅎ

 

상황

controller에서 scheduler를 돌려야하는 상황

@Scheduler 사용했지만 돌아가지 않음

 

원인

원인은 간단했다... 그냥 해당 controller 클래스에 @EnableScheduling를 써주지 않아서 문제였던 것...

 

근데 나는 이걸 처음 써봐서 좀 말도 안되는 구조로 쓴 듯 싶다...

서치도 해보고 다른사람들 써본거 보니까 다들 contorller나 service이런데에 scheduler를 박지는 않더라...ㅎ

 

@Scheduler 사용법
  • scheduler를 돌릴 class를 생성해서 해당 클래스에 @EnableScheduling를 써주고 scheduler를 사용해준다.
  • 메서드 접근자는 public으로 설정해줘야 한다.
  • return 값이 있으면 안됨. void여야 한다.
  • bean으로 등록되어야 하므로 @Component를 통해 클래스를 bean으로 등록해준다.
cron표현식

스케줄러를 사용하면서 시간을 지정해야하는데 이때 쓰이는것이 cron

cron표현식은 리눅스에도 자주 사용한다고 학원썜이 잘 기억해두라 하셨다...

  • 필드
필드 범위 특수문자
0~59 , - * /
0~59 , - * /
0~23 , - * /
1~31 , - * ? / L W
1~12 또는 JAN~DEC , - * /
요일 0~6 또는 SUN~SAT , - * ? / L #
연도 생략 또는 1970~2099 , - * /
  • 특수문자 의미
  1. * : 모든 값
  2. ? : 특정 값 없음
  3. - : 범위
  4. , : 특정 값
  5. / : 증분값
  6. L : 마지막(일과 요일 동시에 쓰지 못함, 일에 쓰이면 매월 말일, 요일에 쓰이면 매월 마지막 해당요일)
  7. W : 가장 가까운 평일
  8. # : N번 째 주 특정 요일
  • 예제

사실 지금까지 쓴 스케줄러로는 매일 이 시간에 돌아라 이것밖에 없어서 예제는 이 예제 하나만 적고 모를 때 그때그떄마다 찾아보자...

0 30 2 * * * : 매일 오전 2시 30분 0초

 

Comments