안녕하세요 졸린 개발자입니다.
오늘은 @Scheduled 어노테이션과 timezone설정에 대해 알아보겠습니다.
그렇게 현실적이지는 않지만, 뉴욕에서 서비스를 새로 런칭한다고 가정해봅시다.
그럼 기존의 스케쥴링을 하던 처리들도 뉴욕 시간으로 스케쥴링을 해야되겠죠? 그러면 어떻게 처리하면 될까요?
이렇게 zone을 지정해주면 됩니다.
하지만 아래처럼 TaskScheduler를 설정했을때에도 동작할까요?
Scheduler에는 America/New_York 타임존을 지정하고,
@Scheduled에는 아무것도 zone을 지정하지 않았습니다.
자, 이때에는 어떻게 동작해야할까요?
제 예상은 Scheduling을 실행하는 Scheduler의 시간이 뉴욕시간이기 때문에,
제가 사는 한국의 시간인 15:40이 아니라, 뉴욕시간인 01:40에 동작을 해야할꺼 같군요.
결과는 실행되었습니다.
왜 이런 결과가 나올까요?
답은,@Scheduled 어노테이션의 동작과 관련이 있습니다.
한번 @Scheduled 어노테이션이 걸린 클래스의 등록 작업을 담당하는 beanPostProcessor로 가볼까요?
보이시는 것처럼, zone은 어노테이션에 붙은 zone을 따라가고,
만약 지정하지 않았다면 Timezone.getDefault()로 system의 zone을 가져옵니다.
최종 결과입니다.
zone을 지정하지 않았기 때문에, system default인 Asia/Seoul로 지정이 된 모습입니다.
그럼, Scheduler에 지정된 timezone은 어떻게 된 걸까요?
실제 스케쥴링이 되었을때 디버거를 걸어 따라가 봅시다.
Clock자체는 잘 스케쥴러에 지정이 되어서 뉴욕시간 기준으로 돌고 있지만,
결국 Trigger, 즉 실제 스케쥴링을 하는 메소드가 등록이 되는 timezone은 Asia/Seoul이기 때문에, 스케쥴러의 zone과는 상관이 없게 됩니다.
결론
오늘도 재밌었네요.
궁금증을 푸는건 언제나 재미있고 시간가는줄도 모르겠군요.
다음에도 재미있는 포스팅으로 찾아뵙겠습니다.
'Spring > Spring' 카테고리의 다른 글
Spring @Scheduled 가 동작할때 rate나 delay보다 더 늦게 메소드가 종료되면 어떻게 동작할까? (0) | 2024.03.02 |
---|---|
Spring의 @Schduled 어노테이션으로 어느 구현체가 스케쥴링을 실행할까? (0) | 2024.02.17 |
Spring MVC에서 CORS를 설정했는데, 왜 put, delete 요청에서 CORS에러가 날까요? (0) | 2022.05.15 |