폴백 패턴(Fallback Pattern)은 주요 서비스 실패 시 대안 응답이나 동작을 제공하는 탄력성 패턴이다. 서킷 브레이커와 함께 사용해 서비스 저하 운영(graceful degradation)을 구현한다.
폴백 전략
1. 캐시된 데이터 반환
최신 데이터 없이 이전 캐시 사용
2. 기본값 반환
개인화 실패 → 공통 추천 목록
3. 정적 응답
DB 조회 실패 → 하드코딩된 응답
4. 대체 서비스 호출
주 API 실패 → 백업 API 호출
5. 기능 비활성화
결제 실패 → 배송 조회만 유지
Resilience4j + 폴백
java
CircuitBreakerConfig cbConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofSeconds(30))
.build();
CircuitBreaker cb = CircuitBreaker.of("recommendation", cbConfig);
// 폴백과 결합
public List<Product> getRecommendations(String userId) {
return Try.ofSupplier(
CircuitBreaker.decorateSupplier(cb,
() -> recommendationService.get(userId))
).recover(throwable -> getDefaultRecommendations())
.get();
}
private List<Product> getDefaultRecommendations() {
// 캐시에서 또는 인기 상품 반환
return cache.getTopProducts(10);
}
Spring Retry 폴백
java
@Service
public class WeatherService {
@Retryable(
value = { RestClientException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public Weather getCurrentWeather(String city) {
return weatherApi.fetch(city);
}
@Recover
public Weather fallbackWeather(RestClientException e, String city) {
log.warn("Weather API unavailable for {}, using cached", city);
return weatherCache.get(city)
.orElse(Weather.unknown());
}
}
저하 운영(Graceful Degradation) 설계
핵심 기능 vs 부가 기능 분류:
핵심 (항상 동작):
- 상품 목록 표시
- 장바구니 추가
- 주문 완료
부가 (실패 시 비활성):
- 개인화 추천 → 인기 상품으로 대체
- 실시간 재고 → 캐시 재고로 대체
- 리뷰 점수 → 숨김 처리
관련 개념