개발 지식

개발 지식

Go context 없이 만든 서버는 언젠가 고장난다

페이지 정보

profile_image
영삼이
0건 132회 25-03-28 15:07

본문

✅ context 없이 만든 서버는 언젠가 고장난다

타임아웃, 취소, 리소스 정리는 context로 관리하자

Go의 HTTP 서버는 기본적으로 처리 중인 요청을 계속 기다린다:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
	time.Sleep(10 * time.Second)
	fmt.Fprintln(w, "Done")
})

이 요청을 클라이언트가 중간에 끊어도
서버는 끝까지 처리하려고 한다 → 리소스 낭비


✅ 해결: r.Context()로 종료 감지

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
	select {
	case <-time.After(10 * time.Second):
		fmt.Fprintln(w, "Done")
	case <-r.Context().Done():
		log.Println("Client canceled request")
	}
})
  • 클라이언트가 연결을 끊으면 자동으로 Done() 트리거

  • 불필요한 처리 중단 가능

  • DB, 외부 API 요청 등도 함께 취소 처리 가능


✔️ 실전에서는 모든 요청 처리 흐름에
context를 도입해서 중단 가능성을 관리해야 한다.
이게 안정적인 서버의 기본이다.

댓글목록

등록된 댓글이 없습니다.