@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패턴 + 중복실행 방지
'Java & Spring' 카테고리의 다른 글
| Spring Cache로 API 3배 빠르게(@Cacheable/무효화) (0) | 2025.09.30 |
|---|---|
| 멀티파트 업로드: 제한/보안/임시저장 설계 (0) | 2025.09.30 |
| Spring Boot Actuator: /health 커스터마이징 (0) | 2025.09.30 |
| application-{profile}.yml 전략 + 비밀키 분리 (0) | 2025.09.30 |
| @ControllerAdvice 글로벌 예외 응답(에러코드 규격) (0) | 2025.09.29 |