반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 컨텍스트(Context) 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 컨텍스트(Context) 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 컨텍스트(Context)는 고루틴 간에 데이터를 전달하거나, 작업 취소, 데드라인 설정 등의 작업을 관리하기 위해 사용하는 표준 라이브러리입니다. context 패키지는 고루틴이 서로 독립적으로 동작하면서도 특정 조건에서 동작을 조율할 수 있도록 도와줍니다.
컨텍스트의 주요 특징
- 작업 취소(Cancellation): 부모 고루틴에서 작업을 취소하면 관련된 모든 하위 고루틴도 취소됩니다.
- 데드라인(Deadline): 특정 시간까지 작업을 완료하도록 설정할 수 있습니다.
- 타임아웃(Timeout): 일정 시간이 지나면 작업을 자동으로 중단할 수 있습니다.
- 값 전달: 고루틴 간에 키-값 데이터를 전달할 수 있습니다.
컨텍스트 생성 방법
context 패키지는 기본적으로 4가지 컨텍스트 생성 함수를 제공합니다.
- context.Background()
- 루트 컨텍스트로, 주로 애플리케이션의 최상위에서 사용됩니다.
- 기본적으로 취소나 타임아웃이 없습니다.
- context.TODO()
- 컨텍스트를 정의해야 하지만 아직 결정되지 않은 경우 임시로 사용됩니다.
- context.WithCancel(parent)
- 취소 기능을 추가한 컨텍스트를 생성합니다.
- 부모 컨텍스트가 취소되면 자식 컨텍스트도 자동으로 취소됩니다.
- context.WithTimeout(parent, timeout)
- 지정된 시간 이후에 자동으로 취소되는 컨텍스트를 생성합니다.
- context.WithDeadline(parent, deadline)
- 특정 시점 이후에 자동으로 취소되는 컨텍스트를 생성합니다.
- context.WithValue(parent, key, value)
- 컨텍스트에 값을 저장하고 전달합니다.
컨텍스트 활용 예제
1. 작업 취소
context.WithCancel을 사용하여 고루틴 작업을 취소합니다.
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done(): // 취소 신호 수신
fmt.Println("작업 취소됨")
return
default:
fmt.Println("작업 중...")
time.Sleep(500 * time.Millisecond)
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
time.Sleep(2 * time.Second)
cancel() // 작업 취소
time.Sleep(1 * time.Second) // 고루틴 종료를 기다림
}
실행 결과:
작업 중...
작업 중...
작업 중...
작업 취소됨
2. 타임아웃 설정
context.WithTimeout으로 일정 시간이 지나면 작업을 중단합니다.
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("타임아웃!")
return
default:
fmt.Println("작업 진행 중...")
time.Sleep(500 * time.Millisecond)
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // 컨텍스트 해제
go worker(ctx)
time.Sleep(3 * time.Second) // 작업 종료 기다림
}
실행 결과:
작업 진행 중...
작업 진행 중...
타임아웃!
3. 값 전달
context.WithValue를 사용하여 컨텍스트를 통해 값을 전달합니다.
package main
import (
"context"
"fmt"
)
func greet(ctx context.Context) {
name := ctx.Value("name").(string)
fmt.Printf("안녕하세요, %s님!\\n", name)
}
func main() {
ctx := context.WithValue(context.Background(), "name", "홍길동")
greet(ctx)
}
실행 결과:
안녕하세요, 홍길동님!
컨텍스트 사용 시 주의 사항
- 컨텍스트 취소는 필수
- 컨텍스트 생성 시 cancel 함수를 호출하지 않으면 리소스 누수가 발생할 수 있습니다.
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // 컨텍스트 해제
- 컨텍스트는 읽기 전용
- 컨텍스트는 불변(immutable)으로 설계되었으며, 값을 추가할 때는 새로운 컨텍스트를 생성해야 합니다.
- 값 사용은 최소화
- 컨텍스트는 데이터를 저장하기 위한 일반적인 용도가 아니라, 요청 범위와 관련된 메타데이터 전달에만 사용해야 합니다.
컨텍스트 활용 사례
- HTTP 요청 처리
- HTTP 요청의 수명 주기를 관리하고, 요청 취소 또는 타임아웃을 구현하는 데 사용됩니다.
- 데이터베이스 쿼리
- 긴 쿼리 실행 시간을 제한하거나 요청 취소 시 쿼리를 중단.
- 마이크로서비스 통신
- 서비스 간 요청 취소, 타임아웃, 메타데이터 전달.
Go의 컨텍스트는 고루틴 작업의 수명 주기를 효율적으로 관리하고, 동시성 프로그래밍을 단순화하는 강력한 도구입니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 타입 제한 이란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
---|---|
👨💻 [Go] Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.03 |
👨💻 [Unreal] 언리얼 엔진에서 Progress Bar 란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
👨💻 [Unreal] 언리얼 엔진에서 Widget 이란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
👨💻 [Go] Go 에서 채널(Channel) 이란 무엇이며, 어떻게 활용할 수 있나요? (3) | 2025.01.02 |