리눅스에서 Unix ODBC를 사용해보자

안녕하세요. 2018년의 연말이 다가왔습니다. 오늘은 2018년의 마지막 포스트로 우분투에서 Unix ODBC를 설정하는 방법에 대해 알아보도록 하겠습니다.


What is ODBC?

Unix ODBC를 설치하기 전에, ODBC가 무엇인지에 대해 간단히 알아보도록 하겠습니다. ODBC는 Open DataBase Connectivity의 약자로 우리 말로는 데이터베이스 미들웨어를 연결하기 위한 공개형 응용 프로그램 인터페이스라 합니다. 한마디로 말하자면 데이터베이스 애플리케이션과 연결해주는 공개형 인터페이스라는 것이죠.

ODBC는 Microsoft에서 주니어 개발자가 데이터베이스에 쉽게 연동할 수 있도록 개발한 애플리케이션 인터페이스(API)입니다. 본래 우리가 새로운 응용 프로그램을 개발하기 위해 데이터베이스를 이용해야 한다면 어떠한 연결체이든지 소켓(Socket)을 직접 사용하여 해당 서버와 통신할 수 있는 클라이언트 클래스 혹은 모듈을 별도로 개발해야 했습니다. 하지만 ODBC는 이러한 개발을 별도로 구성하지 않고 모든 데이터베이스 미들웨어가 이러한 API를 표준으로 채택하여 모든 DBMS를 연결할 수 있도록 한 것입니다.

그렇다면 본래 ODBC가 나오기 이전에는 어떻게 DBMS에 연결할 수 있었을까요?

위에서 말한 것처럼 직접 C 혹은 C++와 같은 로우 레벨 언어에서 TCP Socket 등을 이용하여 클라이언트체를 구현하거나 혹은 MySQL이면 해당 개발자들이 제공해주는 특정 API를 사용하여야 했습니다. 물론 이 방법은 Microsoft SQL Server이면 MS-SQL API, Oracle이면 Oracle 용 API가 별도로 존재하겠지요. 하지만 이 방법은 각각의 DBMS 별로 별도의 API를 사용하여야 하기 때문에 사용법을 개별적으로 익혀야 한다는 단점이 존재합니다.

하지만 ODBC는 표준 API이고 모두가 같은 함수와 메소드를 사용하지만 연결 형태만 달리 주어진 것이기 때문에 개발자 입장에서 좀 더 편하게 DBMS와 연동할 수 있는 장점을 제공해줍니다.

그에 반해 단점도 존재합니다. ODBC는 직접 API를 사용하는 것보다 속도가 느립니다. 왜 그럴까요? 그것은 직접 제공해주는 API를 사용하기 이전에 드라이버 단계를 한 단계 더 거치기 때문이죠. 개발자에게 그만큼의 편의성을 제공해주지만 연결에 있어서는 그만큼의 속도 문제도 감수해야 할 것입니다.

ODBC가 동작하는 것을 간단히 살펴보면, 애플리케이션에서 중간에 인터페이스 형태로 존재하는 레이어를 거쳐 각각 개발자가 사용하려 하는 DBMS 드라이버(API)를 호출했을 때 해당 드라이버가 데이터베이스에 접속하는 형태를 가지게 됩니다. 

이는 직접 애플리케이션에서 Socket을 생성하여 네트워크 레이어를 거치는 것보다 느릴 수 밖에 없습니다. ODBC를 사용하면 두 개의 레이어를 거쳐야하기 떄문이죠.


Unix ODBC

앞서 말했던 것처럼 ODBC는 Microsoft에서 개발한 통합 DBMS API 입니다. 이를 NIX 계열 운영체제에서 사용할 수 있도록 개발한 것이 바로 Unix ODBC입니다. Unix ODBC는 ODBC의 오픈 소스 프로젝트 중 하나로 Microsoft ODBC를 비 Windows 운영체제에서 사용할 수 있도록 최종 표준으로 만들어내는 것이 목적입니다.

Unix ODBC

우리는 이제 이를 사용하여 리눅스 운영체제에서 ODBC 드라이버를 사용하는 것을 실습해보고, (대표적으로 우분투 리눅스를 사용) 테스트 해보는 시간을 가져보도록 하겠습니다.


How to install

먼저 unixodbc를 사용하기 위해 운영체제에 unixodbc 모듈을 설치해야 합니다.

$ sudo apt install unixodbc unixodbc-dev

Ubuntu는 레포지터리에서 쉽게 unixodbc를 받을 수 있습니다.

혹은 다른 리눅스에서 설치하거나 레포지터리가 아닌 직접 빌드하여 설치하고 싶으신 분들은 아래의 절차를 진행합니다.

$ wget http://www.unixodbc.org/unixODBC-2.3.7.tar.gz

unixodbc 프로젝트 홈페이지에서 수동으로 unixODBC 코드를 다운로드 받습니다.

$ tar xvf unixODBC-2.3.7.tar.gz

tar 명령어를 사용하여 tar.gz 파일의 압축을 해제합니다.

$ sudo ./configure --prefix=/

여기서 중요합니다. 이 부분은 여러분들 PC에 unixODBC 모듈을 어디에 설치할지 설정해주는 명령어입니다. 우분투에서 레포지터리에 있는 것을 받아 설치할 경우 위의 값이 기본값입니다. 하지만 여러분들이 직접 다른 곳에 설치하려면 다른 경로를 잡을 수 있습니다. 리눅스 권한 등을 고려하시어 알맞은 명령어를 사용하시는 것을 추천드립니다.

$ make

Configuration이 정상적으로 완료되었으면 이제 컴파일을 시도히여 바이너리 파일을 생성합니다. 이 바이너리 파일이 여러분들이 사용하게 될 unixODBC 모듈입니다. 

$ make install

마지막으로 컴파일된 바이너리 파일을 위에서 지정한 prefix path에 설치하도록 합니다. 이 작업까지 마치면 무사히 unixODBC 설치가 완료됩니다.


How to use

이제 설치가 모두 끝났으니 DBMS에 연동하는 방법에 대해 알아보도록 하겠습니다. 그 전에 unixODBC의 구성이 어떻게 구성되어 있는지 알아보도록 하죠.

* odbcinst.ini

* odbc.ini

unixODBC에서 DBMS를 연동하기 위해서 위의 두 개의 구성 파일을 건드려야 합니다. 각각의 파일이 무슨 역할을 하는지 알아보겠습니다. 

odbcinst.ini 파일은 해당 운영체제에서 사용할 DBMS의 ODBC 드라이버 정보를 보관해 놓는 파일입니다. 이를테면 PostgreSQL을 연동하기 위해서 PostgreSQL 드라이버를 사용해야 하는데, 이 ODBC 드라이버의 위치를 지정해줘야 한다는 것이죠. 위에서 설명드린 것을 베이스로 말씀드리자면 PostgreSQL에서 제공해주는 API 위치를 적어놓는 파일입니다.

PostgreSQL에서는 두 가지의 드라이버가 존재합니다. 한 개는 ANSI 인코딩 환경(CP949 등의 Windows)과 유니코드 환경을 제공하는 드라이버로 나뉘게 됩니다. 여러분들이 만약 윈도우 환경의 PostgreSQL을 사용하거나 데이터베이스 인코딩이 CP949 or EUC-KR이라면 ANSI용 드라이버를 UTF-8이라면 유니코드용 드라이버를 사용하면 됩니다.

$ odbcinst -q -d

마지막으로 odbcinst.ini 파일을 다시 리로드하면 정상적으로 ODBC 드라이버 등록이 완료됩니다.

odbc.ini 파일은 odbcinst.ini 파일에 기반하여 존재하는 드라이버를 토대로 여러분들이 사용할 DBMS 서버, 유저 정보 등을 기록하는 구성 파일입니다. 프로그램 소스 코드에 직접 DB 정보를 입력하게 되면 서버 정보 유출의 위험성이 크기 때문에 사실상 운영체제에 별도로 사용할 DB 정보를 입력해주는 것을 추천합니다.

이 외에도 여러가지 옵션들이 있습니다. 해당 옵션들에 대해서는 각 ODBC 드라이버를 제공해주는 DBMS 홈페이지에서 확인할 수 있습니다. 
username과 password를 공란으로 하실 경우, 프로그램 소스 코드에 직접 입력하여야 하며, 그렇지 않기를 원한다면, odbc.ini 파일에 직접 입력하셔야 합니다.


Test

이제 DBMS와 잘 연결되는지 테스트를 진행해보도록 하겠습니다. 테스트 진행을 위해서 unixODBC에서 제공하는 isql 명령어를 사용할 것입니다.

$ isql NKPOST

위에 예시에 있는 DSN 이름을 그대로 작성하도록 합니다. 만약 Username과 Password를 입력하지 않았다면 아래의 명령어를 사용합니다.

$ isql NKPOST [username] [password]

패스워드가 !, @ 등의 특수문자가 포함되어 있을 경우 '(quote)를 사용하여 묶어주도록 합니다.

접속이 성공적으로 완료되면 위의 화면처럼 Connected ! 라는 메시지가 나타나며 SQL 쿼리문을 사용할 수 있는 환경을 제공해줍니다.


마치며...

여기까지 NIX 계열 운영체제에서 ODBC 인터페이스를 사용하는 방법에 대해 적어봤습니다. 한 번 작성하고 설정해놓으면 편하게 사용할 수 있는 점도 있고, 무엇보다 드라이버를 여러 개 별도로 잡아줘야한다는 것은 흠이지만 미리 잡아놓고 ODBC 라이브러리만 적절히 사용한다면 여러 DBMS에 쉽게 연결하여 소프트웨어를 개발할 수 있다는 장점이 있었습니다.

비슷한 경우로 Java에서 제공하는 JDBC나 Perl에서 제공하는 DBI로 봤을 때 가장 대표적인 JDBC의 경우 JVM 라인이 존재하여야 한다는 점에서 ODBC 인터페이스 레이어를 거친다는 것에는 변함이 없기 때문에 사실상 속도 면에서는 어떨지 잘 모르겠습니다. 하지만 JDBC는 사용 라인이 JVM이고 ODBC가 C 계열의 드라이버를 사용한다는 것을 감안한다면 ODBC가 좀 더 빠른 쪽에 속하다고 볼 수 있을 지도 므르겠네요.


[참고] ODBC 구조 이미지 (http://www.tech-faq.com/odbc.html)

comments powered by Disqus

Tistory Comments 0