Spring Batch 자동 실행 끄는 방법 (웹 서버와 배치 분리하기)

안녕하세요.

Spring Boot로 배치를 만들고 서버를 띄웠는데, “어? 나 시킨 적 없는데 왜 지 혼자 돌지?” 하며 당황하신 적 있으신가요?
Spring Boot Batch Starter의 기본 설정이 ‘구동 시 자동 실행’이기 때문입니다.

하지만 실무에서는 다음과 같은 이유로 자동 실행을 반드시 꺼야 할 때가 많습니다.
1. 웹 서버와 배치가 같이 있을 때: 웹 API 서버를 띄웠는데 무거운 배치가 돌면 안 되니까요.
2. 외부 스케줄러 사용: Jenkins나 Airflow에서 원하는 시간에 트리거링하고 싶을 때.
3. 테스트: 단순히 코드를 수정하고 배포만 했는데 배치가 돌아버리면 데이터 사고가 날 수 있습니다.

오늘은 이 자동 실행을 끄는 방법과, 끈 상태에서 수동으로 실행하는 방법까지 알아보겠습니다.


1. application.yml에서 끄기 (가장 간단)

가장 확실하고 쉬운 방법입니다.

spring:
  batch:
    job:
      enabled: false

이 한 줄이면 애플리케이션이 시작될 때 어떤 Job도 실행되지 않습니다. Spring Context는 정상적으로 로딩되므로, 웹 서버 기능은 그대로 사용할 수 있습니다.


2. 특정 프로파일에서만 끄기

로컬 개발(dev)에서는 켜두고, 운영(prod)에서는 끄고 싶다면? 프로파일별 설정 파일을 활용하세요.

application-dev.yml

spring:
  batch:
    job:
      enabled: true

application-prod.yml

spring:
  batch:
    job:
      enabled: false

3. 자동 실행을 껐을 때, 어떻게 실행하나요?

자동 실행을 껐으니 이제 누군가는 명시적으로 실행 버튼을 눌러줘야 합니다.

방법 1: HTTP API (Controller)

관리자용 API를 하나 파두면 편리합니다.

@RestController
@RequiredArgsConstructor
public class JobLauncherController {

    private final JobLauncher jobLauncher;
    private final JobRegistry jobRegistry;

    @GetMapping("/run/job/{jobName}")
    public String runJob(@PathVariable String jobName, @RequestParam Map<String, String> params) throws Exception {

        Job job = jobRegistry.getJob(jobName); // 이름을 쿼리로 Job 찾기
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("requestDate", LocalDateTime.now().toString())
                .addLong("time", System.currentTimeMillis()) // 중복 실행 방지용 파라미터
                .toJobParameters();

        jobLauncher.run(job, jobParameters);

        return "Job " + jobName + " started!";
    }
}

이제 브라우저나 Postman에서 GET /run/job/settlementJob을 호출하면 배치가 돕니다.

방법 2: 커맨드 라인 (CLI)

Jenkins 등에서 java -jar 명령어로 실행할 때 인자를 넘겨 실행할 수 있습니다. (별도의 Main 설정이나 CommandLineRunner 구현 필요)

java -jar my-batch-app.jar --spring.batch.job.names=myJob date=20230101

4. 결론

Spring Batch의 자동 실행 기능(spring.batch.job.enabled=true)은 개발 초기나 학습용으로는 좋지만, 운영 환경에서는 반드시 false로 설정하는 것이 안전합니다.

배치는 “내가 원할 때, 내가 원하는 파라미터로” 실행되어야 통제 가능한 시스템이 됩니다.

관련 글 보기