@Schedule은 Spring Framework에서 제공하는 애노테이션으로, 정기적으로 특정 작업을 실행하는 데 사용됩니다. 주로 백그라운드 작업이나 일정 작업(예: 데이터 정리, 이메일 전송, 로그 정리)을 자동화하기 위해 사용됩니다.
1. @Scheduled 애노테이션이란?
- 정의: 스프링에서 메서드를 스케줄링 작업으로 등록하고, 지정된 주기에 따라 실행되도록 설정하는 애노테이션.
- 주요 특징:
- 특정 시간 간격이나 일정에 따라 자동으로 메서드를 실행.
- 작업이 비동기적으로 실행되도록 설정 가능.
- 다양한 표현식(고정 시간, 크론 표현식 등)을 지원.
2. @Scheduled의 주요 속성
@Scheduled에서 사용할 수 있는 속성은 크게 세 가지로 나뉩니다:
1. fixedRate
- 설명: 메서드 실행 간격을 밀리초 단위로 설정. 이전 작업이 끝나기를 기다리지 않고 고정된 간격으로 실행.
- 형식: @Scheduled(fixedRate = 밀리초)
- 예제:
@Scheduled(fixedRate = 5000) // 5초마다 실행
public void fixedRateTask() {
System.out.println("5초 간격으로 실행");
}
2. fixedDelay
- 설명: 이전 작업이 끝난 후 지연 시간을 두고 다음 작업을 실행.
- 형식: @Scheduled(fixedDelay = 밀리초)
- 예제:
@Scheduled(fixedDelay = 3000) // 작업 완료 후 3초 지연 후 실행
public void fixedDelayTask() {
System.out.println("3초 지연 후 실행");
}
3. cron
- 설명: 크론 표현식을 사용하여 일정을 상세히 설정.
- 크론 표현식은 초, 분, 시, 일, 월, 요일을 조합하여 원하는 스케줄을 정함.
- 형식: @Scheduled(cron = "크론 표현식")
- 예제:
@Scheduled(cron = "0 0/1 * * * ?") // 매 1분마다 실행
public void cronTask() {
System.out.println("매 1분마다 실행");
}
- 크론 표현식 구조: 초 분 시 일 월 요일 [년도(선택)]
- 예: 0 0 12 * * ? → 매일 12시에 실행.
3. @Scheduled 애노테이션 설정 방법
1. 스케줄러 활성화
- @Scheduled를 사용하려면 스프링 애플리케이션에서 스케줄러를 활성화해야 함.
- 활성화 방법:
@Configuration
@EnableScheduling // 스케줄링 활성화
public class SchedulerConfig {
}
2. 메서드에 @Scheduled 추가
- 스케줄링 작업으로 실행할 메서드에 @Scheduled 애노테이션을 추가.
@Scheduled(fixedRate = 5000)
public void scheduledTask() {
System.out.println("작업 실행: " + LocalDateTime.now());
}
3. 비동기 스케줄링 (선택 사항)
- 스케줄링 작업이 오래 걸리는 경우, 비동기적으로 실행해야 다른 작업에 영향을 주지 않음.
- 비동기 설정 방법:
1. @EnableAsync 활성화:
@Configuration
@EnableAsync
public class AsyncConfig {
}
2. 메서드에 @Async 추가:
@Scheduled(fixedRate = 10000)
@Async
public void asyncScheduledTask() {
System.out.println("비동기 작업 실행");
}
4. Cron 표현식의 예시
표현식 | 설명 |
0 0 12 * * ? | 매일 12시 정각에 실행 |
0 15 10 * * ? | 매일 10시 15분에 실행 |
0 0/5 * * * ? | 매 5분마다 실행 |
0 0 12 1 * ? | 매월 1일 12시에 실행 |
0 0 12 ? * MON-FRI | 매주 월~금 12시에 실행 |
0 0 12 1 1 ? | 매년 1월 1일 12시에 실행 |
5. 사용 시 주의사항
1. 동시 실행 문제
- 기본적으로 같은 작업이 동시에 실행되지 않음.
- 만약 동시 실행을 허용하려면 별도로 비동기 설정을 해야 함.
2. 시간 단위
- fixedRate와 fixedDelay는 밀리초 단위로 설정해야 함.
3. 비동기 작업 성능
- 스케줄링 작업이 무거운 경우 비동기 설정(@Async)과 작업 분산(멀티 스레드) 사용을 고려.
4. 트랜잭션 관리
- @Scheduled 메서드는 기본적으로 트랜잭션 범위 밖에서 실행되므로, 트랜잭션이 필요한 경우 추가 설정이 필요.
요약
- @Scheduled는 정기 작업을 자동화하는 데 사용되며, fixedRate, fixedDelay, cron을 통해 다양한 주기와 일정을 설정할 수 있음.
- 스케줄러 활성화와 필요에 따른 비동기 작업 설정이 중요.
- 크론 표현식을 사용하면 복잡한 일정도 유연하게 정의 가능.
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] @Slf4j (1) | 2025.02.09 |
---|---|
[Spring Boot] QueryDSL (1) | 2025.02.07 |
[Spring Boot] SpringDoc (0) | 2025.01.28 |
[Spring Boot] SpringSecurity UserDetails, User (0) | 2025.01.24 |
[Spring Boot] OSIV (0) | 2025.01.23 |