가이드튜토리얼

PHP와 Laravel에서 환율 사용하기

Laravel의 HTTP 클라이언트, bearer 인증, 유한한 타임아웃, 신선도 메타데이터를 사용해 실시간 환율을 가져오고 캐시합니다.

2026년 7월 17일 · 6분 읽기

작은 Laravel 서비스로 exchangerate.dev를 호출하고, 실패한 HTTP 응답을 거부하며, 완전한 FX 관측값을 60초 동안 캐시할 수 있습니다. API 키는 설정에 보관하고, 환율과 함께 source, market_session, data_updated_at을 반환하세요.

  • bearer 인증, 명시적인 타임아웃, 실패한 응답에는 throw()를 사용하는 Laravel의 HTTP 클라이언트를 사용하세요.
  • Free 등급의 분당 10회 한도 안에 여유 있게 머물도록 성공한 전체 응답을 60초 동안 캐시하세요.
  • 키는 애플리케이션 코드가 아니라 EXCHANGERATE_API_KEY를 통해 config/services.php에 보관하세요.
  • 정확한 금전 연산이 필요한 계산에는 decimal 라이브러리를 사용하세요. PHP의 float는 이진 부동소수점입니다.

캐시되는 FX 서비스 하나 만들기

아래 서비스는 기본 통화와 정렬된 심볼 목록으로 안정적인 캐시 키를 만듭니다. throw()가 Laravel이 실패한 요청을 캐시에 쓰기 전에 예외를 발생시키므로, 콜백은 성공한 JSON 응답만 저장합니다.

php · app/Services/ExchangeRateService.php
<?phpnamespace App\Services;use Illuminate\Support\Facades\Cache;use Illuminate\Support\Facades\Http;final class ExchangeRateService{    public function latest(string $base, array $symbols): array    {        sort($symbols);        $symbolList = implode(',', $symbols);        $cacheKey = "fx:latest:{$base}:{$symbolList}";        return Cache::remember($cacheKey, now()->addSeconds(60), function () use (            $base,            $symbolList,        ): array {            return Http::acceptJson()                ->withToken(config('services.exchangerate.key'))                ->timeout(5)                ->get(                    "https://api.exchangerate.dev/v1/latest/{$base}",                    ['symbols' => $symbolList],                )                ->throw()                ->json();        });    }}

소스 관리 밖에서 키 설정하기

php · config/services.php and .env
// config/services.php'exchangerate' => [    'key' => env('EXCHANGERATE_API_KEY'),],// .env (never commit the real value)EXCHANGERATE_API_KEY=exr_live_...

환율과 관측 필드 읽기

$service->latest("USD", ["EUR", "GBP"])를 호출한 뒤 $result["rates"]["EUR"]를 읽으세요. 값이 문맥을 잃지 않도록 $result["source"], $result["market_session"], $result["data_updated_at"]을 뷰 모델이나 저장된 레코드에 함께 보관하세요.

오류를 환율로 캐시하지 마세요

401은 키나 헤더가 잘못되었다는 뜻입니다. 429는 애플리케이션이 요청 한도를 초과했다는 뜻입니다. 둘 다 실패하도록 두고, 적절히 백오프하며, 이전에 성공한 관측값은 원래의 갱신 시각과 함께만 보존하세요.

  • 캐시 키를 만들기 전에 심볼을 정렬하세요.
  • 유한한 HTTP 타임아웃을 설정하세요.
  • JSON을 읽고 캐시하기 전에 throw를 호출하세요.
  • API 환율이 아니라 최종 금액을 반올림하세요.

자주 묻는 질문

Laravel이 exchangerate.dev를 호출하려면 별도의 SDK가 필요한가요?

아니요. Laravel에 내장된 HTTP 클라이언트가 bearer 토큰, 쿼리 매개변수, 타임아웃, JSON accept 헤더를 보낼 수 있습니다. API는 배열로 다룰 수 있는 일반 JSON을 반환합니다.

Laravel은 환율 응답을 얼마나 오래 캐시해야 하나요?

약 1분마다 갱신되는 활발히 거래되는 통화쌍에는 60초 캐시가 적합하며, 중복된 애플리케이션 요청이 업스트림 한도를 소모하는 것을 막아줍니다. 일별 참조 통화는 여전히 더 오래된 관측값을 가질 수 있으므로 data_updated_at을 확인하세요.

PHP의 float를 통화 변환에 사용해도 되나요?

PHP의 float는 이진 부동소수점이라 표현 오차가 발생할 수 있습니다. 정확한 금전 연산이 중요할 때는 decimal 또는 임의 정밀도 라이브러리를 사용하고, API 환율은 그대로 유지한 뒤 최종 표시 금액만 반올림하세요.

무료 exchangerate.dev 키에는 어떤 한도가 적용되나요?

Free 등급은 카드 없이 월 5,000회, 분당 10회 요청을 제공합니다. 공유되는 읽기는 캐시하고, 페이지 조회마다 업스트림 요청을 하나씩 보내는 것을 피하세요.

계속 읽기

무료 API 키로 시작하세요

무료 플랜으로 월 5,000건 요청 가능. 신용카드는 필요하지 않습니다.

무료 키 받기