재시도 정책 구현 (React Native 및 그 외)
Source: Dev.to
What is a Retry Policy?
재시도 정책은 애플리케이션이 실패한 요청을 즉시 사용자에게 오류로 표시하는 대신 자동으로 다시 시도하도록 하는 전략입니다.
사용자 입장에서는 모든 것이 원활하게 동작합니다:
“요청을 보냈다 → 로더가 보였다 → 결과를 받았다.”
그 뒤에서는 앱이 해당 요청을 여러 번 재시도한 뒤 결국 성공했을 수 있습니다.
Why Does This Matter?
네트워크 호출은 항상 신뢰할 수 없습니다. 일시적인 서버 문제(5xx 오류), 네트워크 불안정(타임아웃, 연결 불량), 레이트 리밋, 기타 일시적인 오류 때문에 실패가 발생할 수 있습니다.
즉시 오류를 표시하면 사용자는 직접 다시 시도하거나 흐름을 처음부터 다시 시작해야 하며, 앱에 대한 신뢰를 잃을 수도 있습니다.
재시도 정책은 이러한 일시적인 문제들을 완화하고 전반적인 사용자 경험을 향상시킵니다. 백엔드 서비스, 클라우드 시스템, 분산 시스템, 메시지 큐 등에서 널리 사용되는 보편적인 복원력 패턴입니다. 올바르게 구현하면 사용자는 문제가 발생했다는 사실조차 알지 못하게 됩니다—이것이 목표입니다.
Implementation
// Helper to pause execution
const wait = (ms: number) =>
new Promise((resolve) => setTimeout(resolve, ms));
type RetryOptions = {
retries: number;
delay: number;
factor?: number; // exponential multiplier
};
async function retryRequest(
fn: () => Promise<any>,
{ retries, delay, factor = 2 }: RetryOptions
): Promise<any> {
let attempt = 0;
while (attempt < retries) {
try {
// Try the request; if it succeeds, return the result
return await fn();
} catch (error: any) {
attempt++;
// If we've exhausted retries, re‑throw the error
if (attempt >= retries) throw error;
// Calculate exponential back‑off delay
const backoff = delay * Math.pow(factor, attempt - 1);
await wait(backoff);
}
}
}
// Example request function
const fetchUser = async () => {
const response = await fetch("https://api.example.com/user");
if (!response.ok) {
const err: any = new Error("Request failed");
err.response = { status: response.status };
throw err;
}
return response.json();
};
// Wrapper that applies the retry policy
const getUserWithRetry = async () => {
try {
const data = await retryRequest(fetchUser, {
retries: 3,
delay: 1000, // initial delay in ms
});
console.log("Success:", data);
} catch (error) {
console.log("Final failure:", error);
}
};
필요한 곳에서 getUserWithRetry()를 호출하세요. 요청이 일시적인 문제로 실패하면 재시도 정책이 자동으로 작동하여 백그라운드에서 다시 시도합니다.
In Conclusion
재시도 정책은 신뢰성을 높이고 사용자 불만을 줄이며 일시적인 실패를 우아하게 처리하는 간단하지만 강력한 방법입니다. 작은 추가만으로도 애플리케이션을 훨씬 더 안정적이고 프로덕션에 준비된 느낌으로 만들 수 있습니다.