Spring Boot에서 Resilience4j와 Circuit Breaker에 대한 최소 가이드

발행: (2025년 12월 31일 오전 03:25 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

Cover image for Minimal Guide to Resilience4j and Circuit Breaker in Spring Boot

회로 차단기(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는 견고한 마이크로서비스를 구축하기 위한 강력한 도구입니다. 회로 차단기 패턴을 구현함으로써, 애플리케이션이 압박 상황에서도 완전히 충돌하지 않고 우아하게 실패하도록 할 수 있습니다.

Back to Blog

관련 글

더 보기 »

Spring Cloud Gateway: 기본 예제

Spring Cloud Gateway: Basic Example에 대한 표지 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fd...

분리를 분리하자

소개 2025년 말 며칠 동안, 우리 팀 리더는 하루를 추가로 쉬면서 중요한 회의를 놓쳤습니다. 최근 구조조정 이후, 한 동료가 떠났습니다.