🛠️ 처음부터 만드는 Retry — 실패한 작업을 자동으로 재시도하기
들어가며
네트워크 요청이 실패했을 때, 몇 번 다시 시도하면 성공하는 경우가 많습니다. 이런 패턴을 자동화하는 것이 Retry 함수입니다.
기본 구현
```javascript
async function retry(fn, maxAttempts = 3, delay = 1000) {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxAttempts) throw error;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
// 사용 예
const data = await retry(
() => fetch('/api/data').then(r => r.json()),
3, // 최대 3회 시도
1000 // 1초 대기
);
```
Exponential Backoff
시간이 지날수록 대기 시간을 늘리면 서버 부하를 줄일 수 있습니다:
```javascript
async function retryWithBackoff(fn, maxAttempts = 3) {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxAttempts) throw error;
const delay = Math.pow(2, attempt - 1) * 1000; // 1초, 2초, 4초
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
```
주의사항
멱등성 필수: GET, DELETE 같은 안전한 작업만 재시도하세요. POST는 중복 요청으로 문제가 될 수 있습니다.
선택적 재시도: 네트워크 에러(timeout, 500)는 재시도하되, 404나 401 인증 실패는 재시도하지 마세요.
참고: [MDN Promise 패턴](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!