낙관적 락 재시도 횟수 설정

남기은·2026년 4월 14일

동시성 제어

목록 보기
7/7

설정 전, 프로젝트 세팅 (@Retryable 사용을 위한 사전 세팅)

  1. spring-retry 의존성 추가
// spring-retry
implementation ("org.springframework.retry:spring-retry")
  1. Spring Boot EntryPoint에 @EnableRetry 어노테이션 추가
@EnableRetry
@SpringBootApplication
public class Application {
	....
}

재시도 설정

@Transactional
@Retryable(
      retryFor = {ObjectOptimisticLockingFailureException.class},
      maxAttempts = 15,
      backoff = @Backoff(50)
)
public Long addLike(Long postId) {
  Post post = postRepository.findById(postId).orElseThrow();
  post.addLike();

  return post.getLikeCount();
}

@Retryable 어노테이션을 사용하여 재시도 설정이 가능

  • retryFor : 예외 발생 시에만 재시도를 수행하도록 제한하는 옵션
  • maxAttempts : 어노테이션된 메서드에 대한 최대 횟수 시도를 지정 (Default = 3)
  • backoff : 재시도 사이의 지연을 구현 @Backoff 어노테이션을 받아 밀리초 단위로 지연을 설정 가능

최적의 재시도 설정 시나리오

사전 설정

  • JMeter를 사용하여 1초의 1000개의 동시요청을 보내는 환경에서 시나리오 진행
  • 최적의 재시도 횟수(maxAttempts) 설정 후, 최적의 재시도 사이 지연(backoff)을 설정하는 순서로 진행

maxAttempts 설정 과정

최대 재시도 횟수의 초기값을 1000으로 설정 후, 재시도 횟수를 2배씩 줄여나가다 데이터 누락율이 발생하면 재시도 횟수를 다음과 같이 설정. → (이전 설정한 재시도 횟수 + 이번 설정한 재시도 횟수) / 2

예시)

데이터 누락 없이 성공 시
1000500250 …

데이터 누락이 발생 시 (10에서 발생했다고 가정)
(20 + 10) / 2 -> 15

backoff 설정 과정

재시도 사이 지연 시간 초기값을 100으로 설정 후, 재시도 횟수 설정 과정과 동일하게 진행

예시)

데이터 누락 없이 성공 시
1005025 …

데이터 누락이 발생 시 (25에서 발생했다고 가정)
(50 + 25) / 2 -> 40 (37로 약 40이기 때문에)

maxAttempts 결과

재시도 횟수데이터 누락율(%)
10000
5000
2500
1250
600
300
150
101
120.7
140.5

15를 최적의 재시도 횟수로 설정

backoff 결과

재시도 횟수데이터 누락율(%)
1000
500
253.9
301
400.7
450.6

50을 최적의 재시도 사이 지연으로 설정

Reference

https://xxeol.tistory.com/57
https://codesnapmag.hashnode.dev/spring-retryable-annotation

profile
느리지만 꾸준한 개발자 남기은입니다

0개의 댓글