소개
본 장에서는 Tmax RPC(Remote Procedure Call)의 개념과 종류, 제약사항에 대해서 설명한다.
1. 개념
Tmax는 tpcall, tpacall과 같은 API를 이용하여 서버에 있는 서비스를 호출하는 구조이다.
애플리케이션 개발자는 해당하는 서비스명에 따른 입력 인자, 출력 인자를 사전에 다른 문서 전달이나 협의를 통해서 개발을 수행해야 한다. 그 외에 서버에서 호출할 함수에 대한 인터페이스를 정의한 후 해당 인터페이스를 통한 특정 유틸리티를 이용하는 방법이 있다. 이 방법을 이용하면 서버는 skeleton 소스 파일을 클라이언트는 stub 소스 파일을 자동으로 생성하여 개발자들에게 배포하여 서버와 클라이언트 애플리케이션을 구현할 수 있다.
Tmax RPC는 이런 경우에 인터페이스를 정의하여 Tmax를 즉시 사용할 수 있도록 하는 추가 구성 요소이다. Tmax RPC는 SQL 문을 통해서 함수 인터페이스를 추출하는 방식으로 인터페이스를 정의한다. 사용자가 SQL 문을 작성하면 그것을 분석하여 함수의 인자로 정의할 수 있는 구조이다.
다음은 SQL 문의 작성 예제이다.
ins_test: INSERT INTO sample(no, name) VALUES ($empno, '$name');
위의 SQL 문에 의해 다음과 같은 함수가 정의되어 클라이언트 애플리케이션을 구현할 때 즉시 사용할 수 있다.
int ins_test(char *empno, char *name)
2. 종류
Tmax RPC는 서비스 방법에 따라 다음과 같이 3가지로 구분된다.
-
Data Access Server(이하 DA 서버)
-
TP Server(이하 TP 서버)
-
Function Server(이하 FS 서버)
2.1. DA 서버
DA 서버는 하나의 SQL 쿼리로 이루어진 업무에 사용하며 인터페이스는 SQL을 통해서 정의한다.
DA 서버는 단건의 쿼리를 수행하기 때문에 업무 서버는 Non-XA 모드로 설정해야 한다. 해당 설정에 대한 자세한 설명은 Tmax Application Development Guide의 트랜잭션을 참고한다. |
DA 서버를 사용할 경우의 Tmax는 다음과 같은 프로세스로 동작한다.
DA 서버를 사용하기 위한 서버와 클라이언트의 구성은 다음과 같다.
DA 서버를 사용할 경우 개발자는 업무 서버의 설정과 빌드만 완료하면 추가적인 코딩 없이 바로 업무를 수행할 수 있다.
예를 들어 ins_test라는 이름의 insert 업무를 생성할 경우 dstest.sql이라는 파일에 인터페이스를 정의한다. Tmax RPC는 서버명을 인터페이스 파일명과 동일하게 생성하기 때문에 dstest라는 이름으로 서버명을 정의하고, 서비스명 또한 dstest로 정의한다(Tmax에서는 서버와 서비스라는 개념이 있기 때문에, 설정에도 이와 같은 개념이 반영되어야 한다). 개발자는 직접 dstest라는 서비스를 호출하거나 정의하지는 않지만, 클라이언트에서 ins_test라는 함수를 호출하면 내부적으로 필드 버퍼를 생성하여 dstest를 tpcall하고, dstest라는 서버는 해당하는 쿼리를 수행한다.
다음은 DA 서버의 환경설정과 SQL 인터페이스 파일에 대한 예제이다.
-
DA 서버의 환경설정 예제
*SVRGROUP svg_rpc NODENAME =tmaxi4 *SERVER dstest SVGNAME = svg_rpc, CLOPT="-e $(SVR).out -o $(SVR).out -- -uscott -ptiger" *SERVICE dstest SVRNAME = dstest
-
DA 서버의 SQL 인터페이스 파일 예제
DA 서버의 SQL 인터페이스 파일은 idlc 옵션에 따라 생성되는 파일이 달라진다. SQL 인터페이스 정의 파일의 작성 방법에 대한 자세한 내용은 SQL 인터페이스 정의 파일을 참고한다.
### dstest.sql ### #insert ins_test: INSERT INTO sample(no, name) VALUES ($empno, '$name'); #delete del_test: DELETE FROM sample WHERE no = $empno; #select all sel_all_test: SELECT [int] no, name FROM sample; #select name sel_test: SELECT name FROM sample WHERE no = $empno; #delete all del_all_test: DELETE FROM sample; #update update_test: UPDATE sample SET name='$name' WHERE no=$empno; #select binary b_sel_test: SELECT [binary] b_data FROM b_test_table; #insert binary b_ins_test: INSERT INTO b_test_table VALUES $b_data[binary] ;
2.2. TP 서버
TP 서버는 하나의 SQL 쿼리를 통해서는 이루어질 수 없으며, 트랜잭션을 사용해서 여러 개의 RPC가 같이 처리되어야 하는 업무에 사용한다.
TP 서버를 사용할 경우의 Tmax는 다음과 같은 프로세스로 동작한다.
TP 서버를 사용하기 위한 서버와 클라이언트의 구성은 다음과 같다.
DA 서버는 Non-XA로 수행하기 때문에 여러 쿼리를 하나의 업무에 사용하는 것은 적당하지 않다. 중간에 TP 서버가 위치하고, TP 서버에서 트랜잭션을 시작해 DA 서버들의 함수를 호출하면 여러 쿼리를 하나의 트랜잭션으로 구성할 수 있는 모델이 가능하다.
TP 서버를 사용하려면 서버를 클라이언트에서 호출할 수 있는 인터페이스 파일과 DA 서버에서 사용할 인터페이스 SQL 파일이 필요하다. 클라이언트 애플리케이션은 TP 서버의 API를 호출하며, TP 서버의 API는 DA 서버의 API를 호출하도록 작성을 하는 방식이다. DA 서버는 하나의 트랜잭션에 포함되어야 하기 때문에 xa svg에 설정을 해야 한다.
다음은 TP 서버의 환경설정과 인터페이스 파일에 대한 예제이다.
-
TP 서버의 환경설정 예제
*SVRGROUP svg_xarpc NODENAME = tmaxi4, OPENINFO = "Oracle_XA+Acc=P/scott/tiger+SesTm=60", DBNAME = ORACLE, TMSNAME = "tms_ora" *SERVER tstest SVGNAME = "svg_rpc" db1 SVGNAME = "svg_xarpc" *SERVICE TSTEST SVRNAME = tstest db1 SVRNAME = db1
-
TP 서버의 API 인터페이스 파일 예제
API 인터페이스 파일의 작성 방법에 대한 자세한 내용은 API 정의 파일을 참고한다.
<*.def>
### tstest.def ### interface TSTEST { long trans_select ( [out] long sel_rows, [out] int empno[sel_rows], [out] char ename[][]); long trans_insert ( [in] int dummy); long trans_clear ( [in] int dummy); }
-
DA 서버의 SQL 인터페이스 파일 예제
DA 서버의 SQL 인터페이스 파일 예제는 DA 서버를 참고하고, 작성 방법에 대한 자세한 내용은 SQL 인터페이스 정의 파일을 참고한다.
2.3. FS 서버
FS 서버는 SQL과 상관없는 사용자 정의 함수를 호출하기 위해 사용한다. 예를 들어 클라이언트가 요청한 파일을 읽어주는 것과 같은 업무를 수행할 수 있다.
동작 방식은 DA 서버가 필요없다는 것만 제외하면 TP 서버와 동일하다.
FS 서버를 사용하기 위한 서버와 클라이언트의 구성은 다음과 같다.
FS 서버를 사용하려면 API 인터페이스 파일을 생성해서 서버 코드와 클라이언트 코드를 작성하여 수행해야 한다.
다음은 FS 서버의 환경설정과 인터페이스 파일에 대한 예제이다.
-
FS 서버의 환경설정 예제
*SVRGROUP svg_rpc NODENAME =tmaxi4 *SERVER fstest SVGNAME = svg_rpc, CLOPT="-e $(SVR).out -o $(SVR).out -- -uscott -ptiger" *SERVICE fstest SVRNAME = fstest
-
FS 서버의 API 인터페이스 파일 예제
API 인터페이스 파일의 작성 방법에 대한 자세한 내용은 API 정의 파일을 참고한다.
<*.def>
interface FSTEST { long plus( [in] int a, [in] int b, [out] int c ); long savefile ( [in] char filename[], [in] char data[] ); long readfile ( [out] char filename[], [out] char data[] ); }
3. 환경변수
다음은 Tmax RPC 환경변수 목록이다.
환경변수 | 내용 |
---|---|
TMAX_PRB_RPC_BLOB_NULL |
RM을 사용하는 환경에서 BLOB 및 LongRaw 타입을 조회하는 경우 길이가 0(null)이어도 해당 환경변수에 'Y’를 설정하면 정상처리하도록 동작한다. 기본 동작은 동일 상황에서 에러를 리턴한다. |
TMAX_PRB_RPC_NODATA_ERROR |
RM을 사용하는 환경에서 해당 환경변수를 'Y’로 설정하는 경우 UPDATE, DELETE, INSERT할 때 sqlca.sqlerrd[2]의 row 개수가 0인 경우 강제 에러 처리하도록 한다. |
4. 제약사항
Tmax RPC는 다른 일반 서비스를 수행하는 서버에서 RPC서버로의 호출은 불가능하다.
또한, 다음의 OS와 DB 종류만 지원한다. (64bit만 지원)
OS | Oracle 11 | Sybase 15.5 | Tibero 4 SP1 |
---|---|---|---|
HP-IA 11.23 |
O |
O |
O |
HP-IA 11.31 |
O |
O |
O |
AIX 5.3 |
O |
O |
O |
AIX 6.1 |
X |
O |
O |
SUN5.10 sparc |
O |
O |
O |
Linux x86_64 |
O |
O |
O |
RPC Tibero 라이브러리는 Tibero 4 SP1 버전으로 빌드되어 배포한다. 다른 버전 Tibero를 사용하는 경우 해당 버전으로 빌드한 라이브러리를 요청해야 한다. |