Spring/Spring-detail

spring 스케줄러(Scheduler) 적용하기

YoonJong 2023. 1. 4. 01:06
728x90

스프링 스케줄러에 대해 알아보고 적용해보려고 한다.

( 개인 프로젝트에 적용해보려고 했는데, 아직 어디에 쓸지 생각이 안나서 보류중이지만, 이후 기능을 추가하거나 나중에 무조건 쓸거라 생각한다. )

 

스케줄러의 종류로는 Scheduler 말고 Quartz 라는 방식도 있다고 하는데 단순한 스케줄러 구현에서는 Scheduler 를 사용한다고 한다. 

Quartz는  조금 더 세밀하게 동작이 가능하지만 구현이 복잡하다는 단점을 가지고 있다.

먼저, 가장 기본이 되는 것부터 동작하는 것에 대해 이해하고 Quartz 는 나중에 필요할 때 추가로 공부해보려고 한다.


스케줄러는 간편하게 @Scheduled 어노테이션을 사용해서 일정한 시간 간격, 또는 특정 시간에 코드가 실행되도록 설정할 수 있도록 도와준다.

 

설정관련된 부분은 아래 블로그를 참고하면 좋을 것 같다. 

특히 Cron 설정에 대한 부분은 확인이 필요하다.

https://dev-coco.tistory.com/176

 

[Spring Boot] @Scheduled을 이용해 일정 시간 마다 코드 실행하기

@Scheduled Spring Boot에서 @Scheduled 어노테이션을 사용하면 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정할 수 있다. 주기적으로 실행해야 하는 작업이 있을 때 적용해 쉽게 사용

dev-coco.tistory.com

 


처음 설정하는 법은 간단하다. Application 에 어노테이션을 추가해준다.

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling // 스케줄러 
@EnableCaching
public class ShopApplication {

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

 

내가 테스트 한 스케줄러는 2가지이다.

1. 5초마다 반복되는 스케줄러

2. 지정한 시간에 반복되는 스케줄러

 

내 생각에는 지정한 시간에 반복되는 스케줄러를 많이 사용할거라고 생각한다. ( 데이터에 관련된 ??.. )

 

테스트를 위해 Service 에 테스트 할 2가지 서비스를 만들었다.

 

여기서, 어떤 기능을 반복하려고 설정할 때, 해당 메서드는 파라미터가 있으면 에러가 발생한다.

only no-arg methods may be annotated with @scheduled

 

@Override
public void schedulerTestDelay() {
    System.out.println("5초마다 반복 되는 스케줄러 테스트! 현재시간 : " + LocalDateTime.now());
}

@Override
public void schedulerTestCron() {
    System.out.println("지정한 시간에 반복 되는 스케줄러 테스트! 현재시간 : " + LocalDateTime.now());
}

그리고 또한 서비스를 호출하는 컨트롤러를 만들었다.

 

1번 테스트는 fixedDelay 를 통해 5초마다 실행되도록 하였으며,

2번 테스트는 매년,매월,매일,00시,46분 00초에 실행되도록 구성했다.

@Scheduled(fixedDelay = 5000)
public void schedulerDelayTest() {
    goodsService.schedulerTestDelay();
}

@Scheduled(cron = "0 46 0 * * *")
public void schedulerTestCronTest() {
    goodsService.schedulerTestCron();
}

적용이 정상적으로 되면 옆에 시계모양이 나타나는 것을 볼 수 있다.

 

이제 애플리케이션을 실행해보면 아래와 같이 확인할 수 있다.

 

728x90