야놀자 파트너(Partners) API의 캘린더 최저가 조회 기능을 신규 Distributor API 기반으로 마이그레이션한 프로젝트입니다. 검색 응답 속도 개선을 위해 지역/도시별 대표 호텔 요금을 **미리 적재(캐싱)**하는 배치 시스템입니다.
<aside> 🎯
주요 달성 목표
<aside> ⚠️
문제 상황
구 API는 90일 범위를 한 번에 조회했으나, 신규 API는 실시간 가용성 API로 1박 단위 조회만 지원
</aside>
| 구분 | 구 API (Partners) | 신규 API (Distributor) |
|---|---|---|
| 조회 방식 | 기간 범위 조회 (90일 한 번에) | 날짜별 반복 호출 (1박 × 90회) |
| 숙소 제한 | 50개/요청 | 30개/요청 |
| API 호출 수 (1000숙소 기준) | 20회 | 3,060회 (34개 그룹 × 90일) |
해결 방안: 날짜별 반복 호출 + 30개 파티션 처리 구조로 재설계
// 90일 날짜별 반복 호출
for (LocalDate currentDate = startDate; currentDate.isBefore(endDate);
currentDate = currentDate.plusDays(1)) {
String checkin = currentDate.format(DATE_FORMATTER);
String checkout = currentDate.plusDays(1).format(DATE_FORMATTER);
for (List<String> propertyGroup : propertyGroups) {
List<YanoljaMinPriceVO> dayResult = callAvailabilityApi(
checkin, checkout, propertyGroup);
resultList.addAll(dayResult);
// TPS 제어
TimeUnit.MILLISECONDS.sleep(TPS_DELAY_MS);
}
}
<aside> ⚡
설계 결정
야놀자 Distributor API는 권장 TPS 20을 준수해야 함. 이를 초과하면 Rate Limit 에러 발생
</aside>
// TPS 제어 상수 정의
private static final long TPS_DELAY_MS = 50; // 20 TPS = 1000ms / 20 = 50ms per request
// 각 API 호출 후 딜레이 적용
for (List<String> propertyGroup : propertyGroups) {
try {
List<YanoljaMinPriceVO> dayResult = callAvailabilityApi(
checkin, checkout, propertyGroup);
resultList.addAll(dayResult);
// TPS 제어: 요청 간 50ms 딜레이로 20 TPS 준수
TimeUnit.MILLISECONDS.sleep(TPS_DELAY_MS);
} catch (Exception e) {
log.error("Availability API 호출 실패 - checkin: {}, properties: {}",
checkin, propertyGroup, e);
}
}