🛠️ 처음부터 만드는 Retry — 실패한 작업을 자동으로 재시도하기
# 처음부터 만드는 Retry
네트워크 요청이나 불안정한 작업은 가끔 실패합니다. 그럴 때 자동으로 재시도하는 함수가 있으면 유용하죠.
```javascript
async function retry(fn, options = {}) {
const { maxAttempts = 3, delay = 1000, backoff = 2 } = options;
let lastError;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (attempt < maxAttempts) {
// 지수 백오프: 첫 재시도 1초, 2초, 4초...
const waitTime = delay * Math.pow(backoff, attempt - 1);
await new Promise(resolve => setTimeout(resolve, waitTime));
}
}
}
throw lastError;
}
```
```javascript
// API 호출 재시도
const data = await retry(
() => fetch('/api/data').then(r => r.json()),
{ maxAttempts: 5, delay: 500 }
);
// 데이터베이스 연결 재시도
await retry(
() => connectDatabase(),
{ maxAttempts: 3, delay: 2000 }
);
```
```javascript
async function retryIf(fn, shouldRetry, options = {}) {
const { maxAttempts = 3, delay = 1000 } = options;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxAttempts || !shouldRetry(error)) {
throw error;
}
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
// 500 에러만 재시도, 400은 즉시 실패
await retryIf(
() => fetch('/api/data').then(r => r.json()),
(error) => error.status >= 500,
{ maxAttempts: 3 }
);
```
지수 백오프: 대기 시간을 점진적으로 증가시켜 서버 부담 완화
선택적 재시도: 모든 에러가 재시도 대상은 아님 (4xx vs 5xx)
최대 시도 횟수: 무한 루프 방지 필수
참고: [Node.js 공식 문서 — Promise](https://nodejs.org/api/promises.html)
네트워크 요청이나 불안정한 작업은 가끔 실패합니다. 그럴 때 자동으로 재시도하는 함수가 있으면 유용하죠.
기본 구현
```javascript
async function retry(fn, options = {}) {
const { maxAttempts = 3, delay = 1000, backoff = 2 } = options;
let lastError;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (attempt < maxAttempts) {
// 지수 백오프: 첫 재시도 1초, 2초, 4초...
const waitTime = delay * Math.pow(backoff, attempt - 1);
await new Promise(resolve => setTimeout(resolve, waitTime));
}
}
}
throw lastError;
}
```
실제 사용 예제
```javascript
// API 호출 재시도
const data = await retry(
() => fetch('/api/data').then(r => r.json()),
{ maxAttempts: 5, delay: 500 }
);
// 데이터베이스 연결 재시도
await retry(
() => connectDatabase(),
{ maxAttempts: 3, delay: 2000 }
);
```
고급: 선택적 재시도
```javascript
async function retryIf(fn, shouldRetry, options = {}) {
const { maxAttempts = 3, delay = 1000 } = options;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxAttempts || !shouldRetry(error)) {
throw error;
}
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
// 500 에러만 재시도, 400은 즉시 실패
await retryIf(
() => fetch('/api/data').then(r => r.json()),
(error) => error.status >= 500,
{ maxAttempts: 3 }
);
```
💡 핵심 포인트
참고: [Node.js 공식 문서 — Promise](https://nodejs.org/api/promises.html)
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!