본문 바로가기
Java & Spring

@Scheduled 크론 12패턴 + 중복실행 방지

by yamoojin83 2025. 9. 30.

@Scheduled 크론 12패턴 + 중복실행 방지

간단한 배치는 @Scheduled로 충분합니다. 그러나 중복실행분산 환경을 고려하지 않으면 데이터가 꼬일 수 있습니다.

기본


@EnableScheduling
@SpringBootApplication
public class App {}

패턴 예시(발췌)


// 매일 9시
@Scheduled(cron = "0 0 9 * * *", zone = "Asia/Seoul")
public void every9am(){}

// 평일 9~18시 매 10분
@Scheduled(cron = "0 */10 9-18 * * MON-FRI", zone = "Asia/Seoul")
public void bizHours(){}

// 매분 0~30초마다(테스트)
@Scheduled(cron = "*/5 0-30 * * * *")
public void test(){}

중복 방지(단일 인스턴스)


private final AtomicBoolean running = new AtomicBoolean(false);

@Scheduled(cron = "0 */5 * * * *")
public void job() {
  if (!running.compareAndSet(false, true)) return;
  try {
    // 작업...
  } finally {
    running.set(false);
  }
}

분산 환경 중복 방지(ShedLock)


<dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-spring</artifactId>
  <version>5.10.0</version>
</dependency>

@EnableSchedulerLock(defaultLockAtMostFor = "5m")
@Scheduled(cron = "0 */5 * * * *")
@SchedulerLock(name = "myJob")
public void job(){}

운영 팁

  • 타임존을 명시(zone="Asia/Seoul")
  • 지연/실행시간을 고려하여 lockAtLeastFor 조정
  • 장시간 작업은 배치 프레임워크(Spring Batch)를 검토

FAQ

Q1. fixedRate vs fixedDelay?
A. fixedRate는 시작 간격 기준, fixedDelay는 종료 후 대기.

Q2. 예외가 나면?
A. 예외를 삼키지 말고 로깅/알림 후 정상 종료되게 하세요(다음 실행에 영향).

 

 

👉 1편: Bean Validation(@Valid)로 입력 검증 표준 만들기

👉 2편: @ControllerAdvice 글로벌 예외 응답(에러코드 규격)

👉 3편: application-{profile}.yml 전략 + 비밀키 분리

👉 4편: Spring Boot Actuator: /health 커스터마이징

👉 5편: @Scheduled 크론 12패턴 + 중복실행 방지

👉 6편: 멀티파트 업로드: 제한/보안/임시저장 설계

👉 7편: Spring Cache로 API 3배 빠르게(@Cacheable/무효화)

👉 8편: Pageable 응답 DTO 규격(정렬·페이지 표준화)