
1. 도입 및 배경 (Why?) 💡
지난 포스팅에서 우리는 Windows Server 2022에 설치된 MSSQL의 외부 접속 설정을 마쳤습니다. 이제 그 문을 열고 들어가 데이터를 실제로 가져올 시간입니다.
단순히 데이터를 가져오는 것에 그치지 않고, **파이썬(Python)**을 활용해 지저분한 날 것의 데이터를 포스팅하기 좋은 '정제된 정보'로 바꾸는 자동 전처리 과정을 다뤄보겠습니다.
이 과정은 향후 우리가 만들 수익형 자동화 에이전트의 핵심 엔진이 될 것입니다.
2. 데이터 흐름 및 아키텍처 (What?) 🏗️
전체적인 시스템의 데이터 흐름은 다음과 같습니다. 윈도우 서버의 데이터를 리눅스 서버가 호출하여 요리하는 구조입니다.
[ 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 설치
터미널을 열고 아래 명령어를 순서대로 입력하세요.
# 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를 설치합니다.
pip3 install pyodbc pandas
4. 핵심 코드: 데이터 추출 및 전처리 (Step-by-Step) 🐍
이제 실제 코드를 작성해 보겠습니다. 보안을 위해 접속 정보는 변수 처리하는 습관을 들입시다.
■ 4-1. DB 연결 및 추출 스크립트 (db_extractor.py)
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": 파이썬 에이전트를 컨테이너로 띄워 관리하는 법
'Server Story....' 카테고리의 다른 글
| 파이썬 셀레니움(Selenium): 동적 웹 데이터 수집 자동화 가이드 (0) | 2026.04.03 |
|---|---|
| 도커(Docker)로 파이썬 에이전트 24시간 무중단 가동하기 (0) | 2026.04.03 |
| 서버 가동률 99.9% 도전: Slack 실시간 장애 알림 시스템 구축 (0) | 2026.04.02 |
| Windows Server 2022: MSSQL 외부 접속 설정 및 필수 보안 강화 (0) | 2026.04.02 |
| 리눅스 서버 용량 확장: NFS 연결과 /etc/fstab 자동 마운트 완벽 가이드 (0) | 2026.04.01 |