Choorai
API 호출량 제한 이슈

429 Rate Limit 에러 해결하기

HTTP 429 Too Many Requests는 요청 빈도가 정책 한도를 초과했을 때 발생합니다.

TL;DR (핵심 요약)

1) 중복 요청/폴링 주기 축소 2) Retry-After 기반 재시도 적용 3) 지수 백오프 + jitter 적용

주의코드: 429

429 Too Many Requests

원인

클라이언트가 짧은 시간에 과도한 요청을 보내 서버의 rate limit 규칙을 초과했습니다.

해결책
  1. 요청 빈도 낮추기 (debounce/throttle)
  2. Retry-After 헤더 확인 후 재시도
  3. 지수 백오프 적용
  4. 필요 시 서버 rate limit 정책 조정

재시도 예시 코드

retry.ts
async function fetchWithBackoff(url: string, attempts = 5) {
  let delay = 500;

  for (let i = 0; i < attempts; i++) {
    const res = await fetch(url);

    if (res.status !== 429) {
      return res;
    }

    const retryAfter = Number(res.headers.get('Retry-After'));
    const waitMs = Number.isFinite(retryAfter) && retryAfter > 0
      ? retryAfter * 1000
      : delay + Math.floor(Math.random() * 200);

    await new Promise((resolve) => setTimeout(resolve, waitMs));
    delay *= 2;
  }

  throw new Error('Rate limit exceeded after retries');
}

요청량 줄이는 방법

  • 검색 입력은 debounce 300~500ms 적용
  • 페이지 전환 시 중복 API 요청 취소(AbortController)
  • 동일 데이터는 캐시 사용 (TanStack Query 등)

주의

429 발생 시 즉시 무한 재시도를 하면 더 빠르게 차단됩니다. 반드시 대기 시간과 최대 시도 횟수를 두세요.

Prerequisites

  • 429 응답이 발생하는 엔드포인트와 호출 빈도를 파악할 수 있어야 합니다.
  • 서버 또는 WAF의 rate limit 정책을 확인할 수 있어야 합니다.
  • 재시도(backoff) 로직 적용이 가능한 클라이언트 코드에 접근할 수 있어야 합니다.

Validation

  1. 429 발생 시 Retry-After 값을 존중해 재시도합니다.
  2. 정상 호출 구간에서 2xx 응답 비율이 회복됩니다.
  3. 동일 사용자/토큰 기준으로 과도한 중복 요청이 감소합니다.

Troubleshooting

  • 폴링 간격을 늘리거나 debounce/throttle로 요청량을 줄이세요.
  • 백엔드 키 기반 한도와 프런트 병렬 요청 개수를 함께 점검하세요.
  • 재시도 폭주를 막기 위해 지수 백오프 + jitter를 적용하세요.

References

관련 문서

마지막 업데이트: 2026년 2월 22일 · 버전: v0.0.1

피드백 보내기

입력한 내용으로 새 이슈 페이지를 엽니다.

GitHub 이슈로 보내기