본문 바로가기

Spring

실패를 견디는 서비스 만들기: Spring Boot에서 Circuit Breaker 패턴 완벽 가이드

728x90
반응형

서비스 개발에서 마이크로서비스 아키텍처를 도입하면서 각 서비스 간의 통신이 많아지게 되었습니다. 이러한 환경에서는 특정 서비스의 장애나 지연이 전체 시스템에 영향을 미칠 수 있습니다. 이를 방지하기 위해 많이 사용되는 패턴 중 하나가 바로 Circuit Breaker 패턴입니다. 이번 블로그에서는 Circuit Breaker의 기본 개념을 설명하고, Spring Boot에서 이를 어떻게 구현할 수 있는지 간단한 예제를 통해 알아보겠습니다.

Circuit Breaker 패턴이란?

Circuit Breaker 패턴은 전기 회로의 차단기에서 착안한 소프트웨어 디자인 패턴입니다. 외부 서비스나 함수 호출이 실패하거나 지연될 때, 시스템 전체에 악영향을 미치지 않도록 보호하는 역할을 합니다. 간단히 말해, 서비스 호출이 일정 횟수 이상 실패하면, 일정 기간 동안 추가 호출을 차단(열림 상태)하여 시스템의 안정성을 높이는 것입니다.

Circuit Breaker는 일반적으로 다음과 같은 세 가지 상태를 가집니다:

  1. Closed (닫힘): 정상 상태로, 모든 요청이 외부 서비스로 전달됩니다.
  2. Open (열림): 요청이 실패 횟수를 초과한 상태로, 외부 서비스로의 요청을 차단합니다.
  3. Half-Open (반열림): 일정 시간이 지난 후, 일부 요청을 보내어 외부 서비스가 회복되었는지 확인합니다. 회복되었다면 Closed 상태로 돌아가고, 그렇지 않다면 다시 Open 상태로 유지됩니다.
반응형

Spring Boot에서 Circuit Breaker 구현하기

Spring Boot에서는 Resilience4j 라이브러리를 사용하여 Circuit Breaker 패턴을 쉽게 적용할 수 있습니다. 아래는 Resilience4j를 사용하여 Circuit Breaker를 적용하는 간단한 예제입니다.

1. 프로젝트 설정

먼저, build.gradle 또는 pom.xml 파일에 Resilience4j 의존성을 추가합니다.

implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.1'
implementation 'io.github.resilience4j:resilience4j-circuitbreaker:1.7.1'

2. Circuit Breaker 적용하기

다음으로, 서비스 메서드에 Circuit Breaker를 적용해보겠습니다. 예를 들어, 외부 API를 호출하는 서비스 메서드가 있다고 가정하겠습니다.

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ExternalApiService {

    private final RestTemplate restTemplate;

    public ExternalApiService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "externalApiCircuitBreaker", fallbackMethod = "fallbackResponse")
    public String callExternalApi() {
        return restTemplate.getForObject("https://api.example.com/data", String.class);
    }

    public String fallbackResponse(Exception ex) {
        return "기본 응답 값";
    }
}

위 코드에서 @CircuitBreaker 애노테이션을 사용하여 Circuit Breaker를 적용했습니다. name 속성은 Circuit Breaker의 이름을 지정하며, fallbackMethod는 Circuit Breaker가 열림 상태가 되었을 때 호출될 대체 메서드를 지정합니다.

3. Circuit Breaker 설정

마지막으로 application.yml 파일을 통해 Circuit Breaker의 설정을 정의할 수 있습니다.

resilience4j:
  circuitbreaker:
    configs:
      default:
        registerHealthIndicator: true
        slidingWindowSize: 5
        failureRateThreshold: 50
        waitDurationInOpenState: 10000
        permittedNumberOfCallsInHalfOpenState: 3
        minimumNumberOfCalls: 5
    instances:
      externalApiCircuitBreaker:
        baseConfig: default

여기서 설정한 내용은 다음과 같습니다:

  • slidingWindowSize: Circuit Breaker가 열리기 전의 슬라이딩 윈도우 크기 (여기서는 5번의 호출).
  • failureRateThreshold: 실패율 임계값 (여기서는 50%).
  • waitDurationInOpenState: Circuit Breaker가 열린 상태에서 닫힌 상태로 돌아가기 전까지 대기하는 시간 (여기서는 10초).
  • permittedNumberOfCallsInHalfOpenState: 반열림 상태에서 허용되는 호출 수.
728x90

Circuit Breaker 패턴은 시스템의 복원력을 높이고, 장애 전파를 방지하기 위해 필수적인 디자인 패턴입니다. Spring Boot에서는 Resilience4j 라이브러리를 사용하여 간단하게 이 패턴을 구현할 수 있습니다. 이번 블로그에서는 Circuit Breaker의 기본 개념과 함께 간단한 예제를 통해 Spring Boot에서 이를 적용하는 방법을 살펴보았습니다. 이 패턴을 적절히 활용하여 보다 안정적인 시스템을 설계해 보시기 바랍니다.

728x90
반응형