Backend
Enterprise Go 시리즈 #3: Context로 요청 생명주기 관리
Go Context를 요청 범위 값, 타임아웃, 취소 전파 관점에서 실무적으로 정리합니다.
Enterprise Go Series(3 / 9)
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, 취소, 추적이 동시에 정리됩니다.