C#

C# 기초부터 고급까지 Chapter 2.7. 예외처리 전략 – Retry, Fallback, Polly 패턴

Juan_ 2025. 5. 1. 19:25
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