Kim Seogyu
Backend

Enterprise Go 시리즈 #3: Context로 요청 생명주기 관리

Go Context를 요청 범위 값, 타임아웃, 취소 전파 관점에서 실무적으로 정리합니다.

Published 2026년 1월 1일1 min read176 words

Enterprise Go 시리즈 #3: Context로 요청 생명주기 관리

Context의 역할

Context는 3가지를 전달합니다.

  • 요청 범위 값 (request id, trace id)
  • timeout/deadline
  • cancel 신호

핵심은 "모든 하위 호출로 동일한 생명주기"를 전파하는 것입니다.

기본 규칙

  • 함수 첫 번째 인자는 context.Context
  • 구조체 필드에 Context 저장 금지
  • context.Background()는 진입점에서만 사용

타임아웃 설계

상위 timeout이 하위를 감싸야 합니다. 예시:

  • HTTP 전체 30s
  • UseCase 10s
  • DB 3s
  • 외부 API 5s
ctx, cancel := context.WithTimeout(parent, 3*time.Second)
defer cancel()

취소 전파

클라이언트가 연결을 끊었는데 하위 DB/API 호출이 계속 돌면 리소스가 낭비됩니다. 모든 저장소/외부 호출은 전달받은 ctx를 그대로 사용해야 합니다.

값 전달 주의

WithValue는 설정 저장소가 아닙니다.

  • 허용: request id, trace id, auth subject
  • 비권장: DB 핸들, 대형 객체, 옵션 묶음

자주 하는 실수

  • 타임아웃 없는 outbound HTTP 호출
  • 새 고루틴에서 parent context 누락
  • 라이브러리 내부에서 임의로 Background() 생성

요약

Go Context는 편의 기능이 아니라 운영 안정성 장치입니다. "전파 누락이 없는 구조"를 만들면 timeout, 취소, 추적이 동시에 정리됩니다.

Share

Related Articles

Comments

이 블로그는 제가 알고 있는 것들을 잊지 않기 위해 기록하는 공간입니다.
직접 작성한 글도 있고, AI의 도움을 받아 정리한 글도 있습니다.
정확하지 않은 내용이 있을 수 있으니 참고용으로 봐주세요.

© 2026 Seogyu Kim