프로젝트 개요

배경

야놀자 파트너(Partners) API의 캘린더 최저가 조회 기능을 신규 Distributor API 기반으로 마이그레이션한 프로젝트입니다. 검색 응답 속도 개선을 위해 지역/도시별 대표 호텔 요금을 **미리 적재(캐싱)**하는 배치 시스템입니다.

핵심 성과

<aside> 🎯

주요 달성 목표

담당 역할


기술적 챌린지 및 해결 방안

1. API 호출 방식 근본적 변경

<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);
    }
}

2. TPS Rate Limit 대응

<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);
    }
}