Closed Hello-LSY closed 1 month ago
DB에 최소 2개 이하의 통화 데이터일때 문제 발견.
private List<ExchangeRate> fetchRatesWithFallback(LocalDate date) {
List<ExchangeRate> rates = exchangeRateRepository.findByRecordedAtBetween(date.atStartOfDay(), date.plusDays(1).atStartOfDay());
while (rates.isEmpty()) {
date = getPreviousBusinessDay(date.minusDays(1)); // 이전 영업일로 이동
rates = exchangeRateRepository.findByRecordedAtBetween(date.atStartOfDay(), date.plusDays(1).atStartOfDay());
}
return rates;
}
if로 제한되는 Date를 지정하여 해결. 추후 가장 최근 공휴일까지나 다른 방안을 찾으면서 호출을 더 줄여볼 시도 고려
private List<ExchangeRate> fetchRatesWithFallback(LocalDate date) {
LocalDate minimumDate = LocalDate.of(2024, 1, 1);
List<ExchangeRate> rates = exchangeRateRepository.findByRecordedAtBetween(date.atStartOfDay(), date.plusDays(1).atStartOfDay());
while (rates.isEmpty()) {
date = getPreviousBusinessDay(date.minusDays(1)); // 이전 영업일로 이동
if (date.isBefore(minimumDate)) {
logger.error("No exchange rate data available before " + minimumDate);
throw new ExchangeRateNotFoundException("No exchange rate data available for the requested period.");
}
rates = exchangeRateRepository.findByRecordedAtBetween(date.atStartOfDay(), date.plusDays(1).atStartOfDay());
}
return rates;
}
private static final int MAX_RETRY_COUNT = 10; // 최대 시도 횟수
private LocalDate getPreviousBusinessDay(LocalDate date) {
int retryCount = 0;
while (isNonBusinessDay(date) && retryCount < MAX_RETRY_COUNT) {
date = date.minusDays(1); // 비영업일이면 전날로 이동
retryCount++;
}
if (retryCount >= MAX_RETRY_COUNT) {
logger.warn("Max retry count reached while searching for previous business day");
throw new ExchangeRateNotFoundException("Could not find a valid business day within limit");
}
return date;
}
10번 이상 넘어가면 호출을 중단하는 방식으로 2단계 로직 추가