AS/400과 델파이/C++빌더 (2)

저번에 이어, AS/400과 델파이/C++빌더에 대해 계속 써보겠습니다. 저번에는 기본 소개만 한참 했는데, 이번에는 델파이나 C++빌더와 AS/400의 연동에 대해 써보지요.

Delphi/400

델파이나 C++빌더에서 AS/400에 연결하는 방법들에는 몇가지가 있는데요. 그 중 가장 기본적(?)인 것은, Delphi/400입니다. Delphi/400이란 별도의 델파이 버전을 말하는 것은 아니고, 델파이에서 AS/400에 연동하기 위한 컴포넌트 라이브러리입니다. (더 정확하게는 델파이 개발툴 자체와 컴포넌트 라이브러리를 합친 것입니다) 이 컴포넌트 라이브러리는 볼랜드(그리고 엠바카데로)에서 판매하기도 했지만, 원래 볼랜드/엠바카데로의 제품은 아니고 시스템 오브젝츠(System Objects)라는 회사에서 나온 것입니다. (통칭해서 Delphi/400이지만 C++Builder/400도 있습니다)

Delphi/400은 원래 Delphi 3와 4 버전에서 지원되었던 것입니다. (위 로고도 그 당시의 로고입니다) 그랬던 것이 델파이 5 버전 이후로는 볼랜드에서 지원을 끊었다가, 2007 버전부터 엠바카데로에서 다시 시스템 오브젝츠와 연계 영업을 하고 있습니다.

Delphi/400에서는 DB2/400 데이터베이스 기능들을 완벽하게 커버할 뿐만 아니라, 단순한 데이터베이스 액세스를 넘어서 OS/400에 대한 거의 모든 호출을 할 수 있습니다. AS/400 개발에 대한 토탈 솔루션인 셈이죠.

Delphi/400에 대한 자세한 정보는 아래의 페이지들에서 살펴볼 수 있습니다.
http://www.devgear.co.kr/solutions/modernizing-as400-system-i.html
http://www.systemobjects.com/homedelphi400.html
http://www.hallogram.com/delphi_400/index.html

하지만… 기능적으로는 초막강이긴 해도, 가격이 너무 비싸고, AS/400 자체가 그렇듯이 현대적인 SQL 데이터베이스만을 다뤄왔던 개발자들에게는 AS/400을 모두 커버하는 기능들이 그다지 편리하지 않습니다.

dbExpress – DB2Connect

dbExpress는 델파이와 C++빌더 6 이후에 BDE를 대체하여 등장했고, 2007 버전부터는 완전히 새로 재개발되기도 했습니다. dbExpress는 플러깅 방식의 데이터베이스 연결 아키텍처이기 때문에, 해당 데이터베이스를 지원하는 dbExpress 드라이버만 있으면 연결할 수 있습니다. 현재 델파이/C++빌더 XE 버전에는 Oracle, MS SQL, MySQL, Informaix, Sybase, DB2, InterBase, Firebird 드라이버가 기본 탑재되어 있습니다.

그런데, 여기서, 델파이나 C++빌더에 기본 탑재된 DB2 dbExpress 드라이버는, AS/400 DB2용이 아니라 일반 DB2(즉 DB2 for LUW)용입니다. 몇년 전에 AS/400을 처음 다루기 시작했을 때, 이걸 몰라서 일반 DB2용 드라이버로 AS/400에 연결하려고 며칠 동안 엄청난 삽질을 했습니다. 누구도 AS/400 DB2와 일반 DB2의 엄청난 차이에 대해 말해주지 않았거든요. 정보도 흔치 않고요.

여러날 삽질하다가 마침내 유용한 정보를 하나 찾아냈습니다. AS/400에 일반 DB2, 그러니까 DB2 LUW처럼 연결할 수 있는 유일한 방법이 딱 하나 있었습니다. DB2 Connect라는 건데요. 이건 이기종 환경에서 DB2를 다른 벤더의 데이터베이스들과 연동시키기 위한 일종의 브리징 소프트웨어 패키지입니다.

이 DB2 Connect에 일반 DB2처럼 연결할 수 있는 드라이버가 포함되어 있습니다. 더 정확하게 말하면, 일반 DB2의 클라이언트 라이브러리가 db2cli.dll인데요. 바로 DB2 Connect에는 AS/400에 연결할 수 있는 특별한 버전의 db2cli.dll 파일이 포함되어 있었던 겁니다. 즉, 이 db2cli.dll를 PC에 복사해두고 델파이에 포함된 일반 DB2 dbExpress 드라이버로 연결하면 됩니다.

당시에 테스트 목적으로 IBM의 총판 한군데로부터 일정 기간 동안 DB2 Connect를 제공받아 db2cli.dll로 연결을 테스트를 해봤었는데, 아무 문제 없이 dbExpress와 잘 동작했습니다! (아마도 다른 벤더의 DB들과 연동하는 기능을 구현하려니까 AS/400 DB2를 일반 DB2처럼 연결할 수 있는 기능이 부가적으로 필요해서 만들어넣은 것으로 생각됩니다)

그런데 이 DB2 Connect라는 것은 CA400처럼 지원 드라이버 수준으로 제공되는 것이 아니라, 별도로 판매되는, ‘별매’ 제품입니다. 그리고 드라이버 dll 하나는 절대 별도로 제공하지 않습니다. 결국 dll 하나를 쓰기 위해서 수천만원짜리 DB2 Connect를 구입해야 합니다. 이야… 역시 IBM은 이런 장사에 있어서는 대가입니다. 가격이 싸고 비싸고를 떠나서.. dll 하나 때문에 엄청 비싼 패키지를 사야 한다니, 허무하지 않습니까. 그래서 다른 방법을 또 열심히 찾아봤습니다.

dbExpress – dbxas400

하염없이 여기저기 찾아헤매다가 마침내 찾아낸 것이 dbxas400입니다. 이것은 독일의 Peter Sawatzki라는 개발자가 만들어 배포하는 AS/400을 위한 dbExpress 드라이버입니다.

http://www.sawatzki.de/download.htm

이 드라이버도 아주 잘 돌아갑니다. 무료라서 더 좋습니다. 무료이면서도 꽤 오랫동안 업그레이드된 것이라 별다른 버그도 없구요. 한가지 말씀드리면, 이 드라이버는 델파이 2010 버전까지 정식 지원하며, XE 버전에 대해서는 테스트가 되지 않은 상태입니다. 하지만 제 경험으로 볼 때, 2010 버전 지원용이긴 하지만 이 드라이버를 XE 버전에서 쓰시는 데에 별 문제가 없을 것입니다.

그런데.. 이 드라이버를 쓰면 좀 귀찮은 문제가 생깁니다. 가장 큰 것이 타입 매핑의 문제인데요. DB에서 정의한 필드들의 데이터 타입들이 델파이로 넘어오면 예상치 못한 데이터 타입으로 되는 경우가 종종 있었습니다. 가장 흔한 것은, DB에서 float계열 데이터타입으로 선언한 컬럼들이, 쿼리에서 종종 TFMTBcdField 타입으로 넘어오는 경우입니다. 아마도 As/400에서 사용한 필드의 precision이 너무 커서 그런 일이 생기는 것이 아닌가 하는 추측을 하는데.. 어쨌든 꽤 성가십니다.

ODBC, ADO 드라이버 이용

개인적으로 ODBC의 DSN이라는 방식은 좋아하지 않습니다만, ODBC는 윈도우 계열에서는 광범위하게 사용되고 있는 방식이니, 많은 분들이 익숙해서 금방 사용할 수 있는 장점이 있죠.

ODBC를 사용하려면 당연히 해당 데이터베이스를 위한 ODBC 드라이버가 있어야 하는데요. 이것은 기본 벤더 dll과는 별개로 ODBC에 연결하기 위한 드라이버입니다. AS/400의 ODBC 드라이버는 AS/400의 클라이언트 패키지인 Client Access를 설치하면 함께 설치됩니다. ODBC 관리자에서 아래와 같이 “iSeries Access ODBC Driver”를 선택하여 DSN을 등록할 수 있습니다.

그럼 이 ODBC를 델파이/C++빌더에서 어떻게 사용할 수 있을까요. 델파이/C++빌더에서 ODBC로 데이터베이스에 연결하는 방법에는 크게 세가지가 있는데, BDE, ADO, 그리고 기타 서드파티 컴포넌트입니다.

먼저 BDE. 제가 이 블로그에서도 여러번 BDE 대신 dbExpress 사용을 권했고, 또 벤더인 엠바카데로에서도 dbExpress를 권하고 있지만, ODBC에 대해서는 조금 별개의 문제입니다. BDE에서 제거된 것은 SQL Links로, 원격 데이터베이스로의 연결을 담당하는 엔진 부분인데요. ODBC는 BDE 컴포넌트를 이용하기는 하지만 SQL Links를 이용하지는 않습니다. 따라서 BDE ODBC는 지금의 최신 버전인 델파이 XE, C++빌더 XE에서도 완벽하게 동작합니다.
ADO를 이용하는 방법도 있습니다. AS/400을 ADO로 연결하는 방법에는 ADO 자체, 즉 OLE DB 프로바이더를 이용할 수도 있고, 혹은 OLE DB Provider for ODBC driver를 이용하여 ODBC를 거쳐 ADO로 연결할 수도 있습니다.

그런데 위 두가지 방법 모두, 속도가 그리 만족스럽지 못했습니다. 특히 ADO를 거치는 방법은 약간 체감이 될 정도로 속도가 떨어지더군요. 그래서 제가 선택한 마지막 방법은, 서드파티 ODBC 컴포넌트를 이용하는 거였습니다. ODBC 연결이 가능한 서드파티 컴포넌트로는 SQLDirect와 ODBCExpress가 있었는데요(둘 다 무료가 아닌 상용입니다). ODBCExpress의 경우 해당 벤더가 델파이 2009에서 유니코드 컨버전에 실패해서 업그레이드를 중단했구요.

전 SQLDirect를 선택했는데, 유니코드가 적용되지 않은 상태였고, 프로젝트 중에 제가 SQLDirect를 유니코드로 마이그레이션을 했습니다. (앞서 ODBCExpress가 유니코드 컨버전에 실패해서 지원을 중단한 것도 무리는 아니었던 것이.. 이 SQLDirect를 마이그레이션하는 작업은 역시 대작업이더군요) 어쨌든 실제 적용시켜본 결과 속도에 아주 만족했습니다. (지금도 쓰고 있습니다)

그런데 SQLDirect 사이트가 최근 1년 정도 사이에 계속 연결이 되지 않는 것으로 봐서는 아마도 문을 닫은 것 같네요. 그렇다고 지금 구입할 방법이 전혀 없는 것은 아니고, 컴포넌트 판매 사이트 등에서 문닫기 전의 버전을 구입할 수 있습니다. 다만.. 마지막 버전이 유니코드가 적용되지 않은 버전입니다.

그래서.. SQLDirect 라이선스는 있는데 유니코드 버전의 델파이, 즉 델파이 2009 이상에서 사용하려고 하는 개발자가 있으시다면 제가 유니코드로 마이그레이션된 버전을 보내드리도록 하겠습니다. (구입하지 않은 분께 보내드리면 제가 범법자가 되겠지요)

———————————————————————-

여기까지, DB2/400에 연결하기 위한 여러 방법들을 살펴봤는데요. 비용을 제외하고 선택한다면, DB2 Connect에 dbExpress로 연결하는 방법이 기술적으로 가장 안정되면서도 미래를 위해서도 가장 훌륭하다고 생각됩니다. 속도도 가장 뛰어났구요. 하지만 불행히도 돈이 너무 많이 듭니다…

비용까지 고려한다면… 우선 순위는 BDE ODBC > ADO ODBC > ADO 입니다. 이 순서는 일단 속도 순위인데요. 테스트 결과 ADO가 BDE ODBC보다 속도가 상당히 느리게 나왔었습니다. 뿐만 아니라, ADO 방식 두가지는 델파이/C++빌더의 일반적인 데이터베이스 연결 방식과 좀 다른 면이 많아서(많은 코딩을 해야 하는 파라미터 관련에서 특히 차이가 많이 납니다) ADO가 아닌 다른 기술로 옮기려고 할 때 소스코드를 아주 많이 수정해야 하는 사태가 벌어집니다.

반면 BDE와 dbExpress는 적어도 코드 면에서는 아주 유사합니다. 물론 dbExpress가 단방향 데이터셋인 관계로 그리드를 이용할 때 데이터셋과 그리드 사이에 뭔가 더 집어넣어야 하는 경우가 생기지만, 실무적인 관점에서 보자면 BDE와 dbExpress 사이의 전환보다 오히려 ADO와의 전환이 더 공수가 크고 예상치 못한 문제를 만날 가능성도 더 큽니다.

더욱이 ADO는 크로스플랫폼의 가능성이 조금 도 없는 윈도우 플랫폼만을 위한 기술이라는 점에서 더욱 갑갑합니다. 내년에 델파이와 C++빌더에서 리눅스 및 맥OS 지원이 추가되어 다른 플랫폼으로 포팅을 하려고 한다면 ADO를 썼을 때는 뭐 방법이 없습니다. 더 오래된 BDE보다도 더 많이 뜯어고쳐야 하죠.

그래서, 일반적으로 권하고 싶은 ‘정답’은, ADO보다는 BDE ODBC가 더 낫다고 생각됩니다. 그리고.. 서드파티 컴포넌트의 소스를 어느 정도 직접 핸들링할 수 있고 약간의 성능 차이에도 민감하다면, SQLDirect를 권하고 싶습니다. 2년전 테스트해봤던 결과로는, SQLDirect의 속도는 고가인 DB2 Connect의 속도와 거의 동일한 수준이더군요.

———————————————————————-

사실 AS/400 레퍼런스가 계속 줄어들고 있어서, 이렇게 길고 힘들게 써봤자 도움을 받을 사람은 점점 더 적어지겠지만… 그와 동시에 레퍼런스가 줄어드는 만큼, 이런 정보를 구할 수 있는 창구도 점점 더 줄어들게 되겠지요. 단 한 분의 개발자라도 향후에 이 글들을 보고 도움이 되시길 바래봅니다. ^^

 

5 comments for “AS/400과 델파이/C++빌더 (2)

    • 정말 그렇군요! 제가 사용하는 피씨들 모두에서 접속이 안되길래 서비스 중단이라고 생각했었는데, IDC에 있는 서버에서는 연결이 되네요. 말씀대로 6.2.1 버전까지 나와있고 XE 버전도 지원되는군요. 2007 지원 버전으로 직접 마이그레이션 삽질을 했는데…

      그런데 사이트에 뭔가 문제가 있는 건 맞나봅니다. 인터넷 아카이브, 그러니까 archive.org에서도 2008년 6월 이후에는 데이터가 기록이 안된걸 보면 그 시점부터는 인터넷 아카이브에서도 연결을 못했던 걸로 보이네요.

  1. 안녕하세요 좋은 글 잘 읽었습니다. ^^
    저희 회사 환경이 AS/400에 Delphi6로 개발을 하면서 Delphi/400으로 RPG Call을 하여 사용을 하고 있습니다.
    최근에 ODBC를 사용하여 RPG를 Call을 할 일이 생겨서 작업을 하는데
    Output Parameter를 받을 방법을 몰르겠네요 ^^;;
    혹시 방법을 아신다면 ach1230@gmail.com로 알려주실수 있을까 해서 답글 남깁니다.
    감사합니다

    • 구체적으로 살펴보진 않았습니다만…
      제 기억으로는 RPG 콜은 스토어드 프로시저 형식으로 호춣했던 걸로 기억하는데요. AS/400의 ODBC 드라이버로 스토어드 프로시저를 호출할 때, 일반적인 ODBC 표준과 방식이 좀 다르더군요.

      그런데 저도 확실하게 살펴본 것도 아니고, SQLDirect에서 소스를 직접 수정해서 해결했던 거라서 어떻게 해보시라고 드릴 수 있는 해결책이 없네요.

  2. […] 따라서 AS/400 DB2에 연결하기 위해서는 일반적인 DB2 연결 방법으로는 연결이 안됩니다. 델파이/C++빌더에서도, 기존의 BDE나 dbExpress는 물론 최신의 FireDAC에서도 네이티브 연결이 불가능했으며, 대신 ODBC 브리지 연결을 하는 것이 일반적이었습니다. 이에 대해서는 몇년 전에도 한번 포스트로 썼던 적이 있습니다. AS/400과 델파이/C++빌더 (2) […]

답글 남기기

이메일 주소는 공개되지 않습니다.