관리 메뉴

피터의 개발이야기

[GO] Tucker의 GO 언어 프로그래밍 - 23장 채널과 컨텍스트 본문

Programming/GO

[GO] Tucker의 GO 언어 프로그래밍 - 23장 채널과 컨텍스트

기록하는 백앤드개발자 2025. 3. 26. 00:47
반응형

ㅁ 들어가며

Tucker의 GO 언어 프로그래밍 책을 보고 정리한 글입니다.

[GO] Tucker의 GO 언어 프로그래밍 - 목차

ㅇ Go 언어에서 채널(Channel)컨텍스트(Context)는 동시성 프로그래밍과 요청 관리에 필수적인 도구이다.


ㅁ  채널(Channel) 사용하기

ㅇ 채널은 고루틴 간의 데이터 통신 및 동기화를 위한 파이프 역할을 한다.

ㅇ 기본 사용법

  • 생성: make(chan 타입)
  • 송신: 채널 <- 데이터
  • 수신: 데이터 := <-채널
// 기본 예시
ch := make(chan string)       // 생성
go func() { ch <- "Hello" }() // 송신: 채널 <- 데이터
msg := <-ch                   // 수신: 데이터 := <- 채널
fmt.Println(msg)              // Hello

 

ㅁ 버퍼드 채널 vs 언버퍼드 채널

유형 특징 예제
언버퍼드 송신/수신이 즉시 동기화
ch := make(chan int)
버퍼드 지정된 크기까지 비동기적 전송
ch := make(chan int, 3)

ㅇ 버퍼 크기를 조정하면 버퍼를 두어 비동기 처리가 가능하다.

 

ㅁ 채널 닫기 및 검증

close(ch)  // 채널 닫기
val, ok := <-ch  // ok=false: 채널 닫힘 상태

 

 

ㅁ select 문 활용

ㅇ 여러 채널을 논블로킹으로 처리할 때 사용된다.(p492)

select {
case msg := <-ch1:
    fmt.Println(msg)
case <-time.After(1 * time.Second):
    fmt.Println("Timeout")
}

ㅁ컨텍스트(Context) 사용하기

컨텍스트는 작업을 지시할 때 작업 가능 시간, 작업 취소 등의 요청 범위(request-scoped) 데이터와 취소 신호를 관리합니다.(p499)

 

ㅁ 기본 생성

ctx := context.Background()  // 기본 컨텍스트 생성
ctx = context.WithValue(ctx, "key", "value")  // 값 추가

   

ㅁ 취소 신호 전달

ctx, cancel := context.WithCancel(context.Background())
go func() {
    time.Sleep(2 * time.Second)
    cancel()  // 취소 신호 전송
}()
<-ctx.Done()  // 취소 신호 수신 대기

 

ㅁ 타임아웃/데드라인 설정

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
// 3초 내 작업 완료되지 않으면 자동 취소

 

ㅁ 값 전달

ctx := context.WithValue(context.Background(), "userID", 123)
if userID := ctx.Value("userID"); userID != nil {
    fmt.Println(userID)  // 123
}

 

 

ㅁ HTTP 요청에서의 활용

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    select {
    case <-ctx.Done():
        fmt.Println("요청 취소됨")
    case <-time.After(5 * time.Second):
        fmt.Fprintln(w, "응답 완료")
    }
}

 


ㅁ 채널 vs 컨텍스트 비교

기능 채널 컨텍스트
주목적 고루틴 간 데이터 통신
요청 생명주기 관리
취소 처리 직접 구현 필요
내장 취소 API 제공
값 전달 타입 제한 없음
interface{} 타입으로 제한
사용 시나리오 동시성 작업 조율
API 요청, DB 트랜잭션 관리

 

 

ㅁ 마무리

  • 채널: 고루틴 간 안전한 데이터 교환에 사용. select로 다중 채널 처리 가능하다
  • 컨텍스트: 요청의 타임아웃/취소 관리 및 메타데이터 전파에 특화. HTTP 서버 개발 시 필수이다.
  • 조합 사용: 채널로 데이터 흐름 제어 + 컨텍스트로 시스템 전역 상태 관리가 이상적이다.

 

ㅁ 함께 보면 좋은 사이트

예제로 배우는 Go 프로그래밍 - Go 채널

[Go] 채널(Channel) 이란?

[golang] go context의 활용1(go context사용법 및 예제1)

공봉식 - Tucker의 GO 언어 프로그래밍

구글 도서 - Tucker의 GO 언어 프로그래밍

반응형
Comments