스케줄러를 사용할때의 실수

Daniel·2023년 6월 23일
0

Back-End

목록 보기
19/42
  • 공식 문서 중 발췌

    예약할 메서드를 표시하는 주석입니다.
    주석이 있는 메서드에는 인수가 없어야 합니다.
    일반적으로 void 반환 유형을 갖습니다. 그렇지 않으면 스케줄러를 통해 호출될 때 반환된 값이 무시됩니다.
    @Scheduled 주석 처리는 ScheduledAnnotationBeanPostProcessor를 등록하여 수행됩니다. 이는 수동으로 수행하거나 보다 편리하게 <task:annotation-driven> XML 요소 또는 @EnableScheduling 주석을 통해 수행할 수 있습니다.
    이 주석은 반복 가능한 주석으로 사용할 수 있습니다. 이 주석은 속성 재정의로 사용자 정의 구성된 주석을 생성하기 위한 메타 주석으로 사용될 수 있습니다.

어제의 날짜를 구해 API통신을 통해 어제날짜의 데이터를 가져와 DB에 넣는 스케줄러를 하나 구현했는데
아주 바보같은 행동을 해서 기록해 보려한다.

내가 예상한 바

서버인스턴스에 올려 놓았으니 자동으로 스케줄러 돌면서 어제 날짜 구해서 데이터 가져와 DB에 넣겠지?

실제로 일어난 일

어제 날짜가 아니라 자꾸 전전날의 데이터를 가져옴

Why?

문제는 스케줄러 클래스안 어제날짜를 구하는 로직이 문제였다.

private String queryDate = LocalDate.now().minusDays(1).toString();

본인은 어제 날짜를 구해 상태에 집어넣어 사용했다...즉, 스케줄러의 영향을 전.혀 받지않았다는 뜻....

위 공식문서 발췌 부분을 보면 스케줄러는 메서드에 동작한다. 즉, 스케줄러에 설정한 시간에 해당 메서드를 실행하겠다는 말이다.
코드블럭 처럼 상태로 집어넣게 되면 해당 클래스가 생성될때의 시간에 맞춰 queryDate가 초기화되고 그 이후에는 전혀 바뀌지 않는다.

서버 인스턴스에 올라갈때 실행되어 그날의 queryDate 를 내일도...그 다음날도...사용하고 있었다...

해당 부분을 메서드화 시켜 해결했다. 자괴감이 드는 하루다

profile
응애 나 애기 개발자

0개의 댓글