1. 소개
Golang cron 라이브러리는 특정 시간이나 간격에 작업을 예약할 수 있는 강력하고 사용하기 쉬운 도구입니다. 이는 UNIX cron 서비스를 모방하지만 Go 애플리케이션에 통합할 수 있는 독립형 라이브러리로 구현되었습니다. cron 라이브러리는 시간 기반 예약을 처리하여 실행해야 하는 작업에 집중할 수 있게 합니다.
2. 예제
cron 라이브러리 설치
프로젝트에서 cron 라이브러리를 사용하려면 먼저 go get
명령을 사용하여 라이브러리를 설치해야 합니다:
go get github.com/robfig/cron/[email protected]
cron 패키지 임포트
설치 후 다음과 같이 Go 프로그램에 임포트할 수 있습니다:
import "github.com/robfig/cron/v3"
다음은 매 분마다 메시지를 출력하는 Cron 작업을 설정하는 간단한 예제입니다:
package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("매시간 30분마다") })
c.AddFunc("@hourly", func() { fmt.Println("매시간") })
c.AddFunc("@every 1h30m", func() { fmt.Println("매 1시간 30분마다") })
c.Start()
..
// Funcs are invoked in their own goroutine, asynchronously.
...
// Funcs may also be added to a running Cron
c.AddFunc("@daily", func() { fmt.Println("매일") })
..
..
c.Stop() // 스케줄러를 중지합니다 (이미 실행 중인 작업은 중지되지 않음).
}
3. CRON 표현 형식
CRON 표현식은 6개의 공백으로 구분된 필드를 사용하여 일련의 시간을 나타냅니다.
필드 이름 | 필수 여부 | 허용된 값 | 허용된 특수 문자 |
---|---|---|---|
초 | 예 | 0-59 | * / , - |
분 | 예 | 0-59 | * / , - |
시 | 예 | 0-23 | * / , - |
월 별 날짜 | 예 | 1-31 | * / , - ? |
월 | 예 | 1-12 또는 JAN-DEC | * / , - |
주 별 날짜 | 예 | 0-6 또는 SUN-SAT | * / , - ? |
4. CRON 표현식의 특수 문자
- 별표 ( * ) 별표는 주어진 필드에 대한 모든 가능한 값들을 나타냅니다. 예를 들어, 분 필드에 별표가 있으면 매 분을 의미합니다.
- 슬래시 ( / ) 슬래시 문자는 증가량을 지정하는 데 사용됩니다. 예를 들어, 초 필드의 "*/15"는 0부터 시작하여 매 15초를 의미합니다.
- 쉼표 ( , ) 쉼표 문자는 여러 개의 이산값을 나열하는 데 사용됩니다. 예를 들어, 요일 필드의 "MON,WED,FRI"는 월요일, 수요일, 금요일에 작업을 실행함을 의미합니다.
- 하이픈 ( - ) 하이픈은 값의 범위를 나타냅니다. 시간 필드의 "9-17"은 오전 9시부터 오후 5시까지의 매 시간을 의미합니다.
- 물음표 ( ? ) 물음표는 일별 및 주별 날짜 필드에서 '구체적인 값이 없음'을 나타내는 데 사용되며, 다른 하나에 대한 값만을 지정해야 할 때 유용합니다.
5. 미리 정의된 스케줄
사용 가능한 미리 정의된 스케줄의 상세한 설명은 다음과 같은 표 형식으로 표시됩니다:
항목 | 설명 | 동등한 값 |
---|---|---|
@yearly (또는 @annually) | 매년 1회, 자정, 1월 1일 | 0 0 0 1 1 * |
@monthly | 매월 1회, 자정, 해당 월 1일 | 0 0 0 1 * * |
@weekly | 매주 1회, 토/일 자정 사이 | 0 0 0 * * 0 |
@daily (또는 @midnight) | 매일 1회, 자정 | 0 0 0 * * * |
@hourly | 매시간 1회, 시간 시작시간 | 0 0 * * * * |
6. 간격 및 고정 간격 스케줄링
일정 간격으로 작업을 실행하는 것은 cron 라이브러리의 또 다른 강력한 기능입니다. 예를 들어, 매 2시간마다 작업을 실행하기 위해 스케줄링하려면:
c.AddFunc("@every 2h", func() { fmt.Println("두 시간마다 작업 실행") })
7. 시간대 및 작업 스케줄링
해석과 스케줄링은 Go 애플리케이션이 실행되는 기계의 지역 시간대에서 이루어집니다. 일광 절약 시간 변경 시에는 특정 시간이 존재하지 않거나 반복될 수 있으므로 주의가 필요합니다.
8. 쓰레드 안전성 및 동기화
cron 라이브러리는 쓰레드 안전 및 동시성을 고려하여 설계되었습니다. 호출자는 경합 조건을 피하기 위해 메소드 호출의 올바른 순서를 유지하는 것이 중요합니다. 작업이 올바르게 스케줄되고 실행되도록 필요할 때 적절한 동기화 메커니즘을 사용해야 합니다.