์ธ๋ถ ์์คํ ๊ณผ ํต์ ํ ๋, ๊ฐํ์ ์ผ๋ก ์ฅ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
ํ ๋ฒ ์คํจํ๋ค๊ณ ๋ฐ๋ก ์๋ฌ๋ฅผ ๋ฐํํด๋ฒ๋ฆฌ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฌผ๋ก ์์คํ ์ ๋ขฐ์ฑ์๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ฐ...ใ ใ
์ด๋ฐ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํ ์๋ ์ฌ์๋(Retry) ๊ธฐ๋ฅ, spring-retry๋ฅผ ์์๋ณด์!
: ํน์ ์์ ์ด ์คํจํ์ ๋ ์๋์ผ๋ก ์ ํด์ง ํ์๋งํผ ์ฌ์๋ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Spring ๊ธฐ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ธ๋ถ API ์ผ์์ ์ค๋ฅ๊ฐ ์๊ฒผ์ ๋ (์๋ฒ๊ฐ ์ผ์์ ์ผ๋ก ์ฃฝ์๊ฑฐ๋ ํ์์์ ๋ฐ์ ์)
DB/Redis ์ฐ๊ฒฐ ๋๊น (๋คํธ์ํฌ ๋ฌธ์ ๋ก ์ ์์ด ์ ๋๋ ๊ฒฝ์ฐ)
๊ฒฐ์ , ์ธ์ฆ ์๋น์ค ํธ์ถ (์ธ๋ถ ์ฐ๋ ์คํจ ์ ๋ณต๊ตฌ ์๋)
์์ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๊ฒผ์ ๋, Spring Retry๋ฅผ ์ฐ๋ฉด
- ์ผ์์ ์ธ ์ค๋ฅ ๋ณต๊ตฌ: ์ฌ์๋๋ก ํ ๋ฒ์ ์คํจ๋ฅผ ๊ทน๋ณต
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์: ์ฆ์ ์คํจ ๋์ ์ฌ์๋ ํ ์ฑ๊ณต ๊ฐ๋ฅ
- ๋น์ฆ๋์ค ๋ก์ง ๋จ์ํ: ๋ณต์กํ ์์ธ/์ฌ์๋ ๋ก์ง์ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ฒ๋ฆฌ
- Fallback ์ฒ๋ฆฌ ์ง์: ๋ชจ๋ ์ฌ์๋ ์คํจ ์ ๋์ฒด ๋ก์ง ์คํ ๊ฐ๋ฅ
์ด๋ฌํ ์ฅ์ ์ด ์๊ธด๋ค!
implementation 'org.springframework.retry:spring-retry'
implementation 'org.springframework.boot:spring-boot-starter-aop'
spring retry๋ AOP๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์์กด์ฑ๋ ์ถ๊ฐํด์ฃผ์ด์ผํ๋ค.
๋ํ ๋ฐ๋์!! ๋ฉ์ธ ์คํ๋๋ ํด๋์ค์
@EnableRetry๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผํ๋ค
@SpringBootApplication
@EnableRetry
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
๋ ๋ช ๋ฒ๊น์ง ์คํจํด๋ ๋ผ? ๋ฅผ @Retryable๋ก ์ค์ ํ๊ณ
๋ง์ฝ ๋ค ์คํจํ์๋ ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ์ ์ ๊ณตํด์ฃผ๊ณ ์ถ์ผ๋ฉด ์ง๊ฟ์ผ๋ก @Recover๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ์ ์ฉํด๋ณด์
@Service
public class ExternalApiService {
@Retryable(
value = { RuntimeException.class },//๋ค๋ฅธ ์๋ฌ๋ก ์ค์ ํด๋ ๋จ
maxAttempts = 3, //3๋ฒ๊น์ง๋ ์คํจํด๋ ๋ด์ค ใ
backoff = @Backoff(delay = 2000) //์ฌ์๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ(2์ด)
)
public String callApi() {
System.out.println("API ํธ์ถ ์๋...");
throw new RuntimeException("์ธ๋ถ API ์ค๋ฅ");
}
์๋ ๊ฒํ๋ฉด 3๋ฒ๊น์ง๋ ๋ด์ฃผ๋ค๊ฐ ๊ทธ๊ฒ ๋์ด๊ฐ๋ฉด ์๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
๊ทผ๋ฐ ์ด๋ ๊ฒ ์๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค ์ฌ์ฉ์์๊ฒ ์ด๋ค ํผ๋๋ฐฑ์ ๋ณด์ฌ์ฃผ๊ณ ์ถ๋ค?
๊ทธ๋ด๋ @Recover๋ฅผ ํตํด
์์ ๋ฉ์๋์์ ๋ฐ์ํ RuntimeException์ ๋ฐ์์ ํผ๋๋ฐฑ์ด ์คํ๋๋ค
@Recover
public String recover(RuntimeException e) {
log.error("๋ชจ๋ ์๋๊ฐ ์คํจํจ. address: {}, error : {}", address, e.getMessage());
return null;
}
}