🛠️ 처음부터 만드는 Retry — 실패한 작업을 자동으로 재시도하기
API 호출이 간헐적으로 실패하거나 네트워크가 불안정할 때, Retry 패턴이 필요합니다. 실패한 작업을 자동으로 재시도하되, 서버에 부담을 주지 않도록 대기 시간을 늘려가며 시도합니다.
```typescript
const retryWithBackoff = async (fn, maxAttempts = 3, baseDelay = 1000) => {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxAttempts) throw error;
const delay = baseDelay * Math.pow(2, attempt - 1);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
};
```
재시도할 때마다 대기 시간을 2배씩 늘립니다. 첫 시도는 즉시, 2번째는 1초, 3번째는 2초, 4번째는 4초 대기하는 식입니다.
```typescript
// API 호출 (최대 5회, 500ms부터 시작)
const fetchWithRetry = () => retryWithBackoff(
() => fetch('https://api.example.com/data'),
5,
500
);
// 데이터베이스 쿼리 (최대 3회, 1초부터 시작)
const queryWithRetry = () => retryWithBackoff(
() => db.query('SELECT * FROM users'),
3,
1000
);
try {
const data = await fetchWithRetry();
} catch (error) {
console.error('5회 재시도 후에도 실패:', error);
}
```
✅ 지수 백오프: 재시도마다 대기 시간을 2배씩 증가 → 서버 과부하 방지
✅ 에러 투명성: 모든 재시도 실패 시 원본 에러를 그대로 던짐
✅ 비동기 안전: Promise로 대기하므로 다른 작업을 블로킹하지 않음
더 나아가서 특정 HTTP 상태 코드(429, 503 등)만 재시도하거나, 최대 지연 시간을 제한하는 식으로 확장할 수 있습니다.
지수 백오프 구현 (8줄)
```typescript
const retryWithBackoff = async (fn, maxAttempts = 3, baseDelay = 1000) => {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxAttempts) throw error;
const delay = baseDelay * Math.pow(2, attempt - 1);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
};
```
재시도할 때마다 대기 시간을 2배씩 늘립니다. 첫 시도는 즉시, 2번째는 1초, 3번째는 2초, 4번째는 4초 대기하는 식입니다.
실전 예제
```typescript
// API 호출 (최대 5회, 500ms부터 시작)
const fetchWithRetry = () => retryWithBackoff(
() => fetch('https://api.example.com/data'),
5,
500
);
// 데이터베이스 쿼리 (최대 3회, 1초부터 시작)
const queryWithRetry = () => retryWithBackoff(
() => db.query('SELECT * FROM users'),
3,
1000
);
try {
const data = await fetchWithRetry();
} catch (error) {
console.error('5회 재시도 후에도 실패:', error);
}
```
핵심 포인트
✅ 지수 백오프: 재시도마다 대기 시간을 2배씩 증가 → 서버 과부하 방지
✅ 에러 투명성: 모든 재시도 실패 시 원본 에러를 그대로 던짐
✅ 비동기 안전: Promise로 대기하므로 다른 작업을 블로킹하지 않음
더 나아가서 특정 HTTP 상태 코드(429, 503 등)만 재시도하거나, 최대 지연 시간을 제한하는 식으로 확장할 수 있습니다.
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!