근본 원인과 유발 요인, 왜 구분해야 재발을 막을 수 있나?

배포를 롤백해도 장애가 재발했다면, 그 배포는 유발 요인이었을 뿐 근본 원인이 아니었다는 뜻이다. 이번 회고에서는 API 지연 장애 사례를 시간순으로 복원해 두 개념이 실제로 어떻게 갈리는지 짚는다. 판단 기준은 하나다 — "제거했더니 재발이 멈췄는가."

  • 유발 요인은 장애를 촉발한 사건, 근본 원인은 그 촉발에도 시스템이 버티지 못한 구조적 결함이다.
  • 롤백·재시작으로 증상이 사라졌다가 다시 나타나면 근본 원인이 아직 남아있다는 신호다.
  • 재시도 로직에 지수 백오프가 없으면 사소한 지연도 커넥션 풀 고갈로 증폭될 수 있다.
  • 사후분석의 목표는 "누가"가 아니라 "왜 시스템이 그 사건에 취약했는가"를 밝히는 것이다. Google SRE 북 – 사후분석 문화 도 이를 원칙으로 명시한다.

증상: 14:02, API 5xx 비율이 평소 0.1%대에서 8%로 급등하고 평균 응답 시간이 3배로 늘었다. 14:05 직전 배포를 롤백했고 14:10경 지표가 정상 범위로 돌아왔다. 하지만 14:38, 별다른 변경 없이 동일 증상이 재발했다. 15:20 커넥션 풀 설정을 조정하고 나서야 지표가 안정됐다.

배포 롤백에도 지연이 재발한 이유는 배포 자체 때문일까?

아니다. 배포 코드에는 신규 조회 쿼리가 포함돼 있었고 인덱스 미적용으로 평균 쿼리 시간이 20~30ms가량 늘어난 것은 사실이었다. 그러나 롤백 후 8분 만에 동일 증상이 재발했다는 사실이 이 가설을 기각했다. 배포가 원인이었다면 롤백 시점에 문제가 완전히 해소돼야 했다.

트래픽 급증이 원인이라는 가설은 왜 기각됐나?

로드밸런서 로그상 초당 요청 수는 평소 대비 오차범위 안이었다. 마케팅 푸시나 배치 작업 같은 외부 트리거도 확인되지 않았다. 트래픽 곡선과 장애 발생 시점이 겹치지 않아 이 가설도 배제됐다.

커넥션 풀 고갈이 근본 원인이라 볼 수 있을까?

부분적으로만 맞다. 모니터링을 보면 커넥션 풀 사용률이 두 사건 모두에서 100%에 도달한 뒤 대기 큐가 쌓이며 지연이 증폭됐다. 하지만 커넥션 풀 고갈은 결과이지 시작점이 아니었다. "왜 커넥션이 순간적으로 고갈됐는가"를 더 파야 했다.

가설 검증 결과
신규 배포 코드 롤백 후에도 재발 → 기각
트래픽 급증 요청량 정상 범위 → 기각
커넥션 풀 고갈 사실이지만 표층 현상

그렇다면 진짜 근본 원인은 무엇이었나?

클라이언트 SDK의 재시도 로직에 지수 백오프와 지터(jitter)가 빠져 있던 것이 근본 원인이었다. 인덱스 미적용 쿼리가 응답 시간을 20~30ms 늘리자 일부 요청이 타임아웃 임계치를 넘었고, SDK는 즉시 동일 요청을 재시도했다. 재시도는 백오프 없이 반복돼 정상 요청과 실패 요청이 동시에 커넥션 풀을 잠식하는 재시도 폭풍(retry storm)으로 이어졌다. 배포는 방아쇠였을 뿐, 방아쇠를 당겨도 시스템이 버텨야 했던 지점에서 버티지 못한 것이 진짜 문제였다. AWS도 장애 요약 문서에서 유사 패턴을 "재시도 증폭"으로 분류해 별도 항목으로 다룬다. AWS Post-Event Summaries

재발을 막기 위해 무엇을 바꿨나?

재시도 로직에 지수 백오프와 지터를 적용하고, 커넥션 풀 앞단에 서킷 브레이커를 넣어 사용률이 임계치를 넘으면 신규 요청을 즉시 거절하도록 바꿨다. 커넥션 풀 사용률 알람 임계치도 100%가 아닌 70%로 낮춰 조기 경보가 가능하도록 조정했다. 인덱스 미적용 쿼리는 별도로 수정했지만, 이는 재발 방지의 핵심이 아니라 부수적 정리에 가까웠다.

이 구분은 다른 장애에도 그대로 적용되나?

그렇다. 2026년 기준으로도 통용되는 판단 기준은 "그 요인을 제거했을 때 재발이 멈추는가"이다. 멈추지 않는다면 그것은 유발 요인이고, 그 아래 회복탄력성 부재라는 근본 원인이 따로 있다. 이 원칙은 특정 스택이나 언어와 무관하게, 재시도·큐·캐시·락 등 자원 경합이 존재하는 모든 시스템에 동일하게 적용된다.

핵심 정리

  • 판단 기준: 요인을 제거했는데도 재발하면 그것은 유발 요인이지 근본 원인이 아니다.
  • 이번 사례에서 배포와 트래픽 급증은 기각됐고, 커넥션 풀 고갈은 표층 현상이었다.
  • 근본 원인은 재시도 로직의 백오프 부재로 인한 재시도 폭풍이었다.
  • 재발 방지: 지수 백오프·지터 적용, 서킷 브레이커 도입, 알람 임계치 하향.
  • 일반화 교훈: 사후분석은 "무엇이 방아쇠였나"와 "왜 시스템이 버티지 못했나"를 분리해서 물어야 한다.

더 알아보기

장애 사후분석: 타임라인·근본원인·재발 방지의 방법론 — 이 주제의 종합 가이드