Spring Boot에서 Resilience4j와 Circuit Breaker에 대한 최소 가이드
Source: Dev.to

회로 차단기(Circuit Breaker)란?
회로 차단기 패턴은 집 안의 전기 차단기와 비슷하게 동작합니다. 실패를 감지하면 회로를 열어(Open) 더 이상의 손상을 방지하고, 문제가 해결되면 다시 닫습니다(Close).
회로 차단기에는 세 가지 주요 상태가 있습니다:
- Closed(닫힘): 모든 것이 정상적으로 동작합니다. 요청이 정상적으로 흐릅니다.
- Open(열림): 실패가 허용된 임계값을 초과했습니다. 요청이 차단되고 폴백(fallback)이 실행됩니다.
- Half‑Open(반열림): 서비스가 복구되었는지 확인하기 위해 제한된 수의 요청만 허용되는 시험 기간입니다.
Resilience4j 설정
먼저 Spring Boot 프로젝트를 생성하고 다음 의존성을 추가합니다:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
application.yml에 회로 차단기의 동작을 제어할 파라미터들을 정의합니다:
resilience4j:
circuitbreaker:
instances:
mainService:
registerHealthIndicator: true
slidingWindowSize: 10
permittedNumberOfCallsInHalfOpenState: 3
slidingWindowType: COUNT_BASED
minimumNumberOfCalls: 5
waitDurationInOpenState: 10s
failureRateThreshold: 50
eventConsumerBufferSize: 10
파라미터 설명
- slidingWindowSize: 회로가 닫힌 상태에서 기록할 호출 수.
- failureRateThreshold: 회로를 열어야 하는 실패 비율(예: 50%).
- waitDurationInOpenState: 회로가 열림(Open) 상태를 유지한 뒤 복구를 시도하기까지의 시간.
- permittedNumberOfCallsInHalfOpenState: 반열림(Half‑Open) 상태에서 회로를 다시 닫기 위해 필요한 성공 호출 수.
어노테이션을 활용한 구현
Resilience4j를 가장 쉽게 사용하는 방법은 @CircuitBreaker 어노테이션을 적용하는 것입니다. YAML에 설정한 인스턴스 이름과 폴백 메서드를 지정합니다.
Note: 폴백 메서드는 원본 메서드와 동일한 시그니처를 가져야 하며,
Throwable(또는Exception)을 인자로 받아야 합니다.
@Service
public class ProductService {
@CircuitBreaker(name = "mainService", fallbackMethod = "fallbackGetProducts")
public List<Product> getProducts() {
// 실패할 수 있는 로직(예: 외부 API 호출)
return externalApi.fetchProducts();
}
// 폴백 메서드
public List<Product> fallbackGetProducts(Throwable e) {
return List.of(new Product("Default Product", 0.0));
}
}
기타 Resilience4j 모듈
회로 차단기가 가장 널리 알려져 있지만, Resilience4j는 안정성을 높이는 추가 도구들을 제공합니다:
- TimeLimiter – 요청에 대한 최대 실행 시간을 설정합니다; 초과하면 실패로 처리됩니다.
- Retry – 실패한 작업을 설정된 횟수만큼 자동으로 재시도합니다.
- Bulkhead – 서비스에 대한 동시 호출 수를 제한해 자원(예: 스레드 풀)의 포화 상태를 방지합니다.
결론
Resilience4j는 견고한 마이크로서비스를 구축하기 위한 강력한 도구입니다. 회로 차단기 패턴을 구현함으로써, 애플리케이션이 압박 상황에서도 완전히 충돌하지 않고 우아하게 실패하도록 할 수 있습니다.