회사에서 애플리케이션 API 서버를 개발하며, Tibero에 적재된 데이터를 불러오는 모듈을 개발할 일이 생겼다.
Tibero 데이터 I/O 모듈의 위치는 다음 그림에서와 같고, 데이터베이스로부터 데이터를 추출해 Preparation 모듈로 넘기는 역할을 담당한다.
애플리케이션 API 서버 및 애플리케이션 내 AI 모델을 Python으로 개발할 예정이기 때문에, Tibero 데이터 I/O 모듈도 Python으로 개발하고자 한다.
Tibero의 tbCLI는 DBMS와의 연결을 지원하기 위해 ODBC, JDBC를 지원한다. 사실 Python에는 각 데이터베이스와 연동을 지원하는 라이브러리가 있는데(예컨대, mysql과 연동하기 위해서는 pymysql 등을 사용하면 된다.), 아직 Tibero와의 연동을 지원하는 라이브러리는 없다. 다만, Tibero는 ODBC 방식을 사용할 수 있도록 Tibero ODBC 드라이버를 제공하고 있고, 공식 문서에 Python과 연동하기 위해 pyodbc 라이브러리를 사용하라고 설명하고 있다.
이 글은 Tibero 데이터 I/O 모듈을 개발하는 과정에서 어떻게 ODBC 드라이버를 설정하고, pyodbc를 통해 Python과 연동할 수 있는지를 다룬다. 사실 며칠 동안 너무 많은 삽질을 한 게 아까워서 기억하고 싶어서..
Windows 10과 Ubuntu 20.04 환경에서 모두 개발을 진행해 보았다. OS는 다르지만, 모두 다음과 같은 동일한 과정을 거친다.
- Tibero 클라이언트 설치
- ODBC 설치
- ODBC DSN 설정
처음에는 운영체제가 다른 것에 익숙하지 않아 어려움을 많이 겪었는데, 이후 정리하면서 보니 기본적으로 GUI에서 진행하는지 터미널에서 진행하는지, 파일 경로가 어디에 위치하는지 정도에서 차이가 나고, 각 단계별 진행 과정은 별반 다르지 않음을 깨달을 수 있었다.
# Windows 10
## tbCLI 설치
티베로6 클라이언트를 다운로드한 뒤, 다음과 같이 환경변수를 설정한다.
## tbodbc 드라이버 설치
이후 tbodbc 드라이버를 다운로드해 설치한다. Windows 10 64비트 운영체제이더라도, 32비트 클라이언트 프로그램을 다운로드 받아 설치해야 한다. 엄청난 삽질의 시작이었다.
tibero6을 64비트 버전으로 다운로드했더니, (당연히) 안에 포함되어 있는 ODBC 드라이버는 64비트 버전이었다. 그런데 이 드라이버를 설치하면, ODBC 데이터 원본(64비트)에서 Tibero 드라이버를 아예 발견할 수가 없다. 64비트 드라이버 자체가 레지스트리에 아예 등록이 되지 않았는데, 이유를 알고 싶어서 구글링해 봐도 32비트 프로그램을 받아야 된다는 글밖에 찾을 수 없었다.
32비트 드라이버를 설치한 후, ODBC 데이터 원본 관리자(32비트)를 열어 확인하면, 다음과 같이 Tibero ODBC 드라이버가 잘 등록된 것을 볼 수 있다.
참고: ODBC 데이터 원본 관리자 위치
윈도우 검색 창에서 ODBC 데이터 원본 관리자를 검색하면 되지만, 사실 32비트와 64비트 원본 관리자는 서로 다른 경로에 저장되어 있다.
- ODBC 데이터 원본 관리자(32비트): C:\Windows\SysWOW64\odbcad32.exe
- ODBC 데이터 원본 관리자(64비트): C:\Windows\System32\odbcad32.exe
32비트와 64비트에서 돌아가는 프로그램은 서로 다른 경로에서 관리되는 듯하다.
어찌 되었든, 이런 이유로 Windows 10 환경에서 개발을 할 때는, 이후 Python 32비트 인터프리터로 개발해야 한다. Python 64비트 인터프리터를 사용하면, 이후 단계에서 다 성공을 했더라도 '[ODBC] 지정된 DSN은 드라이버와 응용 프로그램 간 아키텍처 불일치를 포함합니다.'와 같은 에러를 마주하게 된다.
## DSN 설정
ODBC 데이터 원본 관리자에서 Tibero ODBC 드라이버를 찾을 수 있으면, DSN을 설정하면 된다. DSN은 접근하고자 하는 데이터베이스 내 데이터 원본, 그리고 그 원본에 접근하기 위해 필요한 ODBC 연결에 대한 정보를 담고 있다.
시스템 DSN은 시스템 전체에서 사용되는 DSN으로, 권한이 있는 모든 사용자가 로그인할 수 있다. 반면, 사용자 DSN은 특정 사용자에 대해서만 만든 DSN이다. 지금은 GUI로 쉽게 구분되지만, 이후 Ubuntu에서 설정할 때는 설정 파일의 경로가 달라지므로 주의해야 한다. 일단 지금 단계에서는 사용자 별로 DSN을 다르게 설정해야 할 이유는 없으므로(추후 도커 이미지를 만드는 과정에서는 달라질 수 있으려나), 시스템 DSN을 설정한다. DSN 설정 시 데이터베이스 접근을 위한 서버 IP, Port 등을 입력한다. 해당 정보는 이후 우분투에서 DSN을 설정할 때에도 그대로 사용된다.
설정 후, Test 버튼을 클릭해 연결이 성공하는지 확인해 보자.
# Linux(Ubuntu 20.04)
기본적으로 ODBC는 마이크로소프트에서 개발한 것이다. 이를 NIX 계열 운영체제에서 사용하기 위해서는 다른 라이브러리를 사용해야 하는데, 주로 Unix ODBC나 iODBC가 사용된다.
Tibero 공식 문서에서는 iODBC를 기준으로 설정하는 방법을 설명하고 있지만, 나는 Unix ODBC를 이용해 연결을 진행했기 때문에 해당 방법을 기록하도록 한다. 다행히(?) Linux에서는 tbCLI와 ODBC 드라이버가 동일하게 64비트여도 된다. 이 부분에서는 훨씬 간편했지만, 명령어, 커맨드 창이 익숙하지 않아 솔찬히 삽질했다.
## tbCLI 다운로드
Linux 64비트 tbCLI 프로그램을 설치한다.
## odbc 설치
apt 패키지 매니저를 통해 unixodbc, odbcinst를 설치한다.
apt install unixodbc
apt install odbcinst
설치가 잘 되었는지 확인해 보자.
eraser@eraser-desktop:/etc$ which isql
/usr/bin/isql
eraser@eraser-desktop:/etc$ odbcinst -j
unixODBC 2.3.9
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/eraser/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
## ODBC 드라이버 설정
tibero6을 설치한 경로에 보면, tibero6/client/lib에 libtbodbc.so 파일이 있는 것을 확인할 수 있다. 이 파일이 Linux 운영체제에서의 Tibero ODBC 드라이버이다.
해당 드라이버를 사용하기 위해, ODBC 드라이버 위치를 지정하는 odbcinst.ini 파일을 작성한다. 경로는 /etc/odbcinst.ini이다. "ODBC 방식으로 Tibero에 연결하고자 할 때는 이 드라이버를 사용해라" 정도로 이해하자.
odbcinst configuration 정보는 터미널에서 odbcinst -j 명령어를 통해 확인할 수 있다.
## DSN 설정
상술했듯, Linux 운영체제에서는 시스템 DSN과 사용자 DSN 설정 파일의 경로가 달라진다. 시스템 DSN은 root 디렉토리 하에, 사용자 DSN은 ~ 디렉토리 하에 존재하며, 파일 이름도 전자의 경우 odbc.ini, 후자의 경우 .odbc.ini가 된다. 즉, 시스템 DSN 설정은 /etc/odbc.ini에서, 사용자 DSN 설정은 ~/.odbc.ini에서 한다.
아래와 같이 시스템 DSN을 설정하자. [ODBC]에는 로그 파일의 추적 여부 및 그 단계, 추적 파일의 경로를 지정하고, 그 아래에 DSN 연결 시 사용할 정보를 작성하면 된다. 이 때 설정한 DSN 이름을 이후 접속 단계에서 계속 사용하게 된다. 나는 [tibero]로 설정했다.
2021.09.25. 내용 추가
- 간혹 dsn 연결 오류가 생기면, 설정 후 `odbcinst -i -s -f [odbc.ini 파일 경로]` 명령을 통해 Datasource를 등록해 주었는지 확인해 보자.
- odbc.ini 파일을 설정할 때, 위의 사진처럼 Driver 경로를 전부 다 명시해 주어도 되지만, 아래와 같이 odbcinst.ini에 설정해 놓은 Driver 이름을 그대로 사용해도 된다.
[tibero] Description=Tibero6 data source Driver=Tibero SERVER= ...
설정 후 접속이 되는지 확인해 보자. 터미널에서 isql 명령어를 사용하면 된다. 만약 위에서 DSN 정보에 사용자와 패스워드 정보를 설정하지 않았다면, 인자로 사용자와 패스워드까지 인자로 넘겨야 한다.
# Python에서 데이터 불러 오기
위와 같이 DSN 설정을 완료한 뒤, 접속에 성공하는 것까지 확인했다면, Python에서 연동할 차례다. pyodbc 라이브러리를 사용해 아래 코드를 작성하면 된다. "x"라는 데이터베이스 테이블에 접근해 각 컬럼의 정보를 출력하는 간단한 코드이다. 연결 시 연결 문자열에는 DSN 정보를 넣어 주면 된다. 위에서와 마찬가지로 DSN 정보에 사용자와 패스워드 정보가 존재하지 않는다면, 연결 문자열에 UID, PWD를 추가해주어야 한다. 또한, Windows 10 환경에서는 Python3 32bit를 설치해야 한다.
import pyodbc as odbc
conn = odbc.connect("DSN=tibero")
cursor = conn.cursor()
for row in cursor.columns(table="x"):
print(row)
위와 같은 과정을 거쳐 Tibero 데이터 I/O 모듈 개발을 위한 기본 작업을 마칠 수 있었다. 적지 않은 고생을 했는데, 돌이켜 보니 별 것 아닌데 내가 너무 몰라서 그랬던 것 같기도. 감사하게도 잘 정리된 글들 덕에 많이 배울 수 있었다.
https://jinisbonusbook.tistory.com/65
https://blog.boxcorea.com/wp/archives/2881
앞으로 모듈을 개발하는 과정에서 더 연구해 보고 싶은 부분은 다음과 같다.
- 사용자가 매 번 앱에 요청을 날릴 때마다 DSN을 설정해 주어야 하는가?
- DSN 설정 시 모듈에서 configuration 정보를 어디다 보관하고, 어떻게 설정해야 하는가
- DSN 설정을 위한 shell script를 어떻게 작성해야 하는가
- Django에서 pyodbc를 연결해 데이터를 추출할 수 있는가?
'Backend > AI App Server' 카테고리의 다른 글
[ELK] AI 모델링 시각화 (5) | 2022.03.15 |
---|---|
[App Server] Flask로 AI 백엔드 서버 구축해 보기 (0) | 2021.12.23 |
[Tibero] Tibero에서 UPSERT 쿼리 구현하기 (0) | 2021.10.18 |
[App Server] Flask, Socket으로 앱 서버 구축해 보기 (0) | 2021.08.13 |