SpringBoot

통신 중 실패했을 때 재시도하기 (@Retryable, @Recover)

pepega 2021. 12. 22. 10:16

@retryable, @recover, retryTemplate, execute method를 활용했다.

 

위 내용의 예시로

 

Redis 통신이 실패했을 때(끊어졌을 때) @Retryable, @Recover를 활용

혹은

method가 실패했을 때 retryTemplate.execute 메서드 활용

 

일정 횟수 재시도 하여 결과를 반환하는 방식을 사용할 것이다.

 

Amazon ElastiCache for Redis면

Redis 통신이 실패할 일이 없겠지만

 

직접 구축한 Redis라면 언제나 통신이 실패할 일을 염두해 두어야 한다.

 

그래서 위 같은 로직을 만들었다.

 

흐름은 아래와 같다.

 

@SpringBootApplication
@EnableRetry
public class SampleTokenApplication {
  public static void main(String[] args) {
    SpringApplication.run(ApiApplication.class, args);
  }
}

@Retryable, @Recover를 활용하기 위해서는

main method에 @EnableRetry annotation을 추가해주어야 한다.

 

public class SampleTokenRepositoryImpl implements SampleTokenRepositoryCustom {
  
  @Retryable(maxAttempts = 3) // maxAttempts default is 3
  @Cacheable(value = "sampleToken")
  @Override
  public Token findByTokenId() {
    // 원하는 쿼리 추가
  }
  
  @Recover
  public Token findByTokenIdRecover() {
    // 원하는 쿼리 추가
  }
}

@Retryable 메서드를 3번 시도 후 실패할 경우 @Recover 메서드를 실행하게된다.

 

https://www.baeldung.com/spring-retry