피드로 돌아가기
We Forgot defer — 6 Resource Leaks We Found During Refactoring
Dev.toDev.to
Backend

Panic 및 Signal 상황의 Resource Leak 해결을 통한 시스템 안정성 확보

We Forgot defer — 6 Resource Leaks We Found During Refactoring

Bala Paranj2026년 4월 19일12intermediate

Context

성공 경로(Happy Path) 중심의 설계로 인해 Panic, Error, Signal 발생 시 리소스 해제가 누락되는 구조적 결함 존재. 특히 Go 언어의 defer 특성과 os.Exit의 동작 방식에 대한 오해로 터미널 오염 및 파일 핸들 누수가 발생한 상황.

Technical Solution

  • Resource Acquisition 직후 defer를 배치하여 Exception 발생 시에도 보장되는 Cleanup 메커니즘 구축
  • os.Exit(130)의 defer 스킵 문제를 Context Cancellation 기반의 Graceful Shutdown 구조로 변경하여 리소스 해제 체인 활성화
  • Goroutine 내 Panic 전파 방지를 위해 defer recover()와 sync.Once를 결합한 다중 보호 계층 설계
  • Loop 내부의 defer 누적으로 인한 File Descriptor 고갈 문제를 별도 함수 추출(Function Extraction)을 통한 Scope 제한으로 해결
  • CI 단계에 gocritic의 deferInLoop 체크를 도입하여 정적 분석 기반의 리소스 누수 원천 차단

1. 리소스 획득 직후 즉시 defer를 선언했는가?

2. os.Exit 등 프로세스 강제 종료 시 Cleanup 로직이 무시되지 않는 구조인가?

3. Goroutine 내부에서 Panic 발생 시 메인 프로세스까지 영향을 주지 않도록 recover()가 배치되었는가?

4. Loop 내부에 defer를 사용하여 File Descriptor나 Memory 누수 가능성이 없는가?

5. sync.Once를 통해 리소스 해제 함수의 중복 호출(Double-close) 가능성을 제거했는가?

원문 읽기