1. 서론
본 포스트에서는 외환 환율 데이터를 외부 API를 통해 자동으로 수집하고, 이를 CSV 파일로 저장하는 파이썬 프로그램을 소개합니다. 이 코드는 한국수출입은행의 환율 정보를 제공하는 API를 사용하며, 주말에는 데이터가 제공되지 않기 때문에 평일 데이터를 기반으로 동작합니다. 코드의 세부 구현과 파이썬의 다양한 기능을 활용하는 방법에 대해 설명하겠습니다.
2. 코드 개요
제공된 코드는 크게 세 가지 주요 컴포넌트로 구성되어 있습니다:
ExchangeDto
클래스: 외환 데이터를 객체로 표현하는 데이터 전송 객체(Data Transfer Object).ExchangeUtils
클래스: 외부 API로부터 데이터를 가져오고 파싱하는 유틸리티 클래스.ExchangeBatch
클래스: 데이터 수집 및 저장을 관리하는 배치 작업 클래스.
3. 코드 상세 설명
3.1 ExchangeDto 클래스
ExchangeDto
클래스는 외환 환율 데이터를 표현하기 위해 사용됩니다. 각 필드는 외부 API에서 반환되는 정보와 일치하며, 사용자는 이 객체를 통해 필요한 정보를 손쉽게 다룰 수 있습니다.
import requests
import json
import datetime
import csv
from typing import List
# ExchangeDto 클래스는 환율 데이터를 나타내는 DTO 클래스입니다.
# 변수 설명:
# result: 조회 결과 (1: 성공, 2: DATA코드 오류, 3: 인증코드 오류, 4: 일일제한횟수 마감)
# cur_unit: 통화코드
# cur_nm: 국가/통화명
# ttb: 전신환(송금) 받으실때
# tts: 전신환(송금) 보내실때
# deal_bas_r: 매매 기준율
# bkpr: 장부가격
# yy_efee_r: 년환가료율
# ten_dd_efee_r: 10일환가료율
# kftc_deal_bas_r: 서울외국환중개 매매기준율
# kftc_bkpr: 서울외국환중개 장부가격
# search_date: 검색 날짜
class ExchangeDto:
def __init__(self, result: int, cur_unit: str, cur_nm: str, ttb: str, tts: str, deal_bas_r: str, bkpr: str, yy_efee_r: str, ten_dd_efee_r: str, kftc_bkpr: str, kftc_deal_bas_r: str, search_date: str):
self.result = result
self.cur_unit = cur_unit
self.cur_nm = cur_nm
self.ttb = ttb
self.tts = tts
self.deal_bas_r = deal_bas_r
self.bkpr = bkpr
self.yy_efee_r = yy_efee_r
self.ten_dd_efee_r = ten_dd_efee_r
self.kftc_bkpr = kftc_bkpr
self.kftc_deal_bas_r = kftc_deal_bas_r
self.search_date = search_date
이 클래스는 데이터 구조를 이해하기 쉽게 하고, 코드에서 데이터 접근을 용이하게 만듭니다.
3.2 ExchangeUtils 클래스
ExchangeUtils
클래스는 환율 데이터를 가져오는 주요 유틸리티를 제공합니다. 외부 API와의 상호작용 및 데이터 파싱 기능을 담당합니다.
3.2.1 날짜 조정 함수
주말에 데이터가 제공되지 않으므로, 조회 날짜가 주말인 경우 금요일로 자동 조정됩니다.
def get_search_date(self) -> str:
current_date = datetime.datetime.now()
day_of_week = current_date.weekday()
# 토요일 (5), 일요일 (6)
if day_of_week == 5:
return (current_date - datetime.timedelta(days=1)).strftime('%Y%m%d')
elif day_of_week == 6:
return (current_date - datetime.timedelta(days=2)).strftime('%Y%m%d')
return current_date.strftime('%Y%m%d')
3.2.2 외환 데이터 수집 함수
API 요청 시, 헤더에 ‘Accept-Charset’을 설정하여 응답에서 한글이 깨지지 않도록 설정했습니다. 요청이 성공하면 데이터를 parse_json
메서드를 사용하여 파싱합니다.
def get_exchange_data_sync(self) -> List[ExchangeDto]:
search_date = self.get_search_date()
params = {
'authkey': self.auth_key,
'searchdate': search_date,
'data': self.data
}
response = requests.get(self.base_url, params=params, headers={'Accept-Charset': 'utf-8'})
if response.status_code == 200:
return self.parse_json(response.text, search_date)
else:
print(f"Error: {response.status_code}")
return []
3.3 ExchangeBatch 클래스
ExchangeBatch
클래스는 데이터를 수집하고 CSV 파일로 저장하는 배치 작업을 관리합니다. 이 클래스는 주기적으로 실행되어 환율 데이터를 수집하고 저장하는 스케줄러 프로그램에 활용될 수 있습니다.
class ExchangeBatch:
def __init__(self, exchange_utils: ExchangeUtils):
self.exchange_utils = exchange_utils
def run_batch(self):
exchange_data_list = self.exchange_utils.get_exchange_data_sync()
if exchange_data_list:
self.save_to_csv(exchange_data_list)
def save_to_csv(self, exchange_data_list: List[ExchangeDto]):
current_date = datetime.datetime.now().strftime('%Y%m%d')
filename = f"exchange_data_{current_date}.csv"
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
# 헤더 작성
writer.writerow(["result", "cur_unit", "cur_nm", "ttb", "tts", "deal_bas_r", "bkpr", "yy_efee_r", "ten_dd_efee_r", "kftc_bkpr", "kftc_deal_bas_r", "search_date"])
# 데이터 작성
for exchange in exchange_data_list:
writer.writerow([
exchange.result,
exchange.cur_unit,
exchange.cur_nm,
exchange.ttb,
exchange.tts,
exchange.deal_bas_r,
exchange.bkpr,
exchange.yy_efee_r,
exchange.ten_dd_efee_r,
exchange.kftc_bkpr,
exchange.kftc_deal_bas_r,
exchange.search_date
])
print(f"환율 데이터가 '{filename}' 파일로 저장되었습니다.")
3.4 프로그램 실행
if __name__ == "__main__":
auth_key = "본인의 API키를 입력"
data = "AP01"
exchange_utils = ExchangeUtils(auth_key=auth_key, data=data)
exchange_batch = ExchangeBatch(exchange_utils=exchange_utils)
exchange_batch.run_batch()
4. 주요 개념 및 기술
4.1 API 요청 및 응답 처리
Python의 requests
모듈을 사용하여 API 호출을 간편하게 처리할 수 있습니다. 이번 예시에서는 URL에 파라미터를 포함해 GET 요청을 보내고, JSON 형식의 응답을 파싱하여 필요한 데이터를 추출합니다.
4.2 데이터 전송 객체 (DTO)
ExchangeDto
클래스는 데이터의 캡슐화를 통해 코드를 더 명확하게 만들어 줍니다. 이는 데이터베이스와의 상호작용이나 네트워크 프로그래밍 등에서 자주 사용됩니다.
4.3 CSV 파일 저장
환율 데이터를 CSV 형식으로 저장하여 쉽게 읽고 분석할 수 있도록 구현했습니다. csv.writer
를 사용하여 빠르고 효율적으로 파일에 데이터를 기록합니다.
5. 맺음말
본 글에서는 파이썬을 사용하여 외환 환율 데이터를 자동으로 수집하고 CSV 파일로 저장하는 방법을 소개했습니다. 이 코드는 다양한 API 호출 작업에 응용할 수 있으며, 학습 목적으로 또는 실제 업무에서 활용할 수 있는 좋은 예제가 될 것입니다.