본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 컨텍스트(Context) 란 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2025. 1. 3.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

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


반응형