본문 바로가기

Server Story....

파이썬으로 MSSQL 데이터 추출 및 자동 전처리 가이드

반응형

MSSQL 데이터 추출 및 자동 전처리



1. 도입 및 배경 (Why?) 💡

지난 포스팅에서 우리는 Windows Server 2022에 설치된 MSSQL의 외부 접속 설정을 마쳤습니다. 이제 그 문을 열고 들어가 데이터를 실제로 가져올 시간입니다.

단순히 데이터를 가져오는 것에 그치지 않고, **파이썬(Python)**을 활용해 지저분한 날 것의 데이터를 포스팅하기 좋은 '정제된 정보'로 바꾸는 자동 전처리 과정을 다뤄보겠습니다.

이 과정은 향후 우리가 만들 수익형 자동화 에이전트의 핵심 엔진이 될 것입니다.


2. 데이터 흐름 및 아키텍처 (What?) 🏗️

전체적인 시스템의 데이터 흐름은 다음과 같습니다. 윈도우 서버의 데이터를 리눅스 서버가 호출하여 요리하는 구조입니다.

Plaintext
 
  [ Win Server ]          [ Network ]          [ Linux Server ]         [ Output ]
     MSSQL      ------>   TCP 51433   ------>   Python (Pandas)  ------>  Clean Data
  (Raw Data)            (Secure Port)          (Preprocessing)          (JSON/CSV)

리눅스 환경에서 윈도우의 MSSQL에 접속하기 위해서는 ODBC 드라이버라는 통역사가 반드시 필요합니다.


3. 사전 준비: 드라이버 및 라이브러리 설치 🛠️

초보자가 가장 많이 헤매는 구간입니다. 리눅스(Ubuntu) 환경에서 MSSQL 접속을 위한 환경을 먼저 구축해야 합니다.

■ 3-1. Microsoft ODBC Driver 설치

터미널을 열고 아래 명령어를 순서대로 입력하세요.

Bash
 
# Microsoft 패키지 저장소 등록
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

# 드라이버 설치
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev

■ 3-2. 파이썬 라이브러리 설치

데이터 접속을 위한 pyodbc와 전처리의 최강자 pandas를 설치합니다.

Bash
 
pip3 install pyodbc pandas

4. 핵심 코드: 데이터 추출 및 전처리 (Step-by-Step) 🐍

이제 실제 코드를 작성해 보겠습니다. 보안을 위해 접속 정보는 변수 처리하는 습관을 들입시다.

■ 4-1. DB 연결 및 추출 스크립트 (db_extractor.py)

Python
 
import pyodbc
import pandas as pd

# 1. 접속 정보 설정 (본인의 환경에 맞게 수정)
DB_CONFIG = {
    'server': '192.168.1.100,51433', # 윈도우 서버 IP와 변경한 포트
    'database': 'MyStorage',
    'username': 'agent_user',
    'password': 'YourPassword123!'
}

# 2. 연결 문자열 생성 (TrustServerCertificate 옵션은 자체서명 인증서 사용 시 필수)
conn_str = (
    f"DRIVER={{ODBC Driver 18 for SQL Server}};"
    f"SERVER={DB_CONFIG['server']};"
    f"DATABASE={DB_CONFIG['database']};"
    f"UID={DB_CONFIG['username']};"
    f"PWD={DB_CONFIG['password']};"
    f"TrustServerCertificate=yes;"
)

def get_refined_data(query):
    try:
        # DB 연결
        conn = pyodbc.connect(conn_str)
        
        # Pandas를 이용해 쿼리 결과를 데이터프레임으로 바로 읽기
        df = pd.read_sql(query, conn)
        
        # --- [자동 전처리 구간] ---
        # 1. 결측치 처리 (빈 값은 'N/A'로 채움)
        df = df.fillna('N/A')
        
        # 2. 날짜 형식 통일 (YYYY-MM-DD)
        if 'reg_date' in df.columns:
            df['reg_date'] = pd.to_datetime(df['reg_date']).dt.date
            
        # 3. 불필요한 공백 제거
        df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
        
        conn.close()
        return df

    except Exception as e:
        print(f"❌ 데이터 추출 중 오류 발생: {e}")
        return None

# 실행 예시
if __name__ == "__main__":
    sql = "SELECT TOP 10 title, reg_date, content FROM PostTable ORDER BY reg_date DESC"
    data = get_refined_data(sql)
    if data is not None:
        print(data.head())

5. 시니어의 한 수: 왜 Pandas인가? 📊

단순히 SELECT만 한다면 일반적인 라이브러리로도 충분합니다. 하지만 우리가 Pandas를 쓰는 이유는 '자동화의 유연성' 때문입니다.

  • 중복 제거: df.drop_duplicates() 한 줄로 중복 데이터를 날릴 수 있습니다.
  • 형식 변환: DB의 복잡한 날짜 데이터를 블로그에 올리기 좋은 텍스트 형식으로 즉시 변환합니다.
  • 통계 요약: 수집된 데이터의 평균, 최댓값 등을 계산해 리포트 형태의 포스팅 초안을 잡기 유리합니다.

6. 트러블슈팅: 당신이 마주칠 에러들 🛠️

🚨 에러: Can't open lib 'ODBC Driver 18...'

  • 원인: 드라이버 설치가 제대로 안 되었거나, 연결 문자열의 드라이버 이름이 설치된 버전과 다를 때 발생합니다.
  • 해결: odbcinst -q -d 명령어로 설치된 드라이버의 정확한 이름을 확인한 후 코드에 반영하세요.

🚨 에러: Login timeout expired

  • 원인: 윈도우 서버의 방화벽이 막혀있거나, MSSQL 서비스가 포트 51433에서 대기 중이 아닐 때 발생합니다.
  • 해결: 이전 포스팅의 [방화벽 설정] 단계를 다시 확인해 보세요.

🔍 더 알아보기

이 시스템과 연동되는 다른 가이드가 궁금하다면, 제 블로그 검색창에 아래 키워드를 입력해 보세요!

  • "MSSQL 보안": 윈도우 서버 DB 접속 권한 및 포트 설정 방법
  • "Slack 알림": 데이터 추출 실패 시 실시간으로 알림을 받는 법
  • "Docker": 파이썬 에이전트를 컨테이너로 띄워 관리하는 법
반응형