My Blog

스프링 스케줄러와 처리 본문

스프링부트

스프링 스케줄러와 처리

JAESG 2023. 6. 29. 15:27

프로젝트를 진행하다가 마감시간이 지난 공고글에 대해 마감을 해줘야하는 부분이 있었다.

 @Scheduled(fixedRate = 60000)
    @Transactional
    public void checkTimeDeadLine() {
        List<RecruitmentArticle> all = recruitmentRepository.findByDeadLineDateBeforeAndIsDeadLine(LocalDateTime.now(),
                false);
        for (RecruitmentArticle article : all) {
            if (LocalDateTime.now().isAfter(article.getDeadLineDate())) {
                System.out.println("article.getArticleName() = " + article.getArticleName());
                article.setDeadLine(true);
            }
        }

    }

마감이 다 찬것은 서비스단에서 해결할 수 있었는데, 마감시간을 서비스단에서 어떻게 처리할까 고민하던 찰나에 스케줄러를 사용하기로 했다.

스케줄러를 쓰려면 스프링부트를 실행하는 메인 문에

@SpringBootApplication
@EnableJpaAuditing // @EntityListeners(AuditingEntityListener.class) 가 작동하도록 허용
@EnableScheduling //스케쥴링 사용 시 추가
public class OlolApplication {

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

@EnableScheduling 어노테이션을 달아줘야 하고

Component어노테이션이 포함된 어노테이션이 달려있는 곳에서 사용할 수 있다

즉 컨트롤러, 서비스, 리파지토리에서 사용할 수 있다.

스케줄러에는 여러 옵션이 많은데 나는 그중에

fixedRate = 60000

를 사용했다. 이 코드는 1분에 한 번 실행되게 했다.

 

 

원래는 모든 게시글을 findAll해서 마감시간과 현재시간을 비교해서 지났으면 DeadLine(마감을 알려주는 변수)를 true로 바꾸려 했는데

생각보다 너무 불필요한 데이터들이 많이 뽑혀왔었다.

그래서 고민하던 찰나에

List<RecruitmentArticle> findByDeadLineDateBeforeAndIsDeadLine(LocalDateTime localDateTime, boolean DeadLine);

이렇게 값을 찾아올때 DeadLineDate가 파라미터 값보다 이전 값인 값이랑

이미 마감표시된 공고글이 아닌 것들만 뽑아오게 했다.

그랬더니 마감시간이 지난 테스트용2이 한 번 찍힐때 마감표시가 되니

그 이후 스케줄링에서는 찍히지 않는 모습을 볼 수 있었다!(메모리를 아낀거같아서 좋았다)

 

 

위에는 findAll을 한 상태이고

아래에는 findByDeadLineDateBefore를 한 후 이다.

확실히 쿼리가 줄어든 걸 볼 수 있다.

728x90
Comments