콘텐츠로 건너뛰기

7-4. 개별 클라이언트 등록

  • 기준

BaseClient의 기본 뼈대가 구성되었습니다. 그럼 우리가 사용할 FDP별 REST API형식을 알아보겠습니다. 해당 사이트의 API 문서를 확인하시면 되나 처음에 찾기가 매우 어려우니 여러분들은 편리하게 아래 내용을 참고 하시고 실행 하시면 됩니다.

FDP별 REST API 형식

FMP(Financial Modeling Prep)

미국 주식 데이터를 주로 가져오는 FMP는 주소 끝에 항상 apikey=내키를 붙여서 신분을 증명해야 합니다.

때문에 FMP에 가입해서 apikey를 발급받아야 합니다.

  1. FMP로 이동합니다. 우측 상단의 을 클릭합니다.

  2. 가입후 FMP/Dashboard로 들어갑니다.

  3. API Key를 확인합니다.

실시간 현재 가격 요청 (Quote)

“애플(AAPL) 지금 가격이 얼마야?”라고 물어볼 때 즉 현재 가격을 요청할때 씁니다.

🌐 요청 주소 (URL)

https://financialmodelingprep.com/stable/quote-short?symbol=AAPL&apikey=

📝 응답:

[  {      "symbol": "AAPL",      "price": 232.8,        "change": 4.79,        "volume": 44489128 }]
과거 차트 데이터 요청 (Historical Price)

“애플(AAPL) 과거 며칠 동안의 날짜별 시가/고가/저가/종가(OHLCV) 다 줘!”라고 할 때 씁니다.

🌐 요청 주소 (URL)

https://financialmodelingprep.com/stable/historical-price-eod/full?symbol=AAPL&apikey=

📝 응답

[  {      "symbol": "AAPL",      "date": "2025-02-04",      "open": 227.2,     "high": 233.13,        "low": 226.65,     "close": 232.8,        "volume": 44489128,        "change": 5.6,     "changePercent": 2.46479,      "vwap": 230.86 }]
Binance (바이낸스)

바이낸스는 무료로 열려있는 FDP라 별도의 API 키 없이도 기본 가격을 물어볼 수 있습니다. 단, 종목 기호를 적을 때 BTC가 아니라 BTCUSDT처럼 짝꿍(페어)을 맞춰 적어야 합니다.

실시간 현재 가격 요청 (Ticker)

설명: “비트코인(BTCUSDT) 지금 얼마야?”

🌐 요청 주소 (URL)

https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT

📝 응답

{"symbol":"BTCUSDT","price":"68338.65000000"}
과거 차트 데이터 요청 (Klines / 캔들스틱)

“비트코인 일봉(1일 단위) 차트 데이터 줘!”

🌐 요청 주소 (URL)(옵션: interval=1d는 1일, 1h는 1시간을 의미합니다)

https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d

📝 응답

[[1729468800000,"69032.00000000","69519.52000000","66840.67000000","67377.50000000","31374.42184000",1729555199999,"2130833593.54669770",3686777,"13593.60828000","923860758.42088440","0"]]

🤖 실전! FMP 클라이어트 추가(2-3)

🧠 이번 실습의 목적은 BaseClient에서 상속받은 fmp_client를 만들어 주식 가격 데이터를 가져 올수 있게 하는 과정입니다.

FMP는 apikey를 요구합니다. apikey를 fmp_client.py에 하드코딩하면 GitHub 같은 원격 저장소에 올릴 때 중요한 인증 정보가 코드에 포함되어 있으면 누구나 내 계정이나 데이터베이스에 접근할 수 있게 됩니다.

이러한 이유로 .env 파일을 사용하고 이를 .gitignore에 등록하면, 실제 민감한 정보는 내 컴퓨터(로컬)나 서버에만 머물게 됩니다.

Antigravity 좌측 Explore 탭에서 “backend”폴더에 마우스 우클릭하고 NewFile을 선택하여 “.env” 파일을 만듭니다.

/backend/.env

# Secret Key for BackendFMP_API_KEY=Your Api Key

✨ 사용자의 의도(Vibe)

backend/app/external_apis/base/base_client.py에 있는 BaseClient를 상속받아서, FMP(Financial Modeling Prep) API와 통신하는 FMPClient 클래스를 만들어 줘.

파일 위치는 backend/app/external_apis/implementations/fmp_client.py 로 하고 다음 두 가지 API를 호출하는 함수를 만들어야 해

  1. 실시간 현재 가격 요청 (Quote)

🌐 요청 주소 (URL)

https://financialmodelingprep.com/stable/quote-short?symbol=AAPL&apikey=

📝 응답:

[  {      "symbol": "AAPL",      "price": 232.8,        "change": 4.79,        "volume": 44489128 }]
  1. 과거 차트 데이터 요청 (Historical Price)

🌐 요청 주소 (URL)

https://financialmodelingprep.com/stable/historical-price-eod/full?symbol=AAPL&apikey=

📝 응답

[  {      "symbol": "AAPL",      "date": "2025-02-04",      "open": 227.2,     "high": 233.13,        "low": 226.65,     "close": 232.8,        "volume": 44489128,        "change": 5.6,     "changePercent": 2.46479,      "vwap": 230.86 }]

🚨 주의사항

  • FMP 의 apikey는 ./backend/.env에 FMP_API_KEY
  • BaseClient의 get 메서드를 사용해서 호출해 줘.
  • 응답 결과는 항상 BaseClient에서 정의한 표준화된 형식({“success”: True, “data”: …})으로 반환되게 만들어 줘.
  • 초보자가 이해하기 쉽게 한글 주석을 달아줘.

💻 AI가 생성한 코드 (Syntax)

backend/app/external_apis/implementations/fmp_client.py

import osfrom typing import Any, Dict# .env 파일에서 환경 변수를 로드하기 위한 라이브러리입니다.from dotenv import load_dotenv# 이전에 작성한 BaseClient를 상속받기 위해 불러옵니다.from app.external_apis.base.base_client import BaseClient# 환경 변수 로드 (.env 파일이 있는 경우 읽어옵니다)load_dotenv()class FMPClient(BaseClient):
def __init__(self):        # FMP API의 안정화된(stable) 기본 URL을 설정합니다.        # 하위 메서드들에서는 이 주소 뒤에 붙을 엔드포인트(endpoint)만 설정하면 됩니다.        base_url = "https://financialmodelingprep.com/stable/"                # BaseClient의 초기화 영역을 호출하여 기본 설정(예: 동시 요청 수 등)을 마무리합니다.        super().__init__(base_url=base_url)         이하 생략 …         response = await self.get(endpoint=endpoint, params=params)
return response

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다