728x90
📘 Chapter 2.7: 예외처리 전략 – Retry, Fallback, Polly 패턴
✅ 이 챕터에서 확실히 정리할 것
- 기본 예외 처리 구조
- Retry 전략이란?
- Fallback 전략이란?
- Polly란 무엇인가?
- Polly 실전 사용법 (재시도, 대체 처리, 서킷 브레이커)
- 실무에서 Polly 어떻게 쓰는지 패턴까지 정리
1️⃣ 예외 처리 기본기
✅ try-catch 기본 구조
try
{
// 실패할 수 있는 작업
CallExternalService();
}
catch (Exception ex)
{
Console.WriteLine($"에러 발생: {ex.Message}");
}
🧠 대부분 초보자들이 여기까지만 배운다.
근데 실무는 이걸로는 택도 없다!!
- API가 한 번 실패했다고 그냥 끝내면 안 되지
- 재시도 해봐야지
- 그래도 안 되면 대체 경로 써야지
→ 그래서 등장하는 게…
2️⃣ Retry 전략이란?
실패했을 때 다시 시도해보는 전략이다.
예를 들어:
- 외부 API 요청
- 네트워크 오류로 실패
- 잠깐 문제가 있었을 수 있음
- 1~3번 정도 재시도 해보면 성공할 수도 있음
✅ Retry는 아주 기본적인 복구 전략이다!
❌ 나쁜 예제 (retry 직접 구현)
int retryCount = 3;
for (int i = 0; i < retryCount; i++)
{
try
{
CallApi();
break;
}
catch
{
Thread.Sleep(1000);
}
}
✔ 동작은 하긴 하는데… 이거 관리하기 개노답이다
→ 그래서 나온 게 Polly!
3️⃣ Polly란?
✅ Polly는 .NET용 재시도/예외처리/복구 패턴을 위한 라이브러리다!
Polly는 실무에서 API 호출, DB 연결 등 불안정한 작업을
재시도, 대체 처리, 제한 등 다양한 방식으로 안정화시켜준다.
📦 NuGet 설치
dotnet add package Polly
4️⃣ Polly 기본 사용 예제 – Retry
using Polly;
var retryPolicy = Policy
.Handle<Exception>()
.Retry(3); // 최대 3회 재시도
retryPolicy.Execute(() =>
{
Console.WriteLine("외부 API 호출 시도!");
CallExternalService(); // 실패할 수도 있음
});
✅ CallExternalService()가 실패하면 자동으로 최대 3번까지 재시도함!
🔁 Retry + 대기 시간 추가 (Wait and Retry)
var retryPolicy = Policy
.Handle<Exception>()
.WaitAndRetry(3, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 2초, 4초, 8초
retryPolicy.Execute(() =>
{
Console.WriteLine("재시도 중...");
CallSomething();
});
📌 이렇게 하면 점점 더 길게 기다리면서 재시도
→ 서버에 부담 덜고 회복 시간 확보 가능!
5️⃣ Fallback 전략이란?
작업이 실패했을 때, 예비 처리 로직으로 넘기는 전략이다.
예: 외부 날씨 API가 터졌다 → "날씨 정보 없음" 이라도 알려줘야지!
var fallbackPolicy = Policy<string>
.Handle<Exception>()
.Fallback(() => "기본 날씨 정보");
string result = fallbackPolicy.Execute(() =>
{
return GetWeatherFromExternalApi();
});
- ✅ API가 실패하더라도
- ✅ 사용자에겐 우아하게 기본값을 제공할 수 있다!
6️⃣ Polly 조합 가능! (Policy Wrap)
var retry = Policy
.Handle<Exception>()
.Retry(3);
var fallback = Policy
.Handle<Exception>()
.Fallback(() => Console.WriteLine("대체 처리 실행!"));
var policyWrap = Policy.Wrap(fallback, retry);
policyWrap.Execute(() =>
{
CallApiThatMightFail();
});
✅ 이러면:
- 실패 → 최대 3회 재시도
- 그래도 실패하면 → fallback 실행
7️⃣ Polly 고급: Circuit Breaker
일정 횟수 이상 연속 실패하면 "더 이상 시도하지 않고 잠시 꺼버리는" 기능
var circuitBreaker = Policy
.Handle<Exception>()
.CircuitBreaker(2, TimeSpan.FromSeconds(10));
try
{
circuitBreaker.Execute(() => CallUnstableService());
}
catch (BrokenCircuitException)
{
Console.WriteLine("서킷 오픈됨! 10초 동안 호출 금지!");
}
✅ 실무에서 서버가 뻗을 때 더 이상 쓸데없이 API 때리지 말고 잠시 멈추는 전략!
✅ 정리 요약
전략 | 설명 |
---|---|
Retry | 실패하면 다시 시도함 |
WaitAndRetry | 재시도 전에 일정 시간 대기 |
Fallback | 실패 시 대체 처리 실행 |
Circuit Breaker | 연속 실패 시 잠시 중단 |
Policy.Wrap | 여러 정책 조합 가능 |
🔥 실무 팁
상황 | 추천 패턴 |
---|---|
API 호출 | Retry + Wait + Fallback |
DB 연결 재시도 | Retry(3) + Circuit Breaker |
사용자에게 메시지 제공 | Fallback 활용 |
비즈니스 연속성 보장 | Fallback or Cached Response |
📢 다음 챕터 예고 🎓
다음 챕터 | 주제 |
---|---|
Chapter 2.8 | 테스트 코드 작성 기초 – MSTest, xUnit 사용법 |
728x90