시간 기반 예약
주기적인 작업 실행하기
시간 기반 예약은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
일정에 따라 작업 실행하기
많은 시스템에는 주기적인 작업이 필요합니다. 예를 들어 매일 밤 임시 파일을 정리하거나, 매일 아침 요약 이메일을 보내거나, 매분 API를 조회하는 작업입니다. 이 수업에서는 표준 라이브러리를 사용한 Go의 시간 기반 일정 실행을 소개합니다.
time 패키지
Go의 time 패키지가 기반이 됩니다. 주요 도구는 다음과 같습니다.
time.Sleep은 고루틴을 일시 중지합니다time.After는 한 번 발생하는 채널을 반환합니다time.Ticker는 반복해서 발생합니다time.Timer는 지연 시간 후 한 번 발생합니다
단순한 반복
가장 단순한 일정 실행기는 작업을 수행하고, 대기하고, 반복합니다.
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 3; i++ {
fmt.Println("tick", i)
time.Sleep(10 * time.Millisecond)
}
}Sleep이 어긋나는 이유
Sleep 반복은 시간이 지날수록 어긋납니다. 작업에 200ms가 걸리고 1초 동안 대기하면 실제 간격은 1.2초가 되며, 이 차이가 누적됩니다. 정확한 간격이 필요하다면 다음 수업에서 다룰 Ticker를 사용하십시오.
일회성 지연에 time.After 사용하기
time.After(d)는 지속 시간 d 후 한 번 값을 받는 채널을 반환합니다. 시간 초과를 구현하는 select에서 유용합니다.
select {
case <-time.After(2 * time.Second):
fmt.Println("2s elapsed")
}time.Timer
Timer는 한 번 발생하며 중지하거나 재설정할 수 있습니다. 취소할 수 없는 time.After와는 다릅니다.
t := time.NewTimer(5 * time.Second)
defer t.Stop()
<-t.C
fmt.Println("fired")특정 시각에 일정 실행하기
예를 들어 오전 3 AM에 실행하려면 해당 시각까지의 지속 시간을 계산하고 그만큼 대기하거나 타이머를 설정한 다음, 다음 날을 위해 일정을 다시 설정합니다.
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 3, 0, 0, 0, now.Location())
if next.Before(now) {
next = next.Add(24 * time.Hour)
}
fmt.Println("sleep for", time.Until(next))지속 시간에는 유형이 있습니다
time.Duration은 나노초 단위의 int64이며, time.Second, time.Minute, time.Hour 같은 편리한 상수를 제공합니다. 이들을 곱하면 간격을 읽기 쉽게 표현할 수 있습니다.
every := 30 * time.Minute
fmt.Println(every)단조 시계와 벽시계
Go의 time.Now에는 경과 시간 측정에 사용되는 단조 시계 값이 포함되어 있어 시계 조정의 영향을 받지 않습니다. 경과 시간에는 벽시각을 빼지 말고 time.Since를 사용하십시오.
start := time.Now()
// ... work ...
fmt.Println("took", time.Since(start))라이브러리를 사용할 시점
복잡한 일정(예: "매주 평일 9시 15분")에서는 시간 계산을 직접 작성하면 오류가 발생하기 쉽습니다. 다음 수업에서 다룰 robfig/cron 라이브러리는 cron 표현식을 대신 해석해 줍니다.
실행 가능: 다음 실행 시각 계산하기
이 독립 실행형 프로그램은 time 패키지만 사용하여 다음 분 경계까지 얼마나 남았는지 계산합니다.
package main
import (
"fmt"
"time"
)
func main() {
now := time.Date(2026, 1, 1, 10, 30, 45, 0, time.UTC)
nextMinute := now.Truncate(time.Minute).Add(time.Minute)
fmt.Println("now:", now.Format("15:04:05"))
fmt.Println("next run:", nextMinute.Format("15:04:05"))
fmt.Println("wait:", nextMinute.Sub(now))
}빠른 확인
시간 기반 일정 실행에 대한 이해도를 확인해 보십시오.
복습
시간 기반 일정 실행의 기초를 배웠습니다.
time패키지는 Sleep, After, Timer, Ticker를 제공합니다- Sleep 반복은 어긋나지만 틱커는 일정을 유지합니다
time.Until을 사용하여 목표 시각까지의 지속 시간을 계산합니다- 경과 시간을 측정할 때
time.Since와 단조 시계를 사용합니다
자주 묻는 질문
“시간 기반 예약” 강의는 무료인가요?
네 — “시간 기반 예약” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“시간 기반 예약”에서 뭘 배우나요?
주기적인 작업 실행하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“시간 기반 예약” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.