
Go 언어로 개발을 하면 여러 예제 코드와 라이브러리 함수들을 보면 "context.Context" 를 정말 자주 볼 수가 있습니다.
이 context가 도대체 왜 존재하는지, 그리고 Go에서는 어떤 중요한 역할을 수행하는지 알아봅시다.
1. Context : 고루틴의 '고립성' 문제
Go의 고루틴은 생성된 후 스스로 종료되거나 함수가 종료되지 않는다면 외부에서 강제로 종료시킬 방법이 없습니다.
현대적인 서버 구조에서는 하나의 요청을 처리하기 위해서 여러 개의 하위 고루틴을 생성하게 됩니다.
만약 사용자가 연결을 끊거나 타임아웃이 발생했을 때, 이 하위 고루틴을 멈추지 못하게 되면, 이 고루틴들은 모두
꺼지지 않고 서버 리소스를 계속 점유하고 고갈시키게 됩니다.
이러한 고루틴의 고립성과 리소스 누수 문제를 해결하기 위해 도입된 것이 'Context' 입니다.
'Context'는 고루틴 간의 '취소 신호 전파' 메커니즘을 제공하며, 부모가 작업 취소를 요청하면, 그 신호가 하위의 모든 고루틴에게 즉시
전파되어 각자 안전하게 작업을 멈출 수 있게 합니다.
쉽게 Context는 고루틴 트리 전체에 동시 중단 신호를 보내는 역할을 합니다.
2. 예제 코드
package main
import (
"context"
"fmt"
"time"
)
type traceIDKey struct{}
func doWork(ctx context.Context, name string) {
fmt.Printf("[%s] process start\n", name)
if traceID, ok := ctx.Value(traceIDKey{}).(string); ok && traceID != "" {
fmt.Printf("[%s] trace_id=%s\n", name, traceID)
}
select {
case <-time.After(2 * time.Second):
fmt.Printf("[%s] process done\n", name)
case <-ctx.Done():
fmt.Printf("[%s] process stop %v\n", name, ctx.Err())
}
}
func main() {
// 1. 시간 제한을 통한 자동 중단
ctx1, cancel1 := context.WithTimeout(context.Background(), time.Second)
defer cancel1()
doWork(ctx1, "Timeout Context")
// 2. 명시적 취소 전파
ctx2, cancel2 := context.WithCancel(context.Background())
cancel2() // 즉시 취소
doWork(ctx2, "Cancel Context")
// 3. 메타데이터 전파 (Trace ID 같은 로그 추적용도)
ctx3 := context.WithValue(context.Background(), traceIDKey{}, "REQ-1234")
doWork(ctx3, "Value Context")
}
3. 전체 코드
https://github.com/reochoi109/go-handbook/blob/main/context/basic/main.go
go-handbook/context/basic/main.go at main · reochoi109/go-handbook
A personal handbook of Go patterns and best practices. Lightweight, practical code snippets for real-world backend development. - reochoi109/go-handbook
github.com
4. 참고 자료
'프로그래밍 > golang' 카테고리의 다른 글
| [Go] 고루틴 워커 풀(Worker Pool) (0) | 2026.03.21 |
|---|---|
| [Golang] flag로 서브커맨드 만들기 (0) | 2026.03.21 |
| [Golang] 채널(Channel)이란? (0) | 2026.03.18 |
| [Golang] errgroup 이란? (0) | 2026.03.18 |
| [Golang] Close() 에러를 무시하면 안 되는 이유 (0) | 2026.03.18 |