Backend

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

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

다른 생태계 경험자를 위한 매핑

  • Java: ThreadLocal, MDC
  • Node.js: AsyncLocalStorage
  • Python: contextvars

Context의 역할

다른 언어와의 비교

기능JavaNode.jsGo
요청 범위 값ThreadLocalAsyncLocalStoragecontext.WithValue
타임아웃ExecutorService timeoutAbortControllercontext.WithTimeout
취소 전파Future.cancel()AbortSignalcontext.WithCancel

핵심 차이점

Go Context는 세 가지 역할을 하나의 인터페이스에서 처리:

  1. 값 전파 (Request ID, Trace ID)
  2. 타임아웃
  3. 취소 신호 전파

타임아웃 설계

계층별 전략

원칙: 하위 타임아웃 합 < 상위 타임아웃

Spring vs Go

SpringGo
@Transactional(timeout=3)WithTimeout(ctx, 3*time.Second)
RestTemplate.setConnectTimeouthttp.Client Timeout

취소 전파

왜 중요한가?

Java 대응

JavaGo
Future.cancel(true)cancel() 호출
InterruptedExceptionctx.Done() 채널

Request ID 전파

MDC vs Context


안티패턴

Context를 구조체에 저장

Spring 개발자 주의점

Spring 습관Go 규칙
@Autowired로 주입파라미터로 전달
ThreadLocal에 저장저장하지 않음
선택적 사용첫 번째 파라미터 (필수)

정리

개념Java/SpringGo
요청 범위 값ThreadLocal/MDCWithValue
타임아웃@Transactional timeoutWithTimeout
취소Future.cancelcancel()
사용 패턴암묵적 (ThreadLocal)명시적 (파라미터)

다음 편 예고

4편: Goroutine과 Channel 실전 활용에서는 Java의 ExecutorService, Node.js의 Worker Threads에 대응하는 Go 동시성 패턴을 다룹니다.


참고 자료

Share

Related Articles

Comments

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

© 2026 Seogyu Kim