'DB2 9.7 for Linux, UNIX and Windows에서 Oracle 애플리케이션 실행하기(1)'에서 이어지는 내용입니다.
지금까지 동시성, 데이터 유형, 유형 지정 및 함수에 대해 살펴보았다. 하지만 Oracle와 DB2의 차이점은 이 정도에서 그치지 않는다. SQL 언어의 핵심인 키워드 및 의미에서도 차이가 있으며 일부 기능은 두 제품 중 한 제품에서만 지원되기도 한다. 이러한 기능이 많이 사용되는 기능일 경우에는 두 제품에 공통으로 적용되는 SQL을 제출하는 데 제한이 따르게 된다. 표 6에서는 여러 가지 크고 작은 언어 기능 중 몇 가지 중요한 기능을 보여 준다.
표 6. 새 SQL 지원
| 기능 | 설명 |
|---|---|
CONNECT BY 재귀 | DB2에서는 지금까지 ANSI SQL 재귀가 지원되었지만 이제는
LEVEL 및 CONNECT_BY_PATH와
같은 다양한 함수 및 의사 열을 비롯한 Oracle 유형의 CONNECT BY가
추가되었다. |
| 조인(+) 구문 | 이 구문은 Oracle에서도 실제로 사용되지 않고 있지만 아직까지도
OUTER JOIN 구문 형식을 사용하는 애플리케이션과 개발자가 많이
있다. |
DUAL 테이블 | 단일 행과 단일 열로 구성된 테이블이며 Oracle 애플리케이션에서 더미로 자주 사용된다. |
ROWNUM 의사 열 | 이 의사 열은 대개 리턴되는 행의 수를 제한하고 결과 세트의 행을 열거하는 데 사용된다. |
ROWID 의사 열 | Rowid는 이전에 가져온 행을 물리적 주소를 기반으로 빠르게 검색하는 데 사용된다. |
MINUS SQL 연산자 | Oracle에서는 하나의 결과 세트에서 또 다른 결과 세트를 제거할 때
EXCEPT 대신 MINUS를 사용한다. |
SELECT INTO FOR UPDATE
| SELECT INTO에 대한 FOR UPDATE
구문은 나중에 커서를 사용하지 않고 수정할 의도로 DB2에서 행을 추출할 때 사용된다. |
Public 동의어
| Public 동의어는 스키마 이름이 없는 별명이다. DB2에서는 테이블 오브젝트, 시퀀스 및 PL/SQL 패키지에 대한 Public 동의어가 지원된다. |
CREATE TEMPORARY TABLE
| DB2에서는 작성된 전역 임시 테이블과 선언된 전역 임시 테이블이 지원된다. |
TRUNCATE 테이블 명령문 | 이 명령문은 트리거를 실행하지 않은 채로 전체 테이블의 컨텐츠를 빠르게 삭제한다. |
| 낮은 수준의 이름 확인 | DB2 9.7에서는 더 이상 인라인 보기에 이름을 지정할 필요가 없다. 또한 UNION 등의 세트 연산자로부터 열 이름을 수비게 상속할 수 있다. |
@@@위 표를 보면 데이터베이스에 대해 SQL을 제출하는 Oracle 애플리케이션에서 실행할 수 있도록 DB2에 적용된 변경 사항이 많이 바뀌지는 않았다는 것을 알 수 있다.@@@ 하지만 많은 애플리케이션의 주요 부분이 서버 자체에서 실행되고 있으며 Oracle 애플리케이션에 사용할 수 있는 서버측 언어는 PL/SQL이다. 따라서 PL/SQL에 대한 지원이 없으면 호환성을 이야기할 수 없다.
일반적으로 애플리케이션을 한 제품에서 다른 제품으로 이식할 경우에는 SQL 및 프로시저 언어 코드도 다른 SQL 언어 코드로 변환되어야 한다. 이로 인해 몇 가지 문제점이 발생한다.
- 소스 및 대상 언어 사이의 자동화 및 제한 사항 불일치로 인해 변환된 결과 코드의 내용이 복잡해진다.
- 애플리케이션 개발자가 대상 SQL 언어 코드에 익숙하지 않기 때문에 이식된 코드를 디버그하기가 어렵다. 스킬이 부족하기 때문에 시간이 지날수록 유지보수 부담이 커진다.
- 패키지된 애플리케이션의 경우에는 애플리케이션이 새롭게 릴리스될 때마다 변환 작업을 수행해야 한다.
- 결국에는 원본보다 느린 에뮬레이션이 되고 만다.
이러한 문제를 해결하기 위해 DB2 9.7에는 기본 PL/SQL 지원이 포함되었다. 그렇다면 이 말의 의미가 무엇일까?
그림 3에서 볼 수 있듯이 이제 DB2 엔진에는 PL/SQL 컴파일러와 SQL PL 컴파일러가 모두 들어 있다. 두 컴파일러 모두 DB2의 SQL Unified Runtime Engine에 대한 가상 시스템 코드를 생성한다. 이는 Optim Development Studio와 같은 모니터링 및 개발 도구가 런타임 엔진 수준에서 DB2에 연결되기 때문에 중요하다.
그림 3. PL/SQL 컴파일러 지원
PL/SQL이 DB2에 중요한 프로시저 언어로 통합되면서 얻게 되는 효과는 다음과 같다.
- 변환이 필요하지 않다. 소스 코드가 스키마 카탈로그에 그대로 유지된다.
- 개발자는 익숙한 언어를 계속해서 사용할 수 있다. 새 논리가 SQL PL로 작성되었다고 하더라도 논리를 DB2의 언어로 이동하지 않아도 된다. 다른 언어를 사용하는 루틴끼리 상호 간에 호출할 수 있다.
- 패키지된 애플리케이션 공급업체의 경우 하나의 소스 코드를 Oracle 및 DB2에 사용할 수 있다.
- PL/SQL과 SQL PL 모두 DB2의 SQL Unified Runtime Engine에 대해 동일한 가상 시스템 코드를 생성하므로 동일한 속도로 실행된다.
- 디버거 인프라가 SQL Unified Runtime Engine에 직접 연결되므로 Optim Development Studio에서 PL/SQL이 자연스럽게 지원된다.
그림 4에서는 PL/SQL 디버깅 세션을 보여 준다. 이 디버거는 step into, step over 및 중단점과 같은 표준 기능을 지원한다. 또한 프로그램 실행 중에 사용자가 로컬 PL/SQL 변수를 변경할 수 있다.
그림 4. DB2의 PL/SQL 디버거 지원
그렇다면 PL/SQL 지원이 구체적으로 의미하는 바는 무엇일까? 첫 번째 의미는 핵심 구문이 지원된다는 것이다. 즉, DB2에서 다음과 같은 PL/SQL의 공통 구문이 모두 지원된다.
- if then else
- while 루프
- := 할당
- 로컬 변수 및 상수
- #PRAGMA EXCEPTION 및 예외 처리
- 다양한 형식의 루프(범위, 커서 및 쿼리)
- 변수 및 매개 변수를 다른 오브젝트에 고정하는 %TYPE 및 %ROWTYPE 앵커링
- 프로시저를 private 트랜잭션에서 실행할 수 있도록 지원하는 #PRAGMA AUTONOMOUS 트랜잭션
프로시저 논리가 허용되는 다양한 오브젝트에서 PL/SQL을 사용할 수 있다.
- 스칼라 함수
- 각 행 트리거 앞
- 각 행 트리거 뒤
- 프로시저
- 익명 블록
- PL/SQL 패키지
Oracle 애플리케이션에 사용되는 대부분의 PL/SQL은 패키지에 포함되어 있다. PL/SQL 패키지(DB2 패키지가 아님)는 외부에서 액세스할 수 있는 오브젝트와 패키지 내에서 사용하기 위한 도우미 오브젝트를 구별하는 기능을 갖춘 개별 오브젝트의 모음이다. ANSI SQL에서 패키지와 동등한 개념으로 사용되는 용어는 모듈이다. DB2는 이제 ANSI SQL 모듈 및 PL/SQL 패키지에 대한 지원을 제공한다. 제공되는 기능 중 특히 중요한 기능은 다음과 같다.
- CREATE [OR REPLACE] PACKAGE는 외부에서 볼 수 있는 루틴에 대한 프로토타입을 정의하며 변수 및 유형과 같이 외부에서 볼 수 있는 비프로시저 오브젝트도 정의한다.
- CREATE [OR REPLACE] PACKAGE BODY는 모든 private 및 public 루틴과 다른 모든 private 오브젝트를 구현한다.
- 패키지 또는 패키지 본문 내에서 다음과 같은 오브젝트를 정의할 수 있다.
- 변수 및 상수
- 데이터 유형
- 예외
- 스칼라 함수
- 프로시저
- 커서
- 패키지 초기화
- 패키지의 public 동의어
일부 Oracle 애플리케이션에서는 RDBMS에서 제공하는 패키지를 활용한다. 특히 보고, 이메일 또는 연결 간 통신을 제공하는 라이브러리는 많이 사용될 수 있다. 이러한 애플리케이션을 DB2에서 많이 사용할 수 있도록 DB2에서는 표 7에 나열된 패키지를 제공한다.
표 7. DB2에서 제공하는 내장 패키지
| 패키지 | 설명 |
|---|---|
| DBMS_OUTPUT | 명령행에서 설정 또는 해제할 수 있는 기본적인 보고 기능을 제공한다. |
| UTL_FILE | DB2 서버에서 파일 작업을 수행하는 데 필요한 기능을 제공하는 모듈이다. |
| DBMS_SQL | 기존 EXECUTE 및 EXECUTE IMMEDIATE
명령문과 함께 동적 SQL을 수행할 수 있는 SQL API를 제공하는 패키지이다. |
| UTL_MAIL | SQL의 이메일 알림을 보낼 수 있는 모듈이다. |
| UTL_SMTP | UTL_MAIL과 비슷한 하위 수준 API로 SMTP 통합 기능을 제공한다. |
| DBMS_ALERT | 다른 세션끼리 서로 세마포어를 설정하는 데 사용할 수 있는 패키지이다. |
| DBMS_PIPE | 세션 간에 데이터를 보내는 데 필요한 기능을 제공하는 모듈이다. |
| DBMS_JOB | DB2의 작업 스케줄러와 통합되는 호환 가능한 API를 제공한다. |
| DBMS_LOB | DB2의 내장 LOB 함수를 에코하는 LOB 처리를 위한 Oracle API이다. |
| DBMS_UTILITY | 애플리케이션에 사용되는 다양한 프로시저의 모음이다. |
JDBC는 표준 Java 클라이언트 인터페이스이다. 하지만 표준이 아닌 특정 데이터 유형을 지원하기 위해 Oracle의 JDBC 드라이버에 추가된 확장이 있다.
Java 기술 기반 애플리케이션에 대한 호환성 수준을 극대화하기 위해 DB2 9.7 JDBC 드라이버는 무엇보다도 참조 커서 및 VARRAY 매개변수를 사용하여 프로시저를 호출할 수 있는 기능을 지원한다.
SQL*Plus 명령행 프로세서를 사용하여 DDL 스크립트 및 보고서를 작성하는 경우가 자주 있다. 이러한 스크립트뿐만 아니라 스크립트를 작성하는 개발자의 스킬까지도 더 쉽게 이전할 수 있도록 지원하기 위해 DB2에서는 CLPPlus라고 하는 SQL*Plus 호환 명령행 프로세서를 제공한다. 이 도구의 기능은 다음과 같다.
- SQL*Plus 호환 명령 옵션
- 변수 대체
- 열 형식 지정
- 보고 함수
- 제어 변수
그림 5. SQL*Plus 호환 CLPLus 도구
DB2를 PL/SQL 및 Oracle SQL에 맞게 조정한 후에는 복잡한 마이그레이션 툴킷이 필요하지 않다. 대신 IBM Data Movement Tool을 사용하여 테이블, 패키지 또는 전체 스키마를 Oracle에서 DB2로 끌어 놓기만 하면 된다. 애플리케이션을 DB2로 이동하거나 동일한 소스가 DB2 및 Oracle에 대해 작동할 수 있도록 애플리케이션을 수정할 경우에도 예외에 대한 최소한의 조정만 수행하면 된다.
이를 수행하는 단계도 매우 간단하다.
- 필요한 레지스트리 변수를 설정한다.
db2set DB2_COMPATIBILITY_VECTOR=ORAdb2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
- 데이터베이스 관리자를 다시 시작한다.
db2stopdb2start
- Oracle 호환 데이터베이스를 작성한다.
db2 create database mydb pagesize 32 Kdb2 update db cfg for mydb using auto_reval deferred_force
- IBM Data Movement Tool을 시작하고 Oracle 및 DB2 데이터베이스에 연결한다(그림
6 참조). 연결이 설정되면 DDL만 추출할지 또는 DDL과 데이터를 모두 추출할지 선택할 수 있다. 마지막으로 생성된
스크립트를 실행하여 직접 전개할지 또는 Interactive Deploy 창을 사용하여 작업을 수행할지 여부를 선택할 수
있다. (일반적인 대부분의 애플리케이션의 경우에는 두 번째 방법을 사용하는 것이 좋다.)
그림 6. IBM Data Movement Tool을 사용하여 Oracle 스키마를 DB2로 끌어 놓기
- Interactive Deploy를 사용하여 원하는 스키마를 Oracle에서 DB2로
이동한다(그림 7 참조). Interactive Deploy 모드의 탐색 트리에
Oracle 데이터베이스에서 추출한 모든 오브젝트가 표시된다. 모든 오브젝트를 선택하고 전개 메뉴
옵션을 실행한다. 결과적으로 이 도구는 오브젝트를 DB2에 복사하고 진행 상태를 기록한다. 일부
오브젝트의 경우 전개되지 않을 수도 있으며 이러한 오브젝트에 대한 작업을 수행할 수 있는 옵션이
제공된다. 오브젝트를 선택하면 DDL과 함께 DB2에서 발생한 오류가 표시된다. 이제 내장 편집기를
사용하여 필요에 따라 정의를 수정하고 다시 전개할 수 있다. 이 작업의 목표는 예외를 기반으로 모든
오브젝트를 DB2로 대화식으로 이동하는 것이다.
그림 7. IBM Data Movement Tool을 사용하여 Oracle 스키마를 DB2로 끌어 놓기
그렇다면 애플리케이션을 DB2 9.7에서 실제로 얼마나 쉽게 사용할 수 있을까? 당연한 말이겠지만 애플리케이션에 따라 다르다고 말할 수 있다. IBM에는 Oracle 데이터베이스의 모든 오브젝트를 분석하여 점수로 환산해서 보여 주는 MEET DB2라는 내부 도구가 있다. 이 도구는 기본적으로 사용할 수 있는 기능과 조정이 필요한 부분에 대한 보고서를 제공한다. IBM 계정 담당자 또는 영업 담당자는 이 유틸리티를 실행하여 현재 Oracle 데이터베이스와 DB2의 호환성에 대한 평가 결과를 빠르게 제공할 수 있다.
그림 8. 평가를 위한 MEET DB2 보고서 도구
DB2 9.7 베타 단계를 진행했던 1년 동안 총 75만 행 이상의 PL/SQL 코드로 구성된 많은 애플리케이션을 자세히 분석한 결과 평균 90%-99%의 기본 전송 속도를 보여 주었다.
그림 9. 지원되는 명령문의 98% 평균 속도
PL/SQL, 내장 패키지 라이브러리 및 CLPPlus는 현재 DB2 Express, DB2 Express-C 및 DB2 Personal Editions에서 사용할 수 없다.
DB2 9.7에서는 다중 언어 SQL 지원이 기본으로 제공되기 때문에 Oracle 애플리케이션을 DB2에서 쉽게 사용할 수 있다. 패키지 애플리케이션의 공급업체에서는 최소의 추가 비용으로 Oracle 및 DB2에서 애플리케이션을 제공할 수 있으며 고객은 과거에 사용했던 제품의 영향을 받지 않고 필요한 기술을 제공하는 공급업체를 자유롭게 선택할 수 있다.
DB2 9.7 시험판(참고자료 참조)을 다운로드하여 이러한 기능을 테스트할 수 있다.
어느 버전의 Oracle이 DB2 9.7에서 지원되는가?
제공되는 SQL 및 PL/SQL 언어 지원은 애플리케이션에 사용되는 기능에 따라 달라진다. Oracle 11g와 같은 최근 릴리스에 도입된 기능은 지원되지만 Oracle 8i의 일부 기능은 지원되지 않는다. 75만 개 이상의 행으로 구성된 18개의 애플리케이션에 대한 연구 결과 90%-99%의 코드가 변경 없이 DB2로 이동했다. 나머지 조정 중 많은 작업을 자동화할 수 있으며 그렇지 않은 작업의 경우 반복적이다.
Oracle 애플리케이션이 DB2에서 얼마나 빨리 실행되는가?
정말 중요한 질문이다. 아쉽게도 Oracle 라이센스 계약에서는 사전 서면 동의 없이 벤치마크 결과를 게시하는 것을 금지하고 있다. 물론 필자는 요청하지도 않았다. 하지만 설계 상의 특징을 감안하고 품질 보증 벤치마크를 통해 확인해 본 결과 DB2의 PL/SQL에 대해 실행되도록 작성한 애플리케이션과 DB2의 SQL PL에 대해 실행되도록 작성한 애플리케이션이 모두 빨리 실행된다. 인에이블먼트 프로세스를 이미 수행해 본 공급업체에서는 대개 결과에 놀라면서 흡족해 한다.
이러한 기능을 제공하기 위해 얼마나 많은 노력이 들었는가?
상상하기 힘들 정도로 많은 노력이 들었다. CONNECT BY
및 NUMBER와 같은 일부 초기 작업은 전술적 차원에서 DB2 9.5를 위해
수행되었으며 18개월에 가까운 시간이 투자되었다.
Oracle 애플리케이션을 DB2에서 사용할 때 일반적으로 겪게 되는 어려움은 무엇인가?
분명 DB2의 호환성은 100%가 되지 않는다. 따라서 처음 DB2로 인에이블먼트할
경우 몇 가지 문제가 발생할 수 있다. 하지만 이러한 문제 중 많은 문제는 쉽게 수정할 수 있는
간단한 문제이다. 예를 들어, DB2는 PL/SQL 트리거를 지원하지만 트리거 작업을 결합할 수는
없다. 즉, 하나의 트리거가 UPDATE, DELETE
및 INSERT 작업에 공유된다. 이제 PL/SQL 다중 작업 트리거가 있으면
INSERTED, UPDATED 및 DELETED
조건부에 대해 하나의 부울 변수를 사용하여 세 개의 DB2 PL/SQL 트리거로 매우 쉽게 복사할 수 있다.
교육
-
DB2 9.7
launchpad: DB2의 가치에 대한 개요를 살펴볼 수 있다.
-
Chat With the
Lab: DB2 9.7 Technical Deep Dive와 같은 주제에 대한 동영상과 이 기사의 웹캐스트 버전을
시청할 수 있다.
-
"Moving to DB2 is
Easy"(youTube): 동영상을 통해 애플리케이션을 DB2에서 사용하기 위한 준비 과정을 볼
수 있다.
-
"DB2 9.7 CLPPlus"(youTube):
이 동영상은 SQL*PLus 호환 CLPPlus 쉘의 사용법을 보여 준다.
-
"DB2 9.7: Native
PL/SQL Support"(youTube): 간단한 동영상을 통해 DB2 9.7에서 지원되는 여러 가지 PL/SQL
기능을 살펴볼 수 있다.
-
"Break Free with IBM
DB2 9.7"(youTube): DB2 9.7의 우수성을 입증하는 고객과 파트너의 모습을 볼 수 있다.
- developerWorks Information Management 영역:
Information Management에 대한 추가 정보를 제공한다. 기술 자료, 사용법 기사, 교육, 다운로드, 제품 정보 등을 찾아볼 수 있다.
- developerWorks 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.
제품 및 기술 얻기
-
DB2
9.7 for Linux, Unix and Windows: DB2 9.7 for Linux, UNIX and Windows의 무료 시험판을 다운로드할 수 있다.
- DB2
Express-C 9.7: 커뮤니티를 위해 무료로 제공되는 DB2 Express 데이터베이스 서버인 DB2 Express-C 9.7을 다운로드할 수 있다.
- developerWorks에서 직접 다운로드할 수 있는
IBM 시험판 소프트웨어를 사용하여 후속 개발 프로젝트를 구현해 보자.
토론
- 포럼에 참여하기.
- 사용자의 개인 프로파일과 사용자 정의 홈 페이지가 제공되는 My
developerWorks community에서는 관심을 가지고 있는 developerWorks의 여러 주제를 추적할 수 있으며 다른 developerWorks 사용자들과 의견을 나눌 수도 있다.
