728x90
스프링 부트 프로젝트 실행하자마자 batch job이 실행되는 이슈
매일 새벽 1시에 외부 API와 통신하면서 DB 데이터를 업데이트하는 쿼츠 스케줄러를 만들었다. 그런데 코드가 잘 돌아가는지 테스트하기 위해 로컬 환경에서 프로젝트를 실행하면 프로젝트가 실행되자마자 batch job이 실행되는 이슈가 있었다.
1. 기존 코드
나는 Java의 쿼츠 스케줄러를 사용해 매일 새벽 1시에 외부 API를 호출해 DB 데이터를 갱신하는 배치 작업을 만들었다.
그런데 코드를 테스트하기 위해 프로젝트를 새로 실행할 때마다 배치 작업이 시작돼 모든 step을 진행하는 이슈가 생겼다.
개발 단계에서는 프로젝트가 시작될 때마다 배치 작업이 실행돼도 큰 문제는 없지만, 실제 운영 환경에서는 이런 방식이 문제를 일으킬 수 있다. CI/CD를 도입해 자동으로 프로젝트를 재배포하게 되면, 매번 작업이 불필요하게 실행되어 리소스 낭비가 발생할 수 있다.
@Slf4j
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean citationUpdateJobDetail() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(CitationUpdateJob.class);
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
// 매일 새벽 1시에 외부 api 요청하는 로직 실행
@Bean
public CronTriggerFactoryBean citationUpdateTrigger(JobDetail citationUpdateJobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(citationUpdateJobDetail);
trigger.setCronExpression("0 0 1 * * ?"); // Cron 표현식
return trigger;
}
}
2. 문제 원인
- 스프링 부트에서 배치 작업이 자동으로 실행되는 현상은 스프링 부트의 기본 설정 때문이다. 스프링 부트는 spring.batch.job.enabled 속성의 기본값을 true로 설정하고 있어, 이 속성을 명시적으로 false로 설정하지 않으면 애플리케이션 시작 시 모든 스프링 배치 작업이 자동으로 실행된다.
- 이 설정은 스프링 부트의 "약속된 설정보다 관례" 원칙을 따르는 것으로, 개발자가 별도로 설정하지 않아도 스프링 부트가 합리적인 기본값을 제공하기 때문이다.
- 한편, 쿼츠 스케줄러는 스프링 배치와는 별개로 동작하는 스케줄링 라이브러리다. 즉, 쿼츠 스케줄러로 새벽 1시에만 실행되도록 설정했다 하더라도, 이는 쿼츠 스케줄러에 적용된 설정이며 스프링 배치의 자동 실행 설정과는 별개다. 스프링 배치 작업이 쿼츠 스케줄러에 의해 실행되도록 하고 싶다면, 스프링 배치의 자동 실행을 비활성화하고 쿼츠 스케줄러를 통해서만 작업이 실행되도록 설정해야 한다.
- 이렇게 설정을 통합하면, 스프링 부트 애플리케이션을 재배포할 때마다 불필요하게 리소스를 낭비하는 것을 방지하고, 오직 새벽 1시에만 배치 작업이 실행되도록 할 수 있다.
3. 문제 해결
application.yml 파일에서 spring.batch.job.enabled: false 추가
spring.batch.job.enabled=false
[Spring Boot] RequestDTO로 요청받을때 @RequestBody를 작성하는 경우와 작성하지 않는 경우
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring Boot 3.X 버전에 Swagger 3 버전 적용하기 (1) | 2023.11.10 |
---|---|
[Spring Boot] Spring Boot에서 Feign 클라이언트 사용하기(@FeignClient 사용 가이드) (2) | 2023.11.09 |
[Spring Boot] Spring Batch 코드 작성 후 실행 시 Table doesn't exist 에러 해결 (0) | 2023.11.07 |
[Spring Boot] 의존성 버전문제로 인한 오류 해결 (1) | 2023.11.07 |
[Spring Boot] RequestDTO로 요청받을때 @RequestBody를 작성하는 경우와 작성하지 않는 경우 (1) | 2023.11.07 |