get($key); if ($cached !== null) { return $cached; } $result = $callback(); // 에러 응답은 캐시하지 않음 (일시적 상태 회복 가능성 보장) if (! (is_array($result) && isset($result['error']))) { $cache->put($key, $result, $ttl); } return $result; } /** * API 사용량을 기록합니다. * * @param string $endpoint 엔드포인트 * @param array $data 관련 데이터 * @return void */ protected function logApiUsage(string $endpoint, array $data = []): void { // TODO: API 사용량 통계 시스템 구현 // // 호출 지점은 레이아웃·확장 번들·정적 자산처럼 페이지 로드마다 여러 번 열리는 // 공개 엔드포인트다. 통계 시스템이 서기 전까지 이 자리가 요청마다 로그 파일에 // 줄을 쌓지 않도록, 디버그 모드에서만 기록한다. 기본 설치는 APP_DEBUG=false 이므로 // 아무것도 쓰지 않는다. if (! config('app.debug')) { return; } Log::debug("Public API Usage: {$endpoint}", [ 'ip' => request()->ip(), 'user_agent' => request()->userAgent(), 'data' => $data, 'timestamp' => now(), ]); } /** * 클라이언트 정보를 가져옵니다. * * @return array */ protected function getClientInfo(): array { return [ 'ip' => request()->ip(), 'user_agent' => request()->userAgent(), 'referer' => request()->header('referer'), 'timestamp' => now(), ]; } }