API 호출 실패, 언제 재시도하고 언제 포기할까
실패했다고 다시 부르면, 더 나빠집니다 외부 API를 호출하는 코드를 짜다 보면 자연스럽게 이런 생각이 듭니다. "실패하면 몇 번 더 해보면 되겠지." 그래서 for 문으로 세 번 감싸고, 사이에 sleep 을 하나 넣습니다. 이게 위험합니다. 실패에는 다시 시도하면 성공하는 것과, 백 번을 해도 똑같은 것이 있습니다. 후자를 반복하면 응답 시간만 늘어나고, 최악의 경우 API 제공자로부터 호출량 제한에 걸립니다. 문제를 해결하려던 재시도가 새로운 문제를 만드는 셈입니다. 이 글은 블로그 자동 발행 서비스를 운영하면서 실제로 적용한 재시도 정책을 정리한 것입니다. Python과 httpx 를 예로 들지만, 원리는 어떤 언어에서든 같습니다. HTTP 상태코드의 의미를 어느 정도 알고 있다고 가정합니다. 상태코드별 처리표 결론부터 놓겠습니다. 제가 실제로 쓰고 있는 정책입니다. 상태코드 의미 처리 400 요청이 잘못됨 재시도하지 않음 401 인증 실패 토큰 갱신 후 1회만 재시도 403 권한 없음 재시도하지 않음 404 대상이 없음 재시도하지 않음 429 호출량 초과 Retry-After 확인 후 짧으면 대기, 길면 포기 5xx 서버 쪽 문제 지수 백오프 + 지터로 재시도 표를 관통하는 기준은 하나입니다. "내가 똑같이 다시 보내면, 결과가 달라질 여지가 있는가." 있으면 재시도하고, 없으면 즉시 포기합니다. 왜 이렇게 나눴나 400, 403, 404는 내 요청이 문제입니다. 필드 이름...