Tutorial/Java와 Spring Boot

Java와 Spring Boot에서 환율 사용하기

RestClient, BigDecimal, 환경 변수 기반 인증, 명시적인 신선도 필드를 사용해 타입이 지정된 Spring Boot FX 클라이언트를 만듭니다.

MMexchangerate.dev·Jul 17, 2026·6분 읽기

Spring RestClient는 exchangerate.dev의 JSON을 Java record로 직접 매핑할 수 있습니다. 환율은 BigDecimal로 유지하고, API 키는 설정에서 주입하며, 응답을 숫자 하나로 축소하지 말고 source, market_session, data_updated_at을 그대로 보존하세요.

Key points
동기식 타입 클라이언트에는 Spring RestClient를 사용하고, 기본적으로 4xx와 5xx 응답을 거부하도록 두세요.
환율 값은 BigDecimal로 매핑하세요. 이진 부동소수점 연산으로 금액을 변환하지 마세요.
키는 커밋된 properties 파일이 아니라 EXCHANGERATE_API_KEY에서 불러오세요.
후속 작업이 자체적인 신선도 규칙을 적용할 수 있도록 data_updated_at을 환율과 함께 저장하세요.

타입이 지정된 RestClient 만들기

아래 응답 record는 환율 맵과 이를 해석하는 데 필요한 필드를 함께 담습니다. Jackson은 @JsonProperty로 snake_case JSON 이름을 매핑하고, Spring이 HTTP 요청과 JSON 디코딩을 처리합니다.

java · ExchangeRateClient.javacopy
package com.example.fx;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;

record LatestRates(
    String base,
    String source,
    @JsonProperty("market_session") String marketSession,
    @JsonProperty("data_updated_at") Instant dataUpdatedAt,
    Map<String, BigDecimal> rates
) {}

@Component
public final class ExchangeRateClient {
  private final RestClient client;

  public ExchangeRateClient(
      RestClient.Builder builder,
      @Value("${exchangerate.api-key}") String apiKey
  ) {
    this.client = builder
        .baseUrl("https://api.exchangerate.dev/v1")
        .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey)
        .build();
  }

  public LatestRates latest(String base) {
    return client.get()
        .uri("/latest/{base}?symbols=EUR,GBP", base)
        .retrieve()
        .body(LatestRates.class);
  }
}

환경 변수에서 키 불러오기

yaml · application.yamlcopy
exchangerate:
  api-key: ${EXCHANGERATE_API_KEY}

신선도와 오류를 명시적으로 처리하기

RestClient.retrieve()는 기본적으로 4xx와 5xx 응답에서 예외를 던지므로, 실패한 업스트림 호출이 캐시된 0 값이 되지 않습니다. 공유 요청 팩토리에 유한한 타임아웃을 추가하고, 일시적인 실패만 재시도하세요. 401은 키 수정이 필요하고, 지속되는 429는 트래픽 감소나 더 높은 한도가 필요합니다.

계산 전 과정에서 BigDecimal 유지하기
환율과 금액을 BigDecimal로 파싱하고, 명시적인 반올림 정책으로 곱한 뒤, 표시 경계에서 대상 통화에 대해서만 반올림하세요. API 환율은 완전한 정밀도를 유지해야 합니다.
  • 요청 전반에서 설정된 RestClient 하나를 재사용하세요.
  • 요청 팩토리에 연결 및 읽기 타임아웃을 설정하세요.
  • 성공한 응답만 캐시하세요.
  • source, marketSession, dataUpdatedAt을 환율과 함께 저장하세요.
MM
exchangerate.dev
FX 데이터를 다루는 개발자를 위한 연동 가이드.

Keep reading

Guide한 번의 호출로 얻는 과거 FX 환율과 시계열Read Referencesource와 market_session 읽는 법Read Guide인디케이티브 환율과 체결 가능 환율Read