본문 바로가기

End-to-End 프로젝트

End-to-End 연습1_AWS 환경 구축

[파이썬/AWS] yfinance 주가 데이터를 AWS RDS MySQL에 적재하고 DBeaver로 확인하기

안녕하세요! 오늘은 파이썬으로 금융 데이터를 수집하여 AWS RDS(MySQL) 클라우드 데이터베이스에 적재하고, DBeaver를 통해 데이터베이스를 확인하는 전체 데이터 파이프라인 기초 과정을 정리해 보려고 합니다.

1. AWS RDS(MySQL) 데이터베이스 준비

가장 먼저 클라우드 환경에 데이터를 저장할 데이터베이스를 준비합니다.

  1. AWS 콘솔 검색창에 RDS를 검색한 후 서비스 목록에서 Aurora and RDS를 선택합니다.
  2. MySQL 인스턴스를 생성하고, 퍼블릭 액세스 허용 및 보안 그룹(3306 포트) 설정을 완료합니다.

2. DBeaver와 AWS RDS 연결 및 SSL 설정

클라우드 DB에 데이터가 잘 들어가는지 확인하기 위해 데이터베이스 관리 툴인 DBeaver와 연결해 줍니다. AWS RDS는 보안 연결이 중요하므로 SSL 인증서를 등록해 주어야 합니다.

  1. DBeaver에서 MySQL 연결을 추가하고 Host, Database, Username, Password 정보를 입력합니다.
  2. + SSH, SSL, ... 버튼을 눌러 SSL 탭으로 이동합니다.
  3. Require SSL에 체크하고, AWS 보안 인증서 파일인 global-bundle.pem 경로를 지정해 줍니다.

3. Python으로 데이터 수집 및 RDS 적재

이제 파이썬의 yfinance 라이브러리로 삼성전자 주가 데이터를 수집하고, SQLAlchemy 및 PyMySQL을 이용해 RDS에 데이터를 집어넣는 코드를 작성합니다.

Python
 
import yfinance as yf
import pandas as pd
from sqlalchemy import create_engine, text
import urllib.parse

# 1. 삼성전자 데이터 수집
df = yf.download("005930.KS", start="2026-07-01", end="2026-07-09")
df = df.reset_index()

# [트러블슈팅] yfinance 업데이트로 인한 MultiIndex 컬럼명을 1줄로 단일화
df.columns = df.columns.get_level_values(0)

# 2. 계정 정보 및 비밀번호 안전 인코딩
db_password = "your_password!"
safe_password = urllib.parse.quote_plus(db_password) # 특수문자 인코딩 
db_endpoint = "your-rds-endpoint.amazonaws.com"

# 3. 1차 접속 (기본 연결 후 데이터베이스 생성)
base_url = f"mysql+pymysql://admin:{safe_password}@{db_endpoint}:3306"
base_engine = create_engine(base_url, connect_args={"ssl": {"ca": "./global-bundle.pem"}})

with base_engine.connect() as conn:
    conn.execute(text("CREATE DATABASE IF NOT EXISTS yfinance_db"))

# 4. 2차 접속 및 데이터 적재
final_url = f"mysql+pymysql://admin:{safe_password}@{db_endpoint}:3306/yfinance_db"
engine = create_engine(final_url, connect_args={"ssl": {"ca": "./global-bundle.pem"}})

# 5. 데이터 적재
df.to_sql(name='samsung_stock', con=engine, if_exists='replace', index=False)
print("AWS MySQL DB에 데이터 저장 완료")

💡 팁 & 트러블슈팅 (Troubleshooting)

  • 특수문자 비밀번호 인코딩: DB 비밀번호에 @, ! 등의 특수문자가 포함된 경우 SQLAlchemy URL 파싱 오류가 발생하므로 urllib.parse.quote_plus()로 인코딩해야 합니다.
  • MultiIndex 컬럼 정돈: yfinance가 반환하는 DataFrame의 컬럼이 2줄(MultiIndex) 형태일 수 있어, 그대로 DB에 적재하면 ('Close', '005930.KS') 같은 이상한 컬럼명이 생깁니다. df.columns.get_level_values(0)로 1줄로 평평하게 다듬어주는 작업이 필수입니다!

4. DBeaver에서 데이터 및 SQL 필터링 확인

파이썬 코드 실행 후 DBeaver로 돌아와 데이터가 정상적으로 들어왔는지 확인합니다.

  1. yfinance_db > Tables > samsung_stock 테이블을 더블클릭하여 Data 탭에서 적재된 주가 데이터를 확인합니다.
  1. 특정 조건의 데이터를 검색하고 싶다면 상단 필터 바에 Close > 30000 형태의 WHERE 조건만 입력하거나, Ctrl + Alt + T를 눌러 SQL Editor에서 직접 쿼리문을 작성할 수 있습니다.
SQL
 
SELECT * 
FROM yfinance_db.samsung_stock 
WHERE Close > 30000;

🎯 마치며

이번 실습을 통해 [API/라이브러리 데이터 수집 ➔ Python 전처리 ➔ AWS RDS MySQL 클라우드 적재 ➔ DBeaver GUI 관리]까지의 전체적인 흐름을 이해할 수 있었습니다.

다음에는 이 파이프라인을 매일 자동으로 실행하도록 스케줄러(Airflow 또는 AWS Lambda)를 붙여보는 작업도 도전해 보겠습니다!