diff --git a/back/database/index.js b/back/database/index.js index cbb39d4..4df4346 100644 --- a/back/database/index.js +++ b/back/database/index.js @@ -891,24 +891,43 @@ async function getPastBusArrival(routeId, stationId, staOrder, date, onlySevenDa try { const cache = await loadCache(); const requestDate = DateTime.fromISO(date); - const cacheKey = `${routeId}-${stationId}-${staOrder}-${date}`; - - if (cache[cacheKey]) { - return { - ok: true, - data: cache[cacheKey], - source: 'cache' - }; - } + + let datesToFetch = onlySevenDays ? [-7] : (() => { + const weekday = requestDate.weekday; + switch (weekday) { + case 1: // 월요일 + return [-3, -7]; + case 2: // 화요일 + return [-1, -7]; + case 3: // 수요일 + case 4: // 목요일 + case 5: // 금요일 + return [-1, -2, -7]; + case 6: // 토요일 + case 7: // 일요일 + return [-7]; + default: + return [-7]; + } + })(); - const datesToFetch = onlySevenDays - ? [-7] - : (requestDate.weekday >= 6 ? [-7] : [-1, -2, -7]); let allResults = []; + let isAllFromCache = true; // 모든 데이터가 캐시에서 왔는지 확인하는 플래그 for (const dayOffset of datesToFetch) { const targetDate = requestDate.plus({ days: dayOffset }).toFormat('yyyy-MM-dd'); + const cacheKey = `${routeId}-${stationId}-${staOrder}-${targetDate}`; + // 캐시 확인 + if (cache[cacheKey]) { + console.log(`캐시 데이터 사용: ${cacheKey}`); + allResults = allResults.concat(cache[cacheKey]); + continue; + } + + isAllFromCache = false; // API 호출이 필요한 경우 + console.log(`API 호출 필요: ${cacheKey}`); + if (lastApiCall) { const timeSinceLastCall = Date.now() - lastApiCall; if (timeSinceLastCall < API_CALL_INTERVAL) { @@ -916,29 +935,26 @@ async function getPastBusArrival(routeId, stationId, staOrder, date, onlySevenDa } } - // specialRouteMappingFullPath 확인 const specialConfig = specialRouteMappingFullPath[stationId]?.[routeId]; const actualStationId = specialConfig ? specialConfig.referenceStationId : stationId; const actualStaOrder = specialConfig ? (Number(staOrder) - specialConfig.staOrderOffset).toString() : staOrder; - // 실제 API 호출 const busArrivalList = await fetchBusHistory(routeId, actualStationId, actualStaOrder, targetDate); lastApiCall = Date.now(); if (busArrivalList && busArrivalList.length > 0) { - // specialRouteMapping 적용 const mappedData = applySpecialRouteMapping(busArrivalList, stationId, routeId); + cache[cacheKey] = mappedData; allResults = allResults.concat(mappedData); } } - cache[cacheKey] = allResults; await saveCache(cache); return { ok: true, data: allResults, - source: 'api' + source: isAllFromCache ? 'cache' : 'api' }; } catch (error) { @@ -946,7 +962,6 @@ async function getPastBusArrival(routeId, stationId, staOrder, date, onlySevenDa throw error; } } - function applySpecialRouteMapping(data, stationId, routeId) { // specialRouteMappingFullPath 적용 로직 const mappedData = data.map(item => { diff --git a/front/lib/station_screen.dart b/front/lib/station_screen.dart index d5ffb06..611963f 100644 --- a/front/lib/station_screen.dart +++ b/front/lib/station_screen.dart @@ -13,16 +13,16 @@ class _StationScreenState extends State { // 정류장 데이터 final Map>> stationData = { 'ascending': [ // 정문 방향 - {'name': '사색의 광장', 'description': ''}, - {'name': '생명과학대.산업대학', 'description': '정문행'}, - {'name': '경희대체육대학.외대', 'description': '정문행'}, - {'name': '경희대학교(정건)', 'description': '정문행'}, + {'name': '사색의 광장', 'description': 'ⓘ 정문 방향(29059)'}, + {'name': '생명과학대.산업대학', 'description': 'ⓘ 정문 방향(29050)'}, + {'name': '경희대체육대학.외대', 'description': 'ⓘ 정문 방향(29044)'}, + {'name': '경희대학교(정건)', 'description': 'ⓘ 정문 방향(04241)'}, ], 'descending': [ // 사색 방향 - {'name': '경희대정문', 'description': '사색행'}, - {'name': '외국어대학', 'description': '사색행'}, - {'name': '생명과학대', 'description': '사색행'}, - {'name': '사색의광장', 'description': '사색행'}, + {'name': '경희대정문', 'description': 'ⓘ 사색 방향(29038)'}, + {'name': '외국어대학', 'description': 'ⓘ 사색 방향(29040)'}, + {'name': '생명과학대', 'description': 'ⓘ 사색 방향(29049)'}, + {'name': '사색의광장', 'description': 'ⓘ 사색 방향(29057)'}, ], }; @@ -49,19 +49,12 @@ class _StationScreenState extends State { ), SizedBox(height: 4), Text( - 'M5107과 1560은 서울대학교 학기 시 서울 지역과 교대역 방면을 경유합니다.', + 'ⓘ M5107과 1560은 교내 버스 이동 시간을 고려하여 보정된 버스 도착 정보를 제공합니다.', style: TextStyle( color: Colors.grey, fontSize: 12, ), ), - Text( - '버스 도착 정보 시간은 평균 운행 시간과 시간대별 패턴으로 예측한 결과입니다.', - style: TextStyle( - color: Colors.grey, - fontSize: 12, - ), - ), ], ), ), @@ -173,7 +166,7 @@ class _StationScreenState extends State { onPressed: () { // TODO: 버스 도착 예정 시간 기능 구현 }, - child: const Text('버스 도착 예정 시간'), + child: const Text('과거 도착 시간'), ), ), const SizedBox(width: 8),