재시도 예시 코드
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 발생 시 즉시 무한 재시도를 하면 더 빠르게 차단됩니다. 반드시 대기 시간과 최대 시도 횟수를 두세요.