Tutorial/Java と Spring Boot

JavaとSpring Bootで為替レートを取得する

RestClient、BigDecimal、環境変数による認証、鮮度フィールドを使って、型付きSpring Bootクライアントを作る。

MMexchangerate.dev·Jul 17, 2026·6分で読了

SpringのRestClientはexchangerate.devのJSONをJava recordへ直接変換できる。レートはBigDecimalで保持し、キーは設定から注入し、sourcemarket_sessiondata_updated_atを残す。

Key points
同期の型付きクライアントにはSpring RestClientを使う。
レートと金額はBigDecimalで扱う。
キーはEXCHANGERATE_API_KEYから読む。
レートとともにdata_updated_atを保存する。

型付きRestClientを作る

次のrecordはレートのマップと解釈に必要なフィールドを保持する。Jacksonは@JsonPropertyでsnake_case名を割り当て、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に例外を投げる。共有リクエストファクトリに有限のタイムアウトを設定し、一時的な障害だけを再試行する。401はキー修正、継続する429はトラフィック削減か上限変更が必要である。

計算中はBigDecimalを維持する
レートと金額をBigDecimalとして解析し、明示した丸め規則で乗算し、対象通貨の表示時だけ丸める。APIレートは完全な精度を維持する。
  • 設定済みRestClientを再利用する。
  • 接続と読み取りのタイムアウトを設定する。
  • 成功レスポンスだけをキャッシュする。
  • source、marketSession、dataUpdatedAtを保存する。
MM
exchangerate.dev
FXデータを扱う開発者向けの統合ガイド。

Keep reading

Guide1回の呼び出しで過去のFX時系列を取得するRead Referencesourceとmarket_sessionの読み方Read Guideインディケーティブレートと約定可能レートRead