Spring Boot에 Scheduler 적용하기

이혜지·2023년 4월 27일
0
post-custom-banner

개요

잘자라 프로젝트에서 유저 타입은 두가지로 부모님, 아이로 되어있다.

아이는 매일 밤 열두시에 그날 수행하는 미션을 할당받는데, 이를 위해 Spring Boot에서 스케줄링 기능을 사용해야했다.

userRepository.findAllByUserType(UserType.CHILD) 으로 CHILD인 모든 아이들을 가져오고, 아이들의 MissionToday를 갱신, 생성, 삭제 3가지중 하나를 진행한다.

구현

@Scheduled 애노테이션을 쓰면 간단하게 된다.

추가해야할 것

JaljaraApplication.class

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling //스케즐링 하려면 이 애노테이션이 필요하다.
public class JaljaraApplication {

   public static void main(String[]args) {
      SpringApplication.run(JaljaraApplication.class,args);
   }

}

실제로 스케줄러 돌릴 메소드

@Transactional
	@Scheduled(cron = "00 00 00 * * *", zone = "Asia/Seoul")
	public void addMissionTodayChildren() {
		List<User> allByUserType = userRepository.findAllByUserType(UserType.CHILD);
		for (User user : allByUserType) {
			addMissionToday(user.getId());
		}
	}

cron 표현식 정리

  1. 가장 앞에 오는 단위는 초(Seconds)이다.

  2. 두번째는 분(Minutes)을 나타낸다.

  3. 세번째는 시(Hours)를 나타낸다.

  4. 네번째는 일(Day-of-Month, DOM)을 나타낸다.

  5. 다섯번째로 월(Month)에 대한 정보를 기술한다.

  6. 여섯번째는 요일(Day of Week)을 나타낸다. 요일은 0~6의 숫자로 쓸 수도 있지만 "MON", "SUN"과 같이 요일의 약자로 사용할 수도 있다.

  7. 마지막으로 일곱번째에는 연도(Year)가 온다. 연도는 optional이다.

  • 와일드카드(*) 문자는 '매 번'을 의미한다.
  • 물음표(?) 는 '설정값 없음'을 나타낸다. 이는 일(DOM)과 요일(DOW)에만 사용할 수 있다.
  • 슬래쉬(/) 는 값 증가 표현에 사용된다. 분(Minutes) 항목에 "10/15" 라고 쓴다면, "10분부터 시작해서 매 15분마다" 를 의미한다.
  • 샾(#)은 k#N으로 사용되며, 이 달의 N번째 K요일을 의미한다. 요일(DOW) 항목에 "5#2" 라고 적는다면, "이 달의 두번째 목요일"을 뜻한다.
  • 문자 "L" 은 마지막(Last)를 의미한다. L은 일(DOM)과 요일(DOW)에만 사용할 수 있다. 예를 들어 일(DOM)항목에 L이 사용된다면 단순하게 해당 월의 마지막 날을 의미한다. 조금 다른 방법으로도 사용되는데, 특정 값 뒤에 사용된다면 "이 달의 마지막 날"을 의미하게 된다. 예를들어 요일에 "6L"을 준다면, "이 달의 마지막 금요일" 을 의미하게 된다.
  • 문자 "W"는 해당 날로부터 가장 가까운 평일(Weekday)을 의미한다. 예를 들어 일(DOM) 항목에 "10W"라고 준다면, "이 달의 10째 날로부터 가장 가까운 평일"을 의미한다.
  • 각각의 단위는 범위나 목록으로 나타낼 수도 있다. 일(DOM)에 "1-15"라고 적는다면 1일부터 15일까지를 뜻한다.
  • 각각의 항목은 항목에 유효한 값만이 들어올 수 있다. 예를 들어 일은 1 ~ 31 사이의 숫자만 허용되고, 시간은 0~23 사이의 시간만 허용한다.
profile
공유 문화를 지향하는 개발자입니다.
post-custom-banner

0개의 댓글