Skip to content

Latest commit

Β 

History

History
86 lines (77 loc) Β· 3.09 KB

Spring-retry.md

File metadata and controls

86 lines (77 loc) Β· 3.09 KB

Spring - Retry

spring-retry 라이브러리

  • λ©”μ„œλ“œ μ‹€ν–‰ 쀑 μΌμ‹œμ μΈ 였λ₯˜ λ˜λŠ” μ˜ˆμ™Έ μƒν™©μ—μ„œ μžλ™μœΌλ‘œ λ©”μ„œλ“œλ₯Ό μž¬μ‹œλ„ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 라이브러리

μ˜μ‘΄μ„±

  • in Maven
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>{μ‚¬μš©ν•˜λ €λŠ” 버전}</version>
</dependency>
  • in Gradle
// https://mvnrepository.com/artifact/org.springframework.retry/spring-retry
implementation 'org.springframework.retry:spring-retry:{μ‚¬μš©ν•˜λ €λŠ” 버전}}'

μ£Όμš” κΈ°λŠ₯

  1. @Retryable μ–΄λ…Έν…Œμ΄μ…˜
    • μž¬μ‹œλ„ λ‘œμ§μ„ μ μš©ν•  λ©”μ„œλ“œμ— μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜
    • μ–΄λ…Έν…Œμ΄μ…˜μ˜ 속성을 μ„€μ •ν•˜μ—¬ λ™μž‘ μ œμ–΄
@Service
public class MyService {
    
    @Retryable(
            value = { NetworkException.class },
            maxAttempts = 3,
            backoff = @Backoff(delay = 2000)
    )
    public void fetch() {
        // NetworkException이 λ°œμƒν•  경우, μ΅œλŒ€ 3번 μž¬μ‹œλ„ν•˜κ³  2초 κ°„κ²©μœΌλ‘œ λ”œλ ˆμ΄
    }
}
  1. λ°±μ˜€ν”„ (Backoff) μ „λž΅
    • μž¬μ‹œλ„ μ‹œκ°„ 간격을 μ‘°μ ˆν•˜λŠ” μ „λž΅
    • @Retryable μ–΄λ…Έν…Œμ΄μ…˜μ˜ backoff 속성을 μ„€μ •ν•˜μ—¬ 초기 λ”œλ ˆμ΄, μ΅œλŒ€ μž¬μ‹œκ°„ μ‹œκ°„ 등을 ꡬ성할 수 μžˆλ‹€.
// ...

    @Retryable(
            value = { NetworkException.class },
            maxAttempts = 5,
            backoff = @Backoff(delay = 100, multiplier = 2)
    )
    public void fetch() {
        // NetworkException 이 λ°œμƒν•  경우, μ΅œλŒ€ 5번 μž¬μ‹œλ„ν•˜κ³  μ§€μˆ˜μ μœΌλ‘œ μ¦κ°€ν•˜λŠ” λ”œλ ˆμ΄ 적용
    }
  1. μž¬μ‹œλ„ μ •μ±… (Retry Policy)
    • μž¬μ‹œλ„ λ™μž‘μ„ μ œμ–΄ν•˜λŠ” μ •μ±…
    • μ˜ˆμ™Έ νƒ€μž…, μ΅œλŒ€ μž¬μ‹œκ°„ 횟수 등을 μ„€μ •ν•˜μ—¬ μ–Έμ œ μž¬μ‹œλ„ν• μ§€λ₯Ό κ²°μ •ν•  수 μžˆλ‹€.
  2. RetryTemplate
    • @Retryable μ–΄λ…Έν…Œμ΄μ…˜ 외에도 ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ μž¬μ‹œλ„ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μœ ν‹Έλ¦¬ν‹° 클래슀
@Service
public class MyService {
    
    private final RetryTemplate retryTemplate;
    
    public MyService() {
        retryTemplate = new RetrtyTemplate();
        FixedBackoffPolicy backoffPolicy = new FixedBackoffPolicy();

        backoffPolicy.setBackoffPeriod(500);
        retryTemplate.setBackoffPolicy(backoffPolicy);
        
        SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();

        simpleRetryPolicy.setMaxAttempts(3);
        retryTemplate.setRetryPolicy(simpleRetryPolicy);
    }
    
    public void fetch() {
        retryTemplate.execute(context -> {
            // μ™ΈλΆ€ μ„œλΉ„μŠ€ 호좜 λ˜λŠ” 데이터 λ‘œλ“œ μž‘μ—… μˆ˜ν–‰
            return null;    // κ²°κ³Ό λ°˜ν™˜
        });
    }
}
  • RetryTemplateλ₯Ό μ‚¬μš©ν•˜μ—¬ μž¬μ‹œλ„ λ‘œμ§μ„ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•œ 예제 μ†ŒμŠ€
    • backoffPolicy와 RetryPolicyλ₯Ό μ„€μ •ν•˜μ—¬ μž¬μ‹œλ„ 간격과 μ΅œλŒ€ μž¬μ‹œλ„ 횟수λ₯Ό μ§€μ •ν•˜κ³ , execute() λ©”μ„œλ“œ λ‚΄μ—μ„œ μž¬μ‹œλ„ν•  μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.