ProMapper 사용하기
본 장에서는 리소스 타입별로 생성된 ProMapper 리소스를 사용하는 방법에 대해 알아본다. 더불어 가변배열 구조체를 사용하는 방법에 대해서도 설명한다.
1. ProMapper 리소스 사용
리소스 타입별로 생성된 ProMapper 리소스를 사용하기 앞서 다음과 같은 사항을 숙지한다.
-
구조체와 전문이 1:1인 경우의 구조체와 전문 간의 ProMapper 변환 API를 이용하여 매핑을 수행한다.
-
구조체와 전문이 1:1이 아닌 경우의 개발자가 ProMapper 리소스 간의 매핑 규칙을 설정한 맵을 기반으로 구조체와 전문 간의 변환 매핑을 수행한다.
본 장에서는 아래와 같은 가정을 기준으로 ProMapper 리소스를 사용하는 방법에 대하여 설명한다.
-
가정 1
구조체와 전문은 1:1 관계가 성립되었다. 즉, ProMapper가 자동으로 구조체와 전문간의 변환 매핑을 수행하겠다는 내용으로 가정한다.
-
가정 2
구조체와 전문이 1:1 관계가 아니라면 개발자가 직접 맵을 이용하여 매핑을 수행하겠다는 내용으로 가정한다.
|
ProFrame는 구조체와 전문을 매핑할 때 순서가 매우 중요하므로 주의해야 한다. |
1.1. 구조체와 전문이 1:1인 경우 변환
구조체 변환
다양한 외부 채널에서 들어온 전문을 애플리케이션 프로그램에서는 구조체로 변환한 후에 구조체를 기반으로 비즈니스 로직을 수행하게 된다. 구조체 변환이 필요한 부분에서 ProMapper에서 제공하는 구조체 변환함수(pfmMapperUnmarshal)를 사용한다. 이 함수만 호출하면 애플리케이션 프로그램에서 쉽게 구조체로 변환된다. 전문의 구조체 변환은 FixedLength 방식 및 Delimiter 방식을 지원한다.
다음은 FixedLength 전문을 구조체로 변환하는 예이다.
char *teststr1Msg="TestVar01 TestVar02 " ;
Teststr1 *teststr1;
long teststr1MsgLen, teststr1Len;
…
teststr1MsgLen = strlen(teststr1Msg);
//전문 -> 구조체 변환
rc = pfmMapperUnmarshal("Teststr1", MESSAGE_FIXEDLENGTH, teststr1Msg,
&teststr1MsgLen, &teststr1, &teststr1Len, NULL);
|
예제에 사용되는 API에 대한 자세한 설명과 파라미터별 상세 기능의 설명은 ProMapper API를 참고한다. |
전문 변환
애플리케이션 프로그램에서 외부 채널로 데이터를 보낼 때 또는 요청에 대한 응답 및 다른 시스템과 연동할 때에 구조체를 그대로 보내는 경우에는 포인터, endian, integer type size 등의 문제가 발생하므로 다시 전문 형태로 변환해서 전달해야 한다. ProMapper에서 제공하는 전문 변환함수(pfmMapperMarshal)는 구조체를 플랫폼에 독립적인 형태로 전문를 조립해서 통신 모듈에 전달해 줌으로써 애플리케이션 프로그램을 외부 채널에 영향 받지 않고 독립적으로 구성할 수 있다.
구조체의 전문 변환은 FixedLength 방식 및 Delimiter 방식을 지원한다.
다음은 구조체를 FixedLength 전문으로 변환하는 예이다.
Teststr1 *teststr1;
char *teststr1Msg;
long teststr1MsgLen;
…
//구조체-> 전문 변환
rc = pfmMapperMarshal("Teststr1", MESSAGE_FIXEDLENGTH, teststr1,
&teststr1Msg, &teststr1MsgLen, NULL);
|
예제에 사용되는 API에 대한 자세한 설명과 파라미터별 상세 기능의 설명은 ProMapper API를 참고한다. |
1.2. 구조체와 전문이 1:1이 아닌 경우 변환
일명 맵 변환이라고 부르며, 구조체와 전문이 1:1인 경우에도 개발자가 맵을 이용하여 변환할 수 있다. 맵을 이용한 변환이 필요한 부분에서 ProMapper에서 제공하는 변환 함수(pfmMapperConv)를 사용한다. 이 함수를 호출하여 맵에 정의된 매핑 규칙대로 변환한다. 이뿐만 아니라 구조체 변환, 전문 변환, 구조체 간 변환, 전문 간 변환 모두 맵을 이용하여 변환할 수 있다. 추가 설명은 ProMapper API를 참조한다.
다음은 맵을 이용하여 구조체간 변환하는 예이다.
Teststr1 *source;
Teststr2 *target;
long sourceLen;
long targetLen;
sourceLen = sizeof(source);
…
rc = pfmMapperConv("Testmap", source, sourceLen, target, &targetLen, NULL);
1.3. EMB Designer에서 구조체 간 변환
구조체에서 구조체로 변환할 때 스튜디오에 내장된 EMB Designer에서 변환을 수행할 수 있다.
구조체 간의 변환은 EMB 모듈에서 다음과 같은 경우에 필요하다. 구조체 간의 변환은 Bypass 방식을 지원한다.
-
서비스 모듈에서 서비스 모듈을 호출하는 경우
-
서비스 모듈에서 비즈니스 모듈을 호출하는 경우
-
서비스 및 비즈니스 모듈에서 DBIO를 호출하는 경우
Bypass
Bypass는 원본 구조체와 대상 구조체의 필드 항목이 동일한 경우 매핑 과정을 수행하지 않고 대상 구조체로 직접 원본 구조체의 값을 전달받는 경우를 의미한다. 즉, 변환 없이 값을 전달할 때 사용된다.
다음은 EMB Designer에서 Bypass가 수행되는 예이다. EMB Designer에서 입력 변환을 수행할 모듈을 선택한 후 오른쪽 마우스 버튼을 클릭하면 메뉴가 나타난다.
본 예제에서는 [입력 변환] 메뉴를 선택한다. 선택 후에는 변환을 수행할 수 있는 맵 대화상자가 나타난다. 이 대화상자에서 Bypass를 선택한다.
맵 대화상자 화면는 왼쪽의 원시 변수 목록과 오른쪽의 대상 변수 목록은 스튜디오에서 자동으로 생성해 주는 영역이다. 이 대화상자에서 변환을 수행하는 방법은 화면 왼쪽에 보이는 변환 대상인 변수들 중에 특정 변수를 화면 오른쪽으로 이동하는 것이다. 변환 작업을 완료하면 [저장] 버튼을 클릭한다. 이때 EMB 모듈에 소스가 자동으로 생성된다. 이 과정을 끝으로 입력 변환을 완료한다. 출력 변환 역시 동일한 방법으로 변환을 수행 할 수 있다.
2. 가변배열 구조체 사용
가변배열은 구조체 필드의 반복횟수가 가변(변수)인 경우인 반면에 고정배열은 구조체 필드의 반복횟수가 고정(상수)인 경우를 뜻한다.
|
서비스 모듈, 비즈니스 모듈에서 가변배열 구조체 사용은 되도록 피하는 것이 좋다. 가변배열과 관련된 API를 호출할 때마다 내부적으로 메모리 재할당이 발생하므로 시스템 성능에 영향을 주며, 또한 메모리 힙 영역을 사용하므로 동작할 때 무한한 데이터를 가변배열에 할당하게 된다. 이로 인해 다른 프로세스에까지 영향을 줄 수 도 있다. 그러므로 가변배열 사용이 부득이한 경우를 제외하고는 사용하지 않도록 한다. |
가변배열을 사용할 때는 최대 배열 크기를 정해놓고 최대 배열 크기보다 크면 더 이상 처리하지 않도록 해야 한다. 특히 DBIO의 출력을 가변배열로 할당하여 사용하는 경우는 더더욱 주의해야 한다. 시스템 운영 중에 DBIO의 출력 건수가 무한히 발생하는 경우 시스템에 대한 영향도가 심각해질 수 있기 때문이다.
가변배열을 꼭 사용해야 하는 경우에는 pfmVarrayCount API를 이용하여 가변배열에 들어가는 배열의 최대 건수를 설정하여 검사하는 프로그램 로직을 반드시 작성하도록 한다. API에 대한 자세한 설명은 ProMapper API를 참고한다.
2.1. 가변배열 구조체 생성
출력 구조체의 반복 횟수를 설정할 수 없는 경우에는 다음과 같이 가변배열 출력 구조체를 생성한다. 생성하는 방법은 Include된 구조체의 배열 개수를 가변으로 선언하는 것이다.
다음은 가변배열 구조체를 생성하는 예이다.
아래 그림을 예로 들어 구조체 필드 중 ‘str1_in_physical’의 배열 크기를 상수값이 아닌 ‘cnt’라는 필드로 설정한다. 따라서 ‘str1_in_physical’ 배열은 ‘cnt’라는 필드로 인해 가변배열 구조체가 된 것 이다. 단, ‘cnt’ 변수는 반드시 구조체 내에 존재하는 필드여야 한다.
위와 같이 생성된 가변배열 구조체를 사용하기 위해서는 가변 API를 사용한다.
다음은 가변배열 구조체를 사용하기 위해서 다음의 단계를 수행한다.
-
최대 배열 개수 검사
애플리케이션 프로그램은 사용할 최대 배열 개수를 설정하여 반드시 검사하는 단계를 거쳐야 한다. 최대 배열 개수는 해당 구조체의 "sizeof 크기 * 가변배열 개수" 값과 출력을 지원하는 최대 크기를 비교하여 결정한다.
최대 배열 개수는 pfmVarrayCount API를 사용하고 배열 개수를 초과하여 가변배열 할당을 하는 경우에는 다음과 같이 에러처리를 한다.
if( pfmVarrayCount(OUTPUT->str1_in_physical) >= 25 ){ PFM_ERR("TRSE001001", "최대 출력 건수 초과입니다. 할당된 건수:[%ld] 건 ", pfmVarrayCount(OUTPUT->str1_in_physical)); return RC_ERR; } -
가변배열 할당
가변배열 할당은 pfmVarrayAppend API를 사용하여 한 건씩 할당해주어야 한다. 출력으로 나가는 건수를 지정하는 ‘OUTPUT→cnt’ 값을 다음과 같이 증가시켜준다.
for( int i = 0; i < PDB_RECNUM; i++){ /* 메크로 PDB_RECNUM은temporaryOutput2 값이 존재하는 record 건수 */ pfmVarrayAppend( OUTPUT->str1_in_physical, &temporaryOutput2[i]); OUTPUT->cnt++; }가변배열을 사용에 대한 자세한 설명은 가변배열 사용예제를 참고한다.