WithDeadline과 WithValue
절대 기한과 요청 범위 값 전달
WithDeadline과 WithValue은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
context.WithDeadline
WithDeadline은 절대 시각에 취소되는 context를 생성합니다. 부모에게 이미 더 이른 마감 시간이 있다면 부모의 마감 시간이 우선합니다.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout 대 WithDeadline
WithTimeout(parent, d)는 WithDeadline(parent, time.Now().Add(d))와 동등합니다. 절대적인 만료 시각(예: 들어오는 RPC 헤더에서 전달된 시각)이 있을 때는 WithDeadline을 사용하십시오.
데드라인 읽기
어떤 컨텍스트든 ctx.Deadline()으로 데드라인을 확인하십시오. 불리언 값은 데드라인이 존재하는지를 나타냅니다.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue는 키-값 쌍을 컨텍스트에 연결합니다. 하위 코드는 ctx.Value(key)로 이 값을 가져옵니다.
type ctxKey string
const userKey ctxKey = "user"
ctx := context.WithValue(parent, userKey, currentUser)
func getUser(ctx context.Context) *User {
u, _ := ctx.Value(userKey).(*User)
return u
}키 충돌 방지
패키지 간 충돌을 방지하려면 키에 내보내지 않는 패키지 전용 타입을 사용하십시오. 기본 제공 타입(string, int)을 컨텍스트 키로 직접 사용하지 마십시오.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)컨텍스트에 저장할 항목
API 경계를 넘는 요청 범위 값만 저장하십시오: 추적 ID, 인증 토큰, 요청 ID. 선택적 함수 인수나 변경 가능한 상태는 저장하지 마십시오.
WithValue 성능
ctx.Value는 컨텍스트 체인을 따라 선형 검색을 수행합니다. 컨텍스트마다 많은 값을 저장하지 마십시오. 여러 값이 필요하면 하나의 구조체로 묶으십시오.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})미들웨어를 통한 값 전파
HTTP 미들웨어는 요청 메타데이터를 컨텍스트에 연결하고 처리기에서 이를 가져오는 표준 위치입니다:
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user := authenticate(r)
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))
})
}r.WithContext
r.WithContext(ctx)를 사용하여 HTTP 요청의 컨텍스트를 바꾸십시오. 이렇게 하면 새 컨텍스트가 포함된 요청의 얕은 복사본이 생성되며 원본은 수정되지 않습니다.
데드라인 전파
게이트웨이가 컨텍스트에 데드라인을 설정하고 요청을 하위 서비스로 전달하면, 컨텍스트를 허용하는 모든 서비스가 명시적인 시간 초과 로직 없이 자동으로 데드라인을 준수합니다.
컨텍스트 체인
각 WithValue, WithCancel, WithTimeout은 부모 컨텍스트를 새로운 노드로 감쌉니다. ctx.Value는 키를 찾거나 nil을 반환하는 루트 컨텍스트에 도달할 때까지 체인을 따라갑니다.
빠른 확인
컨텍스트 키에 내보내지 않는 패키지 전용 타입을 사용해야 하는 이유는 무엇입니까?
복습: WithDeadline과 WithValue
핵심 내용:
- WithDeadline은 절대 시각에 취소하고, WithTimeout은 상대적입니다
- ctx.Deadline()으로 데드라인을 읽습니다
- 요청 범위 메타데이터에는 WithValue를 사용하고, 타입이 지정된 내보내지 않는 키를 사용합니다
- 체인 깊이를 줄이려면 여러 값을 구조체로 묶습니다
자주 묻는 질문
“WithDeadline과 WithValue” 강의는 무료인가요?
네 — “WithDeadline과 WithValue” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“WithDeadline과 WithValue”에서 뭘 배우나요?
절대 기한과 요청 범위 값 전달 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“WithDeadline과 WithValue” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- context.Context가 필요한 이유
- WithCancel과 WithTimeout
- WithDeadline과 WithValue
- HTTP 및 데이터베이스 호출의 컨텍스트