본문 바로가기
데이터

파이썬으로 ETL구현해보기 ETL구현 예제소스

by 웨더맨 2025. 8. 25.
반응형

파이썬을 사용해 MSSQL 데이터베이스에서 데이터를 추출(Extract)하여 CSV 파일로 적재(Load)하는, 간단한 ETL 형태의 소스 코드를 보여드리겠습니다.

여기서는 가장 널리 사용되는 라이브러리인 pandas pyodbc를 사용하겠습니다.

  • pyodbc: 데이터베이스에 연결하기 위한 라이브러리 (ODBC 드라이버 필요)
  • pandas: 데이터를 다루고(Transform), CSV로 저장(Load)하는 데 매우 편리한 라이브_러리

1단계: 필요 라이브러리 설치

터미널이나 명령 프롬프트에서 아래 명령어를 실행하여 필요한 라이브러리를 설치합니다.

Bash
pip install pandas pyodbc

2단계: ODBC 드라이버 확인 및 설치 (중요!)

pyodbc는 컴퓨터에 설치된 ODBC 드라이버를 통해 데이터베이스와 통신합니다. MSSQL에 연결하려면 Microsoft에서 제공하는 ODBC 드라이버가 필요합니다.

  • Windows: 보통 최신 버전의 Windows에는 드라이버가 내장되어 있거나 SQL Server Management Studio(SSMS)를 설치할 때 함께 설치됩니다. 만약 없다면 아래 링크에서 설치하세요.
  • macOS/Linux: 별도로 드라이버를 설치해야 합니다.

Microsoft ODBC Driver for SQL Server 다운로드 페이지

설치 후, 사용 가능한 드라이버 이름을 확인해야 합니다. 일반적인 이름은 다음과 같습니다.

  • ODBC Driver 17 for SQL Server (권장)
  • ODBC Driver 18 for SQL Server
  • SQL Server Native Client 11.0
  • SQL Server

3단계: 파이썬 코드 작성

아래는 전체 프로세스를 담은 파이썬 스크립트입니다. 설정 부분만 자신의 환경에 맞게 수정하여 사용하시면 됩니다.

기본 예제 코드

이 코드는 가장 간단한 형태로, 연결-추출-저장 과정을 보여줍니다.

Python
import pandas as pd
import pyodbc
import sys

# --- 1. 설정 정보 (사용자 환경에 맞게 수정) ---
DB_CONFIG = {
    # 사용 가능한 ODBC 드라이버 이름을 정확히 입력해야 합니다.
    'driver': '{ODBC Driver 17 for SQL Server}', 
    'server': 'YOUR_SERVER_ADDRESS',  # 예: 'localhost', '192.168.0.100', 'server.database.windows.net'
    'database': 'YOUR_DATABASE_NAME',
    'username': 'YOUR_USERNAME',
    'password': 'YOUR_PASSWORD',
    # 윈도우 인증(Windows Authentication)을 사용할 경우 아래 주석을 해제하고 username/password는 주석 처리
    # 'trusted_connection': 'yes', 
}

# 추출할 데이터를 정의하는 SQL 쿼리
SQL_QUERY = """
SELECT 
    column1,
    column2,
    column3
FROM 
    YourTableName
WHERE 
    some_condition = 'some_value';
"""

# 저장할 CSV 파일 경로
OUTPUT_CSV_PATH = 'output_data.csv'


# --- 2. ETL 프로세스 실행 ---
def run_etl():
    """MSSQL에서 데이터를 추출하여 CSV로 저장하는 메인 함수"""
    
    connection = None  # 초기화
    try:
        # --- E (Extract): 데이터 추출 ---
        print("1. 데이터베이스에 연결 중...")
        
        # 윈도우 인증 여부에 따라 연결 문자열 생성
        if 'trusted_connection' in DB_CONFIG:
            conn_str = f"DRIVER={DB_CONFIG['driver']};SERVER={DB_CONFIG['server']};DATABASE={DB_CONFIG['database']};TRUSTED_CONNECTION={DB_CONFIG['trusted_connection']}"
        else:
            conn_str = f"DRIVER={DB_CONFIG['driver']};SERVER={DB_CONFIG['server']};DATABASE={DB_CONFIG['database']};UID={DB_CONFIG['username']};PWD={DB_CONFIG['password']}"
        
        connection = pyodbc.connect(conn_str)
        print("   연결 성공.")
        
        print(f"2. 쿼리 실행 및 데이터 추출 중...")
        # pandas의 read_sql 함수를 사용하면 쿼리 결과를 바로 DataFrame으로 가져올 수 있어 매우 편리합니다.
        df = pd.read_sql(SQL_QUERY, connection)
        print(f"   총 {len(df)}개의 행을 추출했습니다.")

        # --- T (Transform): 데이터 변환 (이 예제에서는 간단한 변환은 생략) ---
        # 이 단계에서 데이터 클렌징, 새로운 컬럼 추가, 데이터 타입 변경 등의 작업을 수행할 수 있습니다.
        # 예: df['new_column'] = df['column1'] * 1.1 
        print("3. 데이터 변환 단계 (이 예제에서는 생략됨).")


        # --- L (Load): 데이터 적재 ---
        print(f"4. CSV 파일로 저장 중: {OUTPUT_CSV_PATH}")
        # index=False: DataFrame의 인덱스(0, 1, 2...)는 CSV에 저장하지 않음
        # encoding='utf-8-sig': 한글 깨짐 방지. Excel에서 열 때 BOM(Byte Order Mark)이 있어 깨지지 않음
        df.to_csv(OUTPUT_CSV_PATH, index=False, encoding='utf-8-sig')
        print("   저장 완료!")

    except Exception as e:
        print(f"오류가 발생했습니다: {e}", file=sys.stderr)

    finally:
        # --- 작업 완료 후 연결 종료 ---
        if connection:
            connection.close()
            print("5. 데이터베이스 연결을 해제했습니다.")

# --- 스크립트 실행 ---
if __name__ == "__main__":
    run_etl()

코드 설명

  1. 설정 정보 (DB_CONFIG, SQL_QUERY, OUTPUT_CSV_PATH)
    • ETL 작업에 필요한 모든 설정(DB 접속 정보, 쿼리, 결과 파일 경로)을 코드 상단에 모아두어 관리하기 쉽게 만들었습니다.
    • DB_CONFIG 딕셔너리에 자신의 데이터베이스 환경에 맞는 정보를 입력합니다.
    • 윈도우 인증을 사용한다면 username, password를 주석 처리하고 'trusted_connection': 'yes'를 활성화하세요.
  2. E: Extract (추출)
    • pyodbc.connect() 함수를 사용하여 MSSQL 데이터베이스에 연결합니다.
    • pd.read_sql(SQL_QUERY, connection)는 가장 핵심적인 부분입니다. 지정된 SQL_QUERY를 실행하고 그 결과를 pandas DataFrame이라는 표 형태의 데이터 구조로 한 번에 가져옵니다.
  3. T: Transform (변환)
    • 이 예제에서는 특별한 변환 작업을 하지 않았지만, 실제 ETL에서는 이 단계가 매우 중요합니다.
    • 추출된 DataFrame (df)을 가공하는 코드를 이 위치에 추가할 수 있습니다. (예: 특정 컬럼의 값 바꾸기, 날짜 형식 변경, 파생 변수 생성 등)
  4. L: Load (적재)
    • df.to_csv(OUTPUT_CSV_PATH, ...) 함수를 사용하여 DataFrame을 CSV 파일로 저장합니다.
    • index=False: CSV 파일에 불필요한 인덱스 번호가 저장되는 것을 방지합니다.
    • encoding='utf-8-sig': 한글 데이터가 있다면 필수적입니다. 이 인코딩은 Excel이 UTF-8 파일을 올바르게 인식하도록 도와주어 한글 깨짐을 방지합니다.
  5. 예외 처리 및 연결 종료 (try...except...finally)
    • try...except 블록은 작업 중 발생할 수 있는 오류(DB 연결 실패, 쿼리 오류 등)를 잡아내어 프로그램을 비정상적으로 종료시키지 않고 원인을 출력해줍니다.
    • finally 블록은 try 블록의 성공/실패 여부와 관계없이 항상 실행됩니다. 데이터베이스 연결을 확실하게 닫아주기 위해 사용하며, 리소스를 안전하게 반환하는 좋은 습관입니다.

실행 방법

  1. 위 코드를 mssql_to_csv.py 와 같은 이름으로 저장합니다.
  2. 코드 상단의 설정 정보 부분을 자신의 환경에 맞게 정확히 수정합니다.
  3. 터미널에서 아래 명령어로 스크립트를 실행합니다.
  4. Bash
    python mssql_to_csv.py

실행이 성공적으로 완료되면 스크립트가 있는 폴더에 output_data.csv 파일이 생성된 것을 확인할 수 있습니다.

728x90
반응형

댓글