Retry, Timeout과 장애 전파 방지
Retry
예시: 20% 확률로 실패하는 메일 서비스
Spring Retry로 재시도 구현하기
@Service
public class MailSenderService {
@Retryable(
retryFor = {RetryableException.class}, // 1. 재시도할 예외 지정 (SMTPConnectionException의 부모)
maxAttempts = 3, // 2. 최대 시도 횟수 (최초 시도 포함)
backoff = @Backoff(delay = 2000) // 3. 대기 시간 (2초 간격)
)
public void sendEmail(String email) {
// ... 비즈니스 로직 (이메일 검증 및 발송) ...
// 20% 확률로 SMTPConnectionException 발생!
}
@Recover // 4. 모든 재시도가 실패했을 때 실행될 폴백(Fallback) 메서드
public void recover(RetryableException e, String email) {
log.error("모든 재시도 실패... 별도 처리가 필요합니다.");
// DB에 저장하거나 알림 발송 등 후속 처리
}
}Timeout과 장애 전파 방지
타임아웃은 왜 필요한가?
Spring MVC에서의 Tomcat 스레드 고갈
Spring WebFlux의 비동기 처리
Connection Timeout vs Read Timeout
구분
Connection TImeout
Read Timeout
예외는 어디서 잡고, 어떻게 던져야 할까요?
예외 핸들링 위치를 결정하는 기준
1. 라이브러리 의존성 격리
2. 재시도 범위 최소화
요약: 예외 처리 기준
Last updated