Hello-LSY / Baenang

여행과 관련된 전자문서를 관리하는 여행 어플리케이션, Beanang
0 stars 3 forks source link

환율이 없을 때 쿼리가 반복되는 현상 #27

Closed Hello-LSY closed 1 month ago

Hello-LSY commented 1 month ago

image

Hello-LSY commented 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;
}
Hello-LSY commented 1 month ago
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단계 로직 추가