지난 3월 DB2 9.7에 대한 Cebit 프리젠테이션에서 필자는 변환기를 사용하지 않은 채로 부주의하게 110V 컴퓨터 스피커를 독일의 230V 전원에 연결하는 바람에 스피커를 고장내고 말았다. 이 여행에서 비슷한 사고로 인해 전동 칫솔 및 면도기용 충전기도 고장났었다. 이처럼 필자는 실수를 하고서도 배우지 못하는 사람 중 하나이기 때문에 출처는 모르지만 "표준과 관련된 문제는 세상 어디에나 널려 있다"는 말에 십분 동감하고 있다.
RDBMS(Relational database management systems)의 경우에는 다행히 적어도 다음과 같은 세 가지 주요 표준과 이러한 표준에 대한 다양한 변형이 있다.
- ANSI SQL 및 ANSI SQL/PSM
- Oracle SQL 및 PL/SQL
- Sybase 및 Microsoft TSQL
그림 1은 다양한 SQL 언어의 관계를 보여 주는 벤 다이어그램이다.
그림 1. 다양한 SQL의 복잡한 관계
애플리케이션을 작성하려면 그때마다 사용할 RDBMS 공급업체를 선택해야 한다. 한번 선택한 후에는 기본적으로 해당 업체에 얽매이게 된다. 저렴한 가격, 향상된 기술 또는 우수한 파트너십을 활용하기 위해 공급업체를 바꾸려고 해도 다른 RDBMS에서 사용하려면 많은 내용을 다시 작성해야 하는 레거시 코드 때문에 쉽사리 시도할 수도 없다. 또한 제품을 변경할 경우 기존의 스킬을 원하는 만큼 쉽게 활용할 수도 없다.
IBM DB2 9.7 for Linux, UNIX and Windows(DB2)는 Oracle용으로 작성된 애플리케이션을 DB2에서 사용하는 데 있어서 걸림돌이 되는 많은 부분을 획기적으로 제거했기 때문에 고객과 공급업체 모두 애플리케이션 히스토리보다는 얻게 되는 장점을 보고 DBMS를 선택할 수 있다.
한 RDBMS용으로 작성된 애플리케이션을 거의 변경하지 않은 채로 다른 RDBMS에서 실행하기 위해서는 많은 부분을 고려해야 한다. 서버에 있는 다양한 잠금 메커니즘, 데이터 유형, SQL 및 프로시저 언어와 애플리케이션 자체에 사용되는 클라이언트 인터페이스까지도 구문 차원뿐만 아니라 의미 차원에서도 적절하게 조정해야 한다.
DB2에는 이러한 단계가 모두 적용되었다. 변경 사항은 예외이지 규칙이 아니다. (IBM은 필요한 애플리케이션 변경 사항에 빠르게 액세스할 수 있다.) 표 1에서는 공통으로 사용되는 기능을 간략하게 설명한다.
표 1. 공통으로 사용되는 기능
| Oracle | --> | DB2 |
|---|---|---|
| 동시성 제어 | --> | 기본 지원 |
| SQL 언어 | --> | 기본 지원 |
| PL/SQL | --> | 기본 지원 |
| PL/SQL 패키지 | --> | 기본 지원 |
| 내장 패키지 | --> | 기본 지원 |
| JDBC 클라이언트(확장 포함) | --> | 기본 지원 |
| SQL*Plus 스크립트 | --> | 기본 지원 |
DB2 9.7에서는 애플리케이션을 더 이상 이식하지 않아도 된다. 단순히 애플리케이션을 활성화하기만 하면 된다. 패키지화된 애플리케이션의 경우에는 하나의 소스를 DB2와 Oracle에서 공유할 수도 있다.
즉, Oracle 애플리케이션을 DB2에서 사용할 수 있도록 만드는 작업은 HP-UX용으로 작성된 C 프로그램을 AIX에서 실행할 수 있도록 만드는 작업보다 쉽다.
과거에 Oracle과 DB2 사이의 가장 큰 차이점 중 하나는 동시성 제어를 처리하는 방법이었다. 대표적인 문구는 "판독자는 작성자를 차단하지 않고 작성자는 판독자를 차단하지 않는다"이다.
표 2. Oracle 동시성 동작
| 보류 중인 트랜잭션 | 동작 | 새 트랜잭션 |
|---|---|---|
| 판독자 | 차단하지 않음 | 판독자 |
| 판독자 | 차단하지 않음 | 작성자 |
| 작성자 | 차단하지 않음 | 판독자 |
| 작성자 | 차단함 | 작성자 |
격리 수준에 대해서는 자세히 다루지 않겠지만 여기에서는 Oracle 기본 명령문 수준 격리를 사용하는 거의 대부분의 애플리케이션이 DB2의 기본 CS(Cursor Stability)와 매우 잘 작동한다는 수준의 언급이면 충분할 것이다.
하지만 지금까지의 CS는 작성자가 판독자를 차단하고, 어떤 경우에는 판독자가 작성자를 차단할 수 있도록 구현되었다. 이렇게 구현한 이유는 CS 격리 하에서의 트랜잭션이 보류 중인 동시 트랜잭션의 변경 "결과를 대기"하기 때문이었다.
표 3. 지금까지의 DB2 동시성 동작(CS 사용)
| 보류 중인 트랜잭션 | 동작 | 새 트랜잭션 |
|---|---|---|
| 판독자 | 차단하지 않음 | 판독자 |
| 판독자 | 거의 차단하지 않음 | 작성자 |
| 작성자 | 차단함 | 판독자 |
| 작성자 | 차단함 | 작성자 |
CS 격리 하에서 실행 중인 트랜잭션이 변경된 행을 만났을 때 결과를 대기할 이유가 없다는 사실이 밝혀졌다. 이 동작은 변경된 행의 현재 커미트된 버전을 읽는 것과 동일한 동작이기 때문이다.
이 동작은 DB2 9.7에서 구현되었다. 즉, DB2는 단순히 로그에서 잠겨 있는 행의 현재 커미트된 버전을 검색한다. 대부분의 경우에는 변경 사항이 아직 커미트되지 않았기 때문에 해당 행이 로그 버퍼에 남아 있다. 하지만 행이 작성된 후 로그 버퍼에서 다시 겹쳐써졌다고 하더라도 DB2가 해당 행의 위치를 정확히 알고 있기 때문에 한 번의 IO 작업만으로도 원하는 버전을 버퍼풀로 가져올 수 있다.
한 사용자가 직원 테이블의 이름을 갱신하고 있고 이 사용자가 변경 사항을 커미트하기 전에 다른 사용자가 해당 테이블을 검색하고 있는 상황을 가정해 보자(그림 2 참조). 일반적으로 두 번째 사용자는 첫 번째 사용자가 커미트하거나 롤백할 때까지 기다려야 했었다. 하지만 이제는 현재 커미트된 데이터 읽기가 지원되므로 두 번째 사용자가 수행한 검색의 결과로 첫 번째 사용자의 변경 사항이 포함되지 않은 버전의 행이 로그 버퍼에서 검색된다.
그림 2. 작성자가 판독자를 차단하지 않음
이 동작의 중요한 특징은 다음과 같다.
- 롤백 세그먼트와 같은 새 오브젝트를 사용하지 않는다.
- 어느 경우에나 로그를 작성해야 하므로 작성자에 대한 성능 오버헤드가 발생하지 않는다.
- 트랜잭션이 열려 있음에도 불구하고 필요한 로그 파일이 아카이브되는 상황처럼 발생하기 어려운 이벤트가 발생할 경우 DB2는 단순히 폴백하여 잠금이 해제될 때까지 기다리므로 "스냅샷이 너무 오래됨"과 같은 상황이 발생하지 않는다.
DB2에는 이러한 변경 사항 외에도 CS 격리 하에서 잠금을 유지하는 판독자를 제거하기 위해 추가 잠금 회피 기술이 도입되었다.
표 4. 새로운 DB2 동시성 동작(CS 사용)
| 보류 중인 트랜잭션 | 동작 | 새 트랜잭션 |
|---|---|---|
| 판독자 | 차단하지 않음 | 판독자 |
| 판독자 | 차단하지 않음 | 작성자 |
| 작성자 | 차단하지 않음 | 판독자 |
| 작성자 | 차단함 | 작성자 |
이 표에서 알 수 있듯이 이제는 동시성 동작이 Oracle의 동시성 동작과 동일하다. 실제로 새로 작성한 DB2 데이터베이스는 기본적으로 이 동작을 제공한다.
모든 데이터베이스의 핵심은 해당 데이터베이스에 있는 데이터이다. 유형이 일치하지 않거나 이러한 유형의 의미가 일치하지 않으면 애플리케이션을 다른 RDBMS에서 사용할 수 있도록 만드는 데 심각한 영향을 줄 수 있다. 따라서 Oracle 애플리케이션을 DB2에서 실행할 수 있으려면 문자열, 날짜 및 숫자와 같이 표준화되지 않은 기본 유형에 대한 지원이 필요하다. 이러한 기본 유형을 맞추는 부분 외에도 Oracle의 PL/SQL에 일반적으로 사용되는 좀 더 복잡한 유형들도 DB2 9.7에 추가되었다.
표 5. 새 DB2 데이터 유형
| 데이터 유형 | 설명 |
|---|---|
| NUMBER | DECFLOAT(Power6 하드웨어 가속 사용) 및 DECIMAL을 기반으로 NUMBER 및 NUMBER(p [, s])에 대한 지원이 추가되었다. |
| VARCHAR2 | VARCHAR2 유형 동작은 NULL로 해석되는 빈 문자열과 후행 공백을 구분하는 데이터 정렬을 포함한다. |
| Oracle DATE | Oracle DATE 모드의 데이터베이스는 달력 날짜와 함께 TIME 구성 요소를 포함한다. |
| TIMESTAMP(n) | 초 단위의 범위를 0(날짜 + 시간)부터 12(피코초) 사이에서 선택할 수 있다. |
| BOOLEAN | 이 유형은 절차적 논리, 변수 및 루틴 매개변수에서 사용할 수 있다. |
| VARRAY | 프로시저의 ARRAY 지원이 VARRAY 유형 메소드 및 구문을 지원하도록 확장되었다. |
| INDEX BY | DB2에서는 일반 배열과 함께 결합형 배열도 지원된다. |
| ROW TYPE | 이 복합 유형은 변수 및 매개변수에서 사용할 수 있으며 배열 및 결합형 배열에 대한 요소로도 사용할 수 있다. |
| Ref Cursor type | 매개변수를 사용하여 커서를 변수에 할당하거나 전달할 수 있다. |
"오리처럼 걷고 오리처럼 말한다면 그것은 분명 오리이다."
이 문구는 PHP 및 Ruby와 같은 같은 여러 새 언어에서 자주 언급되는 문구이다. 모든 리터럴은 문자열이며 컨텍스트에 따라 다른 유형으로 사용된다. SQL 표준을 준수하고 유형 불일치가 코딩 실수를 나타낼 가능성이 높다는 철학에 따라 지금까지 DB2는 문자열과 숫자를 명시적으로 다른 형식으로 캐스팅하지 않는 한 서로 비교할 수 없는 강력한 형식의 규칙을 따랐다.
아쉽게도 Oracle 애플리케이션이 SQL에서 약한 형식 지정을 사용할 경우에는 이 애플리케이션을 DB2에 대해 성공적으로 컴파일할 수 없었다. DB2 9.7에서는 묵시적 캐스팅(약한 형식 지정)이 추가되었다. 즉, 문자열과 숫자를 매우 유연한 방식으로 비교, 할당 및 조작할 수 있게 되었다.
또한 지연된 준비로 인해 형식화되지 않은 NULL을 더 많은 곳에서 사용할 수 있으며 형식화되지 않은 매개변수 마커를 거의 모든 곳에서 사용할 수 있다. 즉, DB2는 첫 번째 실제 값이 나타날 때까지 매개변수 마커의 유형을 확인하지 않는다.
묵시적 캐스팅을 완성하기 위해 DB2에서는 프로시저 매개변수에 기본값을 지정하는 기능과 매개변수에 대한 인수를 이름별로 연결하는 기능을 지원한다.
모든 RDBMS는 데이터에 대한 작업을 수행하는 함수 라이브러리를 제공한다. 하지만 이러한 함수에 같은 이름을 사용하는 경우가 없다는 점이 문제이다. 기능이 매우 비슷한 함수조차도 RDBMS마다 이름이 다르다.
DB2는 이제 기존 함수 세트뿐만 아니라 Oracle과 호환되는 라이브러리도 지원한다. 다음은 이러한 함수 중 일부를 보여 주는 간단한 목록이다.
- 변환 및 캐스팅 함수
-
TO_DATE -
TO_CHAR -
TO_CLOB -
TO_NUMBER -
TO_TIMESTAMP
-
-
날짜 계산
-
EXTRACT -
ADD_MONTHS -
MONTHS_BETWEEN -
NEXT_DAY - 요일 부분을 추가하는 더하기(+) 부호
-
-
문자열 조작
-
LPAD -
RPAD -
INSTR -
INITCAP SUBSTR에 대한 확장
-
-
기타
-
NVL -
DECODE -
LEAST -
GREATEST -
BITAND
-
두 제품에서 동일하게 지원되는 함수가 많아졌다는 것은 Oracle 애플리케이션을 DB2에서 사용할 수 있도록 만드는 작업의 기본적인 성공률이 높아졌다는 것을 뜻한다.
'DB2 9.7 for Linux, UNIX and Windows에서 Oracle 애플리케이션 실행하기(2)'보기
교육
-
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 사용자들과 의견을 나눌 수도 있다.
