Cron 표현식이란?
Cron 표현식은 서버나 애플리케이션에서 작업을 특정 시간이나 반복 주기에 맞춰 실행하기 위해 사용하는 스케줄 표현 방식입니다. 로그 정리, 데이터베이스 백업, 이메일 발송, 배치 작업, 통계 집계, 캐시 갱신처럼 자동으로 반복해야 하는 작업을 "매일 오전 9시", "5분마다", "매주 월요일 자정"과 같은 규칙으로 지정할 수 있습니다.
Cron을 검색하면 crontab과 Spring Cron이 함께 나오는 경우가 많습니다. 둘 다 Cron 형태의 시간 규칙을 사용하지만 적용되는 환경과 필드 수가 다릅니다. Linux의 crontab은 일반적으로 분·시·일·월·요일의 5개 시간 필드를 사용하고, Spring의
@Scheduled Cron은 맨 앞에 초 필드가 추가된 6필드를 사용합니다.Linux crontab의 5필드 표현식을 Spring @Scheduled에 그대로 넣거나, Spring의 6필드 표현식을 Linux crontab에 그대로 넣으면 의도한 대로 동작하지 않을 수 있습니다. 먼저 사용 중인 환경이 Unix/Linux crontab인지 Spring인지 확인하세요.

crontab이란?
crontab은 Unix/Linux에서 cron 작업을 등록하고 관리하는 설정 방식이자 명령어 이름입니다. 흔히 "크론탭"이라고 부르며, 사용자의 crontab에는 실행 시간 규칙과 실제 실행할 명령어를 한 줄에 작성합니다. cron 서비스는 등록된 내용을 확인해 조건이 맞는 시점에 명령을 실행합니다.
예를 들어, 아래 crontab 항목은 평일 오전 9시에
/home/app/batch.sh 스크립트를 실행합니다.0 9 * * MON-FRI /home/app/batch.sh여기서
0 9 * * MON-FRI가 Cron 표현식이고, 그 뒤의 /home/app/batch.sh가 실제 실행할 명령입니다. 즉, Cron 표현식은 "언제 실행할지"를 나타내고 crontab 한 줄은 "언제 무엇을 실행할지"까지 포함한다고 이해하면 쉽습니다.Unix / Linux crontab 표현식 구조
일반적인 사용자 crontab의 시간 부분은 다음과 같이 5개 필드로 구성됩니다.
분 시 일 월 요일- 분: 0~59
- 시: 0~23
- 일: 1~31
- 월: 1~12 또는 JAN~DEC
- 요일: 0~7 또는 SUN~SAT, 일반적으로 0과 7은 일요일
사용자별 crontab에서는 보통 이 5개 시간 필드 뒤에 실행할 명령이 이어집니다. 반면
/etc/crontab이나 /etc/cron.d/처럼 시스템 수준에서 사용하는 crontab 형식은 시간 필드와 명령 사이에 실행 사용자 필드가 추가될 수 있습니다.crontab 사용법
Linux에서 crontab을 직접 사용할 때 가장 자주 사용하는 명령은 다음과 같습니다.
crontab -r은 현재 사용자의 crontab을 제거하는 명령이므로 기존 예약 작업이 필요한 환경에서는 실행 전에 crontab -l로 내용을 확인하고 백업하는 것이 안전합니다.
일반적인 등록 순서는
crontab -e로 편집기를 연 뒤 Cron 표현식과 명령을 한 줄로 작성하고 저장하는 방식입니다. 예를 들어, 매일 오전 2시에 백업 스크립트를 실행하려면 다음과 같이 작성할 수 있습니다.0 2 * * * /home/app/backup.sh실제 운영 서버에서는 스크립트의 실행 권한, 절대 경로, 환경 변수, 로그 출력 위치도 함께 확인하는 것이 좋습니다. 터미널에서 정상 실행되는 명령이 cron에서는 PATH 등 실행 환경 차이 때문에 실패하는 경우가 있기 때문입니다.
자주 쓰는 crontab 예제
Spring Cron은 왜 함께 다루나요?
Cron은 Linux의 crontab에서 널리 알려졌지만, 현재는 여러 애플리케이션 프레임워크와 스케줄러에서도 비슷한 Cron 문법을 사용합니다. Spring도 그중 하나이며, 서버의 crontab 파일을 수정하는 대신 Java 애플리케이션 코드 안에서 메서드의 실행 시간을 예약할 수 있습니다.
예를 들어, Linux 서버 자체에서 백업 스크립트를 실행한다면 crontab이 자연스럽고, Spring 애플리케이션 안에서 정산 배치, 알림 발송, 데이터 동기화 메서드를 주기적으로 호출하려면
@Scheduled를 사용할 수 있습니다. 그래서 이 계산기는 둘을 섞어서 같은 문법이라고 가정하지 않고,Unix/Linux 5필드와 Spring 6필드를 별도로 생성·해석합니다.Spring Cron 6필드 구조
Spring Cron 표현식은 Linux crontab과 달리 맨 앞에 초(second) 필드가 있습니다.
초 분 시 일 월 요일- 초: 0~59
- 분: 0~59
- 시: 0~23
- 일: 1~31
- 월: 1~12 또는 JAN~DEC
- 요일: 0~7 또는 SUN~SAT
- 일·요일 필드에서
?,L,W,#같은 확장 문법도 지원
따라서 Linux crontab에서 매일 오전 9시를 의미하는
0 9 * * *는 5필드이고, Spring에서는 초 값을 앞에 추가해 0 0 9 * * *처럼 작성합니다.Spring @Scheduled Cron 사용법
Spring에서
@Scheduled를 사용하려면 먼저 스케줄링 기능을 활성화해야 합니다. 일반적으로 설정 클래스에 @EnableScheduling을 추가하고, 반복 실행할 Spring Bean의 메서드에 @Scheduled를 지정합니다.@Configuration
@EnableScheduling
public class SchedulingConfig {
}아래 예시는 Asia/Seoul 시간대를 기준으로 월요일부터 금요일까지 매일 오전 9시에
runBatch() 메서드를 실행하는 형태입니다.@Scheduled(
cron = "0 0 9 * * MON-FRI",
zone = "Asia/Seoul"
)
public void runBatch() {
// 실행할 작업
}Spring의
zone 속성을 지정하면 Cron 표현식을 해석할 시간대를 명시할 수 있습니다. 시간대를 지정하지 않을 경우 애플리케이션과 스케줄러가 사용하는 기본 시간대의 영향을 받을 수 있으므로, 해외 서비스나 운영 서버의 시간대가 다른 환경에서는 명시적으로 지정하는 편이 이해하기 쉽습니다.Spring Cron 예제
Cron에서 자주 사용하는 기호
- *: 해당 필드의 모든 값. 예:
* * * * *는 Unix/Linux에서 매분 실행 - ,: 여러 값을 나열. 예:
0 9 * * MON,WED,FRI - -: 연속된 범위. 예:
0 9 * * MON-FRI - /: 필드 범위 안에서 간격 지정. 예:
*/5 * * * *는 5분마다 실행 - ?: Spring의 일 또는 요일 필드에서 특정 값을 지정하지 않을 때 사용
- L: Spring에서 마지막 날 또는 마지막 특정 요일 표현에 사용
- W: Spring에서 지정한 날짜와 가장 가까운 평일 표현에 사용
- #: Spring에서 한 달의 N번째 특정 요일 표현에 사용
Cron의 step(/)은 해당 필드 범위 안에서 계산됩니다. 예를 들어, 시 필드의 */23은 하루를 기준으로 0시와 23시에 일치할 수 있으며, '실행이 끝난 뒤 정확히 23시간 후'라는 의미가 아닙니다. 정확한 경과 시간 간격이 필요하다면 사용하는 스케줄러의 fixedRate 또는 fixedDelay 같은 기능이 더 적합할 수 있습니다.
일(day of month)과 요일(day of week)을 함께 지정할 때
전통적인 Unix/Linux crontab에서는 일 필드와 요일 필드를 둘 다 제한하면 둘 중 하나가 현재 날짜와 일치할 때 실행됩니다. 예를 들어,
30 4 1,15 * 5는 매월 1일과 15일뿐 아니라 금요일 조건도 실행 날짜에 영향을 줍니다. "특정 날짜이면서 특정 요일"이라는 AND 조건으로 단순하게 생각하면 실제 실행 결과가 달라질 수 있습니다.Cron 구현체마다 세부 문법과 날짜 처리 방식이 다를 수 있으므로, Linux crontab이 아닌 Kubernetes CronJob, GitHub Actions, Quartz, 클라우드 스케줄러 등에서 사용할 때는 해당 플랫폼의 문법을 별도로 확인하는 것이 안전합니다.
Cron과 시간대(Time Zone)
Cron 표현식은 보통 시간 규칙 자체만 표현하며 시간대 정보가 문자열 안에 직접 포함되지 않습니다.따라서 같은
0 9 * * *라도 어떤 시간대를 기준으로 해석하느냐에 따라 실제 실행 시각이 달라질 수 있습니다. 서버 운영체제, 컨테이너, 애플리케이션 또는 스케줄러의 시간대 설정을 함께 확인해야 합니다.Spring의
@Scheduled에서는 zone 속성으로 시간대를 지정할 수 있습니다. 또한 미국·유럽처럼 일광절약시간제(DST)를 사용하는 지역은 특정 현지 시간이 존재하지 않거나 같은 시간이 두 번 나타날 수 있으므로, 중요한 배치 작업은 DST 전환일의 실행 방식도 확인하는 것이 좋습니다.Cron, crontab, Spring Cron 중 무엇을 사용해야 하나요?
Cron 표현식 생성기 / 해석기 활용 예시
이 페이지의 Cron 표현식 생성기에서는 반복 주기를 선택해 Unix/Linux 5필드 또는 Spring 6필드 표현식을 만들 수 있고,Cron 표현식 해석기에서는 기존 표현식을 붙여넣어 각 필드의 의미와 다음 실행 시각을 확인할 수 있습니다.
- 서버 운영: 로그 정리, DB 백업, 임시 파일 삭제
- 백엔드 개발: 정산 배치, 리포트 생성, 알림 발송, 캐시 갱신
- Spring 개발:
@Scheduled(cron = "...")작성 전 주기 확인 - CI/CD: 정기 빌드, 테스트, 배포 파이프라인 예약
- 데이터 작업: ETL, 크롤링, 통계 집계, 데이터 동기화
- 운영 점검: 다른 시간대에서 다음 실행 시각이 언제인지 확인
자주 묻는 질문
- Q. crontab이란 무엇인가요?A. crontab은 Unix/Linux에서 cron 작업을 등록하고 관리하는 설정 방식과 명령어입니다. 보통 5개의 시간 필드 뒤에 실행할 명령을 작성해 반복 작업을 예약합니다.
- Q. crontab은 어떻게 사용하나요?A. 일반적으로
crontab -e로 현재 사용자의 예약 작업을 편집하고,crontab -l로 등록된 내용을 확인합니다. 각 줄에는 실행 시간과 명령을 함께 작성합니다. - Q. Cron 표현식에서 * * * * * 는 무슨 뜻인가요?A. Unix/Linux 5필드 Cron 기준으로 모든 분, 모든 시, 모든 날짜, 모든 월, 모든 요일에 일치하므로 매분 실행됩니다.
- Q. 5분마다 실행하려면 어떻게 작성하나요?A. Unix/Linux crontab에서는
*/5 * * * *, Spring에서는 초 필드를 포함해0 */5 * * * *처럼 작성할 수 있습니다. - Q. 평일 오전 9시에만 실행하려면 어떻게 하나요?A. Unix/Linux에서는
0 9 * * MON-FRI, Spring에서는0 0 9 * * MON-FRI를 사용할 수 있습니다. - Q. Cron 표현식과 crontab은 같은 것인가요?A. 완전히 같은 의미는 아닙니다. Cron 표현식은 실행 시간을 나타내는 시간 규칙이고, crontab 항목은 그 시간 규칙과 실제 실행할 명령을 함께 저장합니다.
- Q. 왜 Spring Cron은 6필드인가요?A. Spring Cron은 Linux crontab의 5개 시간 필드 앞에 초 필드를 추가해 초·분·시·일·월·요일 순서의 6필드를 사용합니다. 따라서 같은 실행 시각이라도 Linux와 Spring의 표현식 길이가 다릅니다.
- Q. Spring에서 Cron 표현식은 어디에 사용하나요?A. 대표적으로 Spring Bean의 메서드에
@Scheduled(cron = "...")를 지정해 정해진 시간에 메서드를 반복 실행할 때 사용합니다. 스케줄링을 사용하려면@EnableScheduling을 통해 기능을 활성화할 수 있습니다. - Q. @Scheduled에서 한국 시간대를 지정할 수 있나요?A. 네. 예를 들어,
zone = "Asia/Seoul"을 지정하면 해당 시간대를 기준으로 Cron 표현식을 해석하도록 설정할 수 있습니다. - Q. 이 페이지의 다음 실행 시각과 실제 서버 실행 시각이 다를 수 있나요?A. 네. 서버 시간대, 컨테이너 설정, DST, Cron 구현체와 플랫폼별 문법 차이에 따라 실제 결과가 달라질 수 있습니다. 이 페이지의 미리보기로 표현식을 점검한 뒤 운영 환경의 설정도 함께 확인하는 것이 좋습니다.



