본문 바로가기
코딩일기/날씨앱 만들기 프로젝트

[Spring Boot] Retry와 Recover 설명 및 사용법

by 욱파이어니어 2022. 1. 25.
728x90
반응형

Spring boot에서 특정 작업을 다시한번 시도해야 할때가 있다.

나같은 경우는 API 호출에 에러가 발생했을때 다시 API를 호출해야해서 Retry와 Recover를 사용하였다.

 

 

Retry와 같은 경우는 말 그대로 특정 조건에 따라서 다시 반복하는것이고 Recover는 Retry를 다 시도했음에도

안되는것들에 대해서 시도하는 로직을 구성하는 부분이다.

 

그럼 이제 Retry와 Recover의 사용법에 대해서 알아보자.

 

일단은 pom.xml에 dependency를 추가해줘야 한다.

 

		<!-- spring - retry 사용을 위한 dependency -->
		<dependency>
		    <groupId>org.springframework.retry</groupId>
		    <artifactId>spring-retry</artifactId>
		    <version>1.2.4.RELEASE</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-aspects</artifactId>
		    <version>5.3.13</version>
		</dependency>

 

이렇게 추가를 해줬다면  

 

springBootApplication 혹은 Configuration에 @EnableRetry를 붙여 기능을 활성화한다.

 

@EnableScheduling
@EnableRetry //여기
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SpringApplication.run(Application.class, args);
	}
	
    @PostConstruct
    public void started(){
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
    }
}

 

그리고 이제 Retry하고 싶은 메소드에 아래와 같이 어노테이션을 붙여준다.

 

	
	@Retryable(value = {ApiCallError.class},maxAttempts = 3, backoff= @Backoff(delay = 900000))
	@Scheduled(cron="0 30 1 * * *", zone = "Asia/Seoul")
	public void callAPi() throws InterruptedException, ApiCallError {}

 

안에 들어가는 값들에 대해 살펴보자면

 

value : {}안에 들어있는 예외 발생시 retry 실행

maxAttempts : 최대로 반복할 횟수 (default는 3)

backOff() : 몇초를 간격으로 retry를 할지

 

 

그럼 이제 Retry를 통해서 재시도를 만들었지만 이것조차안될때 실행하는 Recover를 만들자.

 

 

	@Recover
	public void recoverApi(ApiCallError error){
		logger.error("API connection failed no more retry");
    	String emailMessage = "API connection failed please check your code";
    	ms.sendErrorMail(emailMessage);
	}

 

위소스가 Recover의 예시인대 여기서 제일 중요할점은 error catch하는것을 제외하고는 매개변수가 같아야하고 반환값도 같아야 한다.

 

나 같은 경우는 위에 callAPI()가 매개변수가 없었기때문에 Recover도 매개변수가 에러유형빼고는

매개변수가 없는것으로 같다.

 

 

반응형