본문 바로가기
Tech Notes

무료 금융 API 제대로 쓰는 법 — Alpha Vantage

by miracle-tech 2026. 6. 15.
728x90
반응형

앱인토스에 미국 ETF 시세를 보여주는 미니앱을 만들면서, 외부 금융 데이터 API로 Alpha Vantage를 사용했습니다. 처음엔 "클라이언트에서 직접 부르면 되겠지"라고 단순하게 생각했지만, 무료/제한 있는 API를 다루다 보니 구조 자체를 다시 짜게 됐습니다.

이 글은 그 과정에서 배운 것들을 정리한 개발 회고입니다. 초보 개발자나 혼자 만드는 1인 개발자(솔로 빌더)가 따라 읽을 수 있도록 용어는 최대한 풀어서 설명했습니다.

3줄 요약

  • 무료 금융 API는 클라이언트에서 직접, 자주 부르면 키 노출·호출 한도·장애 전파 문제가 생깁니다.
  • 서버 크론이 주기적으로 Alpha Vantage를 호출해 DB에 "시세 스냅샷"으로 저장하고, 앱은 그 스냅샷만 읽게 했습니다.
  • ETF 학습/참고용 앱에는 초단위 실시간이 아니라 "직전 거래일 종가 + 최근 추이"면 충분합니다.

Alpha Vantage가 뭔가요?

Alpha Vantage는 주식·ETF·환율 같은 금융 데이터를 인터넷으로 받아올 수 있게 해주는 외부 데이터 API 서비스입니다. 쉽게 말하면, 내가 직접 증권사 데이터를 수집하지 않아도 "이 종목의 데이터 줘"라고 요청하면 JSON 형태로 응답을 돌려주는 창구입니다.

여기서 API는 "프로그램끼리 정해진 방식으로 데이터를 주고받는 약속", JSON은 "프로그램이 읽기 쉬운 데이터 형식"이라고 이해하면 됩니다.

개인 개발자·학습용 프로젝트가 쓰기 좋은 무료 플랜을 제공하는 게 특징입니다. 다만 무료 플랜에는 호출 횟수 제한이 있는데, 이 글을 쓰는 시점 기준 공식 무료 한도는 하루 25회입니다. 정책은 언제든 바뀔 수 있으니, 실제 적용 전엔 반드시 최신 공식 문서를 확인하세요.

제가 왜 ETF 시세 API가 필요했나요?

제가 만든 앱은 미국 ETF를 공부하고 참고할 수 있는 학습/참고용 앱입니다. 실시간으로 사고파는 트레이딩 앱이 아닙니다. 그래서 화면에 보여줄 정보도 단순합니다.

  • 마지막 종가 (직전 거래일 기준)
  • 1일 수익률
  • 1개월 수익률
  • 최근 30거래일 추이

이 데이터를 매번 직접 모을 수는 없으니, Alpha Vantage 같은 외부 API에서 받아오기로 한 것입니다.

왜 클라이언트에서 API를 직접 부르면 안 되나요?

처음엔 "앱에서 바로 Alpha Vantage를 호출하면 간단하지 않을까?" 생각했습니다. 그런데 실제로는 문제가 많습니다.

1) API 키 노출 위험
클라이언트(앱)에 API 키를 넣으면, 사실상 누구나 그 키를 들여다볼 수 있습니다. 키가 노출되면 남이 내 한도를 대신 써버리거나 오용할 수 있습니다.

2) 무료 플랜 / 호출 한도 문제
무료 플랜은 호출 횟수가 정해져 있습니다. 앱에서 직접 자주 부르면 금방 한도에 걸려서 데이터가 안 내려옵니다.

3) 사용자가 늘수록 호출도 늘어남
클라이언트가 직접 부르는 구조면, 유저가 100명이면 호출도 100명분, 1000명이면 1000명분으로 늘어납니다. 한도 있는 무료 API에는 치명적입니다.

4) 외부 API 장애가 앱에 그대로 전파됨
외부 API가 느려지거나 죽으면, 그 순간 앱 화면도 같이 깨집니다. 내 잘못이 아닌데 사용자는 "앱이 고장났다"고 느낍니다.

서버 크론 + 데이터베이스 스냅샷 구조

그래서 구조를 이렇게 바꿨습니다. 핵심은 "클라이언트는 외부 API를 직접 부르지 않는다"입니다.

Alpha Vantage 외부 금융 데이터 API ① 주 1회 호출 · ② 시세 데이터 응답 서버 크론 /api/cron/update 매주 월요일 09:00 KST 자동 실행 ③ 스냅샷 저장 데이터베이스 시세 스냅샷 ④ 저장된 스냅샷만 읽기 앱 (클라이언트) 외부 API 직접 호출 ✕ ⑤ 화면에 표시 사용자 ※ 사용자가 늘어도 외부 API 호출 수는 크론 주기 그대로 고정됩니다.
[그림] 서버 크론이 외부 API를 호출해 스냅샷으로 저장하고, 앱은 그 스냅샷만 읽는 구조
  • 서버 크론이 주기적으로 Alpha Vantage를 호출합니다.
  • 받아온 데이터를 데이터베이스(DB)에 "시세 스냅샷"으로 저장합니다.
  • 앱은 외부 API 대신, 저장된 스냅샷만 읽습니다.

여기서 크론(cron)은 "정해진 시간에 자동으로 어떤 작업을 실행시키는 예약 기능", 스냅샷(snapshot)은 "특정 시점의 데이터를 한 장의 사진처럼 저장해 둔 것"이라고 보면 됩니다.

제 경우 크론 엔드포인트는 /api/cron/update 이고, 매주 월요일 오전 9시(KST)에 한 번 실행되어 전체 ETF 스냅샷을 갱신합니다.

이 구조의 장점은 명확합니다. 사용자가 몇 명이든 외부 API 호출 수는 크론 주기 그대로 고정됩니다. 유저가 늘어도 Alpha Vantage 호출은 늘지 않습니다. 또한 외부 API가 잠깐 죽어도 앱은 마지막 스냅샷을 보여줄 수 있어 화면이 깨지지 않습니다.

무료 API를 쓸 때 주의할 점

무료 API를 안정적으로 쓰려면 몇 가지 운영 습관이 필요합니다.

  • 요청 간격(딜레이) 관리: 여러 종목을 한 번에 부를 때 호출 사이에 짧은 간격을 둬서 순간적으로 한도를 넘지 않게 합니다.
  • freshness 가드(신선도 가드): 최근에 이미 갱신한 데이터는 다시 부르지 않게 막습니다. 불필요한 호출을 줄여 한도를 아낄 수 있습니다.
  • 무거운 크론 겹치지 않게: 시간이 오래 걸리는 작업끼리 같은 시간대에 동시에 돌지 않도록 일정을 분리합니다.
  • 실패 시 마지막 저장값 노출: 외부 API가 실패해도 에러 화면 대신 마지막으로 저장된 스냅샷을 그대로 보여줍니다. 사용자 경험이 끊기지 않습니다.

실시간 시세가 정말 필요할까요?

트레이딩 앱이라면 초단위 실시간이 중요합니다. 하지만 제 앱은 ETF를 공부하고 참고하는 용도입니다. 이런 앱에는 "직전 거래일 종가 + 최근 추이"면 충분합니다.

그래서 사용자 화면에 다음을 솔직하게 명시했습니다.

  • 데이터는 매주 갱신됩니다.
  • 가격은 직전 거래일 종가 기준입니다.
  • 이 앱은 학습/참고용입니다.
  • 이 앱은 투자 자문이 아닙니다.

데이터 신선도를 숨기지 않고 명확히 밝히는 것이, 오히려 사용자 신뢰를 높여줍니다.

마치며

무료이거나 호출 한도가 있는 금융 API를 쓸 때 중요한 건 "얼마나 자주 부르느냐"가 아닙니다. 서버에서 필요한 만큼만 부르고, 안정적인 스냅샷으로 저장하고, 앱은 그 스냅샷을 읽는 것입니다.

무료 API + 서버 크론 + DB 스냅샷. 화려한 구조는 아니지만, 작은 금융 앱이나 학습용 앱에는 충분히 현실적이고 잘 깨지지 않는 아키텍처라고 느꼈습니다.

⚠️ 면책 안내: 이 글과 앱에서 다루는 데이터는 학습 및 참고용이며, 투자 자문이나 매수·매도 권유가 아닙니다. 투자 판단과 그 결과에 대한 책임은 전적으로 본인에게 있습니다.

자주 묻는 질문 (FAQ)

Q1. Alpha Vantage는 완전 무료인가요?
무료 플랜이 있지만 호출 횟수 제한이 있습니다. 한도와 정책은 바뀔 수 있으므로 최신 공식 문서를 확인하는 게 안전합니다. 더 많은 호출이 필요하면 유료 플랜을 고려하면 됩니다.

Q2. 왜 클라이언트에서 직접 안 부르고 서버 크론을 쓰나요?
API 키 노출을 막고, 사용자가 늘어도 외부 호출 수를 고정하고, 외부 API 장애가 앱으로 바로 전파되는 걸 막기 위해서입니다.

Q3. 매주 갱신이면 데이터가 너무 오래된 거 아닌가요?
실시간 트레이딩 앱이라면 그렇습니다. 하지만 ETF 학습/참고용 앱에서는 직전 거래일 종가와 최근 추이로도 학습 목적에 충분합니다. 갱신 주기는 명확히 안내하고 있습니다.

Q4. 외부 API가 다운되면 앱이 멈추나요?
아닙니다. 앱은 DB에 저장된 마지막 스냅샷을 읽기 때문에, 외부 API가 일시적으로 실패해도 마지막 데이터를 그대로 보여줄 수 있습니다.

728x90