EMB 시작하기
본 장에서는 EMB Designer에서 EMB 모듈을 생성하는 절차와 방법에 대해 설명한다.
|
본 안내서의 내용은 스튜디오 환경에서 작성되었다. |
1. EMB 모듈 생성 절차
다음은 EMB 모듈을 생성하는 절차이다.
-
모듈 기본 정보 등록
스튜디오에서 EMB 모듈을 생성하기 위한 모듈의 기본 정보를 등록한다. 상세한 내용은 모듈 기본 정보 등록을 참고한다.
-
플로우 작성
등록된 모듈의 기본 정보를 기준으로 EMB Designer에서 서비스 또는 업무 플로우 다이어그램을 작성한다. 상세한 내용은 플로우 작성을 참고한다.
-
플로우 편집
EMB Designer에서 서비스 또는 업무 플로우 다이어그램을 편집한다. 상세한 내용은 플로우 편집을 참고한다.
-
컴파일, Dlupdate
작성이 완료된 EMB 모듈을 컴파일 및 Dlupdate하여 EMB 모듈을 생성한다. 상세한 내용은 컴파일, Dlupdate를 참고한다.
-
단위 테스트
생성된 EMB 모듈이 정상적으로 수행되는지 테스트한다. 상세한 내용은 단위 테스트를 참고한다.
2. 모듈 기본 정보 등록
다음은 모듈의 기본 정보를 등록하는 절차이다.
-
작업영역 내비게이터에서 오른쪽 마우스 버튼을 클릭한 후 [New] > [EMB Design] 메뉴를 선택한다.
-
다음과 같이 신규 서비스 모듈 생성 대화상자가 나타난다. 신규 서비스모듈 생성 대화상자는 EMB 모듈을 생성하기 위한 모듈의 기본 정보를 등록하는 역할을 수행한다.
신규 서비스모듈 생성 대화상자항목 설명 리소스 타입
생성할 EMB 모듈의 리소스 유형을 선택한다.
논리명
생성할 EMB 모듈의 리소스 논리명을 입력한다.
물리명
생성할 EMB 모듈의 리소스 물리명을 입력한다.
리소스 그룹
생성할 EMB 모듈의 리소스 그룹을 선택한다.
리소스 그룹은 개발의 편의를 위해 리소스를 분류한 일종의 폴더라고 할 수 있으며, WebAdmin에 등록된 리소스 그룹만 표시된다. 만약 원하는 리소스 그룹이 없는 경우 WebAdmin에서 추가할 수 있다.
리소스 그룹을 추가하기 위해서는 WebAdmin에 접속한 후 [메타관리] > [메타시스템] > [리소스 그룹 관리] 메뉴를 선택한다. 리소스 그룹관리 화면에서 현재 설정된 리소스 그룹을 확인하고 추가할 리소스 그룹을 등록한다.
입력 구조체
생성할 EMB 모듈의 입력 구조체를 지정한다. (작업영역 구조체만 사용 가능)
출력 구조체
생성할 EMB 모듈의 출력 구조체를 지정한다. (작업영역 구조체만 사용 가능)
거래 코드
외부에서 서비스 모듈을 호출할 때 필요한 키 값으로 사용될 코드를 입력한다. 이 코드는 리소스 타입이 서비스 모듈인 경우에만 해당한다.
서비스명 (영문, 숫자)
Tmax 서버에 등록되어 있는 서비스명으로 서비스 모듈이 등록될 때 식별 가능한 논리명을 입력한다. 이 항목은 리소스 타입이 서비스 모듈인 경우에만 해당된다.
설명
생성할 EMB 모듈의 리소스에 대한 부가 설명을 입력한다.
다음은 신규 서비스모듈 생성 대화상자에서 입력 구조체와 출력 구조체를 지정하는 절차이다.
-
[…] 버튼을 클릭한다. 이 버튼을 클릭하면 입력 구조체 또는 출력 구조체 영역에 상관없이 지정할 수 있다.
-
입출력 구조체 지정 대화상자가 나타난다.
입출력 구조체 지정 대화상자 – 입력 구조체 -
[입력 구조체] 탭에서 검색할 입력 구조체 이름을 입력한 후 [검색] 버튼을 클릭한다.
-
검색 결과 중에서 원하는 입력 구조체를 더블클릭하면 '현재 데이터'에 선택된 입력 구조체의 '논리명[물리명]'이 표시된다. 다른 입력 구조체를 선택할 때는 [삭제] 버튼을 클릭한다.
-
입력 구조체 선택이 완료되면 [출력 구조체] 탭을 선택한다. 검색할 출력 구조체 이름을 입력한 후 [검색] 버튼을 클릭한다.
입출력 구조체 지정 대화상자 – 출력 구조체 -
위와 같이 입출력 구조체가 모두 선택되면 [확인] 버튼이 활성화된다. [확인] 버튼을 클릭하면 입출력 구조체 지정 대화상자가 닫히고, 신규 서비스모듈 생성 대화상자의 입출력 구조체 영역에 선택된 구조체 정보가 표시된다. 이때 표시되는 정보는 입출력 구조체명과 논리명이다. 만약 지정한 입출력 구조체를 삭제하려면 각 구조체의 논리명 옆에 위치한 [삭제] 버튼을 클릭한다.

-
-
위와 같이 신규 서비스모듈 생성 대화상자에서 모듈의 기본 정보를 모두 설정한 후 [완료] 버튼을 클릭하면 EMB 모듈을 디자인할 수 있는 화면으로 이동된다.
3. 플로우 작성
플로우 작성은 EMB Designer에서 등록된 모듈의 기본 정보를 기준으로 EMB 모듈을 디자인하는 작업이다.
본 절에서는 이전 절의 모듈 기본 정보를 기준으로 모듈 편집기, Palette 메뉴별 기능 등을 섹션으로 나누어 EMB 모듈의 플로우 다이어그램을 디자인하는 방법에 대해 설명한다. 추가적으로 내비게이터 영역 및 리소스풀(RI 리소스)에 등록된 외부 모듈 즉, 호출 모듈을 이용하여 EMB 모듈의 플로우를 작성하는 방법도 설명한다.
3.1. 모듈 편집기
다음은 모듈 편집기의 구성요소별로 생성된 화면에 대한 설명이다. 이 화면에 대한 설명은 모듈 편집기 하단 탭에 배치된 순서로 한다.
디자인 편집기
디자인 편집기는 모듈의 기본 정보를 등록한 후 나타나는 초기 화면으로 EMB 모듈의 플로우를 가시적으로 나타내는 화면이다.
메타 편집기
메타 편집기는 모듈의 XML 정보를 나타내는 화면이다.
소스 편집기
소스 편집기는 모듈의 소스 정보를 나타내는 화면이다.
다음은 소스 편집기 예제 화면에 있는 일부 소스 내용에 대한 설명이다.
① long CustomerInfoManagement(test_dept_qpstest_p_s2In *input,
test_dept_qpstest_p_s2Out *output)
{
CustomerInfoManagementContext \__context;
② CustomerInfoManagementContext *context = &__context;
③ long rc = RC_NRM;
bzero(context, sizeof(CustomerInfoManagementContext));
context->input = input;
context->output = output;
return RC_NRM;
PFM_CATCH:
return rc;
}
다음은 위 소스 중 ① ~ ③번에 대한 설명이다.
① 모듈 기본 정보 등록에서 등록한 모듈의 기본 정보 중 물리명(CustomerInfoManagement)이 외부에서 호출될 수 있도록 함수명으로 소스가 생성되어 있다. 그리고 입출력 구조체는 파라미터(test_dept_qpstest_p_s2In *input, test_dept_qpstest_p_s2Out *output)로 설정되어 있는 것을 확인할 수 있다.
② 컨텍스트 구조체(*context)는 생성된 모듈이 사용하는 모든 입출력 구조체를 하나의 구조체로 감싼 구조체를 말한다.
③ 소스 내부에서 함수 실행의 성공 여부를 알려주는 반환 값(RC_NRM)을 정의한다.
헤더 파일 뷰어
헤더 파일 뷰어는 자동으로 생성된 모듈의 헤더 파일 정보를 나타내는 화면이다.
다음은 헤더 파일 뷰어 예제 화면에 있는 헤더 파일의 주요 내용에 대한 설명이다.
// Context Data
① typedef struct {
test_dept_qpstest_p_s2In *input;
/* test_dept_qpstest_p_s2In(test_dept_qpstest_p_s2In) */
test_dept_qpstest_p_s2Out *output;
/* test_dept_qpstest_p_s2Out(test_dept_qpstest_p_s2Out) */
} CustomerInfoManagementContext;
② #define INPUT (context->input)
③ #define OUTPUT (context->output)
다음은 위 소스 중 ① ~ ③번에 대한 설명이다.
① 소스 편집기에 정의되어 있는 컨텍스트 구조체가 설정되어 있다.
② 소스 코딩의 편의를 위해 입력 매크로가 자동으로 정의되어 있다.
③ 소스 코딩의 편의를 위해 출력 매크로가 자동으로 정의되어 있다.
위와 같이 자동으로 생성된 헤더 파일 외에 소스 상에 헤더 파일을 추가로 정의하려면 ProFrame가 제공하는 헤더 파일 생성 기능을 사용한다.
다음은 헤더 파일을 생성하는 절차이다.
-
작업영역 내비게이터에서 오른쪽 마우스 버튼을 클릭한 후 [New] > [Header] 메뉴를 선택한다.
-
다음과 같이 헤더파일 생성 프로젝트 대화상자가 나타난다.
헤더파일 생성 프로젝트 대화상자항목 설명 리소스 그룹
헤더 파일의 리소스 그룹을 선택한다.
물리명
헤더 파일의 물리명을 입력한다.
논리명
헤더 파일의 논리명을 입력한다.
-
헤더 파일 생성에 필요한 정보를 입력한 후 [완료] 버튼을 클릭하면 생성된 헤더 파일을 수정할 수 있는 헤더 소스 화면이 나타난다.
헤더 파일 생성 후 헤더 소스 화면이렇게 생성된 헤더 파일은 EMB 모듈에서 include하여 사용할 수 있다.
3.2. Palette
[Palette] 메뉴는 플로우 작성에 필요한 다이어그램, 리소스들이 나열되어 있는 영역으로 플로우 다이어그램을 작성할 때 사용할 수 있는 각종 노드를 생성한다. 여기서 노드들은 [Palette] 메뉴에서 제공하는 기능성 버튼으로 연결하고 선택할 수 있다.
[Palette] 메뉴를 이용하여 플로우 다이어그램을 작성하려면 먼저 다이어그램에 대한 이해와 다이어그램을 구성하는 각종 노드에 대한 상세 설명이 필요하다.
플로우 다이어그램
플로우 다이어그램은 생성된 EMB 모듈에 대한 업무 흐름 즉 플로우를 정의하고 각 노드간의 연결 및 관계 등을 디자인하는 도면이라고 할 수 있다. 그리고 이 플로우 다이어그램은 각 노드가 포함하고 있는 정보나 속성들을 아이콘과 조합된 그림으로 보여줌으로써 쉽게 모듈의 플로우를 작성할 수 있다.
-
노드
[Palette] 메뉴의 일반 모듈 영역에서 선택된 모듈에 따라 나타나는 노드이다.
일반 모듈 노드 Inner 모듈

가상 모듈

루프 모듈

노드를 디자인 편집기 화면에 나타내려면 일반 모듈 영역에서 모듈을 선택한 후 원하는 위치에 배치한다.
내비게이터 영역에서 선택된 리소스 모듈에 따라 나타나는 노드이다.
프로바이더 리소스 모듈 노드 PROBUILDER
biz_module
batch_module

PROBUILDER
service_module

DBIO
persist
view
execsql
dynamicsql

노드를 디자인 편집기 화면에 표시하려면 내비게이터 영역에서 리소스 모듈을 선택한 후 마우스로 드래그 앤드 드롭하여 원하는 위치에 배치한다.
-
노드의 속성 아이콘
플로우 다이어그램에 표현되는 각종 노드는 속성을 가지며, 속성에 따라 보여지는 아이콘 모양이 다르다.
속성 아이콘 설명 모듈

Exception-Catch 절에 포함되어 있는 경우 Exception 처리를 한다.

Inner 모듈이 Function 타입인 경우 소스에 함수 호출로 나타난다.

코드 영역 진입 지점에 if 조건문이 삽입되어있다.
DBIO 모듈

Persist(UPDATE나 INSERT할 때 사용된다)

View(SELECT할 때 사용된다)

ExecSQL(RunTime에 정해진 쿼리를 선택하여 사용한다)

DynamicSQL(RunTime에 쿼리가 동적으로 생성되어 사용한다)

Fetch(여러 건의 데이터 조작을 처리한다)
I/O Mapping
Business 모듈, Batch 모듈, DBIO 모듈의 경우 매핑으로 입출력 구조체를 연결하고 파라미터를 주고 받는다. 이 상태를 표시하는 아이콘은 매핑 방식(Bypass, Transformation)에 따라 다르다.

입력 구조체일 때 Bypass
(생성된 EMB 모듈의 입력 구조체와 이 EMB 모듈 내에서 호출되는 모듈의 입력 구조체가 동일한 경우 표시되는 아이콘이다. 따라서 모듈 간의 파라미터로 사용되는 입력 구조체가 동일하므로 데이터가 그대로 통과된다)

출력 구조체일 때 Bypass
(생성된 EMB 모듈의 출력 구조체와 이 EMB 모듈 내에서 호출되는 모듈의 출력 구조체가 동일한 경우 표시되는 아이콘이다. 따라서 모듈 간의 파라미터로 사용되는 출력 구조체가 동일하므로 데이터가 그대로 통과된다)

입력 구조체일 때 Transformation
(생성된 EMB 모듈의 입력 구조체와 이 EMB 모듈 내에서 호출되는 모듈의 입력 구조체가 동일하지 않는 경우 변환 처리 후에 데이터를 변경하여 입력할 때 표시된다)

출력 구조체일 때 Transformation
(생성된 EMB 모듈의 출력 구조체와 이 EMB 모듈 내에서 호출되는 모듈의 출력 구조체가 동일하지 않는 경우 변환 처리 후에 데이터를 변경하여 출력할 때 표시된다)
-
노드 상태
플로우 다이어그램에 표현되는 각종 노드는 변경 내용에 대한 상태를 확인할 수 있다. 여기서 노드는 상태를 의미하는 기호를 조합하여 새로운 노드 모양으로 나타난다.
상태 노드 설명 Inner 모듈 Exception

Inner 모듈 소스에 static 함수를 호출한 후 Catch 문을 추가하여 Exception을 처리한다.
Catch Exception

Business 모듈, Batch 모듈, DBIO 모듈 소스에 static 함수를 호출한 후 Catch 문을 추가하여 Exception을 처리한다.
Disabled

플로우 다이어그램에는 나타나지만 실제 소스 편집기에서는 소스가 없다.
-
플로우 다이어그램의 표현 방식
플로우 다이어그램은 모듈의 속성 변경이나 설정 내용에 따라 나타나는 형태가 다르다. 속성을 확인하려면 [Palette] 메뉴의 [특성 뷰 보기]를 클릭한다. 이 바로가기 버튼을 클릭하면 EMB Designer 영역 아래에 특성 뷰가 나타난다.
-
Inner 모듈
다이어그램 속성 및 설명 
Inner 모듈를 삽입하면 기본으로 이 다이어그램이 나타난다.
이 다이어그램은 특성 뷰의 Kind 속성에 function으로 설정할 때 표시된다.

Inner 모듈에 Exception 처리를 설정한 경우에 표시된다.
이 다이어그램은 특성 뷰의 Exception 영역에 있는 'Ignore exception flag' 속성을 ‘true’로 설정할 때 표시된다.

이 다이어그램은 특성 뷰의 'Kind' 속성에 'block’으로 설정할 때 표시된다.
-
가상 모듈
다이어그램 속성 및 설명 
가상 모듈를 삽입하면 기본으로 이 다이어그램이 나타난다.

가상 모듈에 예외처리를 설정할 때 표시된다.
-
DBIO 모듈
DBIO에 대한 상세한 내용은 ProFrame DBIO 개발 안내서를 참고한다.
다이어그램 속성 및 설명 
Persist 쿼리 타입의 DBIO 모듈을 삽입할 때 표시된다.

View 쿼리 타입의 DBIO 모듈을 삽입할 때 표시된다.

ExecSQL 쿼리 타입의 DBIO 모듈을 삽입할 때 표시된다.

DynamicSQL 쿼리 타입의 DBIO 모듈을 삽입할 때 표시된다.

Fetch Exec 타입의 DBIO 모듈을 삽입할 때 표시된다.
다음은 Lock 쿼리 설정에 따른 다이어그램이다.
다이어그램 속성 및 설명 
Lock 쿼리를 설정할 때 표시된다.
다음은 리소스별 다이어그램이다.
다이어그램 모듈명 
Service 모듈

Business 모듈

Exception 모듈

Batch 모듈

FileIO 모듈
다음은 I/O 매핑에 따른 다이어그램이다.
다이어그램 매핑 방식 설명 
I/O Bypass 매핑
입출력 파라미터로 사용하는 구조체를 참조로 넘겨준다.

Before Code 매핑
입력 매핑에 관련된 작업을 직접 코딩한다.

After Code 매핑
출력 매핑에 관련된 작업을 직접 코딩한다.
-
3.2.1. 일반 모듈
[Palette] 메뉴에는 다음과 같은 일반 모듈이 있다.
| 모듈 | 설명 |
|---|---|
Inner 모듈 |
소스에 static 함수 형태로 호출되며, 함수호출 부분에 예외처리문 삽입, 함수 구현 부분에 지역변수 사용, 조건문 삽입 등의 기능을 통해 Business 모듈 간의 흐름을 통제하거나 보조하는 역할을 한다. |
가상 모듈 |
소스에 {…} 단락으로 나타나며 각 모듈 간에 삽입되어 필요한 소스 코드를 직접 작성한다. 단, 가상 모듈은 하위 모듈을 가질 수 없다. |
루프 모듈 |
소스에 While 문으로 나타나며 하위 모듈의 자식 노드들을 반복적으로 처리할 때 사용한다. |
일반 모듈은 아래와 같은 동일한 절차로 디자인 편집기에 배치할 수 있다.
다음은 Inner 모듈, 가상 모듈, 루프 모듈에 대한 상세 설명이다.
Inner 모듈
EMB Designer에서는 비즈니스 모듈이나 DBIO 모듈 등의 외부 모듈을 호출하는 것 외에도 업무 흐름의 제어를 위해 내부 함수로 생성되는 가상 모듈들이 존재한다. 이러한 가상 모듈 중에 대표적인 모듈이 바로 Inner 모듈이다.
Inner 모듈을 삽입하게 되면 실제 소스에 해당 노드의 위치에 static 함수호출 부분이 나타나고 소스 하단에 함수구현 부분이 생성된다. 이 함수는 외부에서 호출될 수 없고 내부적으로만 사용할 수 있다. 이 함수 호출 부분의 앞에는 조건문을 삽입할 수 있고 뒤에는 예외처리문을 삽입할 수 있다. 또한 함수구현 부분에는 지역변수를 설정하고 이 지역변수를 사용할 수 있게 된다.
다음은 Inner 모듈를 생성하는 절차이다.
-
EMB Designer에서 [Palette] 메뉴의 일반 모듈 중 Inner 모듈를 선택한다. Inner 모듈를 선택한 후 모듈 편집기 화면에 원하는 위치로 이동하면 아래 그림처럼 Inner 모듈이 배치된다.
Inner 모듈 생성 예제 화면위 그림과 같이 Inner 모듈 하단에 원형의 버튼들이 보이는데 클릭하면 버튼의 유형에 따라 원하는 소스 코드 영역으로 이동한다. 원형의 버튼 위에 마우스를 놓으면 툴팁이 표시되며 버튼의 유형을 알 수 있다. Inner 모듈 하단에 나타나는 원형 버튼에 대한 설명은 EMB 버튼을 참고한다.
-
생성된 Inner 모듈의 소스를 보기 위해 모듈 편집기 하단에 있는 [source] 탭을 선택한다. 해당 탭을 선택하면 EMB 모듈 함수 안에 생성된 Inner 모듈를 호출하는 함수가 코딩되어 있는 것을 확인할 수 있다.
① static long InnerModule2(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration { /************************************** * KIND : Intermediary Module Function Call * NODE ID : 9 * NAME : Inner 모듈3 * DESCRIPTION : * *************************************/ ② PFM_TRY(InnerModule3(context)); //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:INNER_MODULE_EXCEPTION NODEID9------------------// //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:INNER_MODULE_EXCEPTION NODEID9------------------// } return RC_NRM; PFM_CATCH: return rc; }다음은 위 소스 중 ①, ②번에 대한 설명이다.
① 생성된 EMB 모듈 함수(CustomerInfoManagement)이다.
② 생성된 EMB 모듈 함수 안에 InnerModule3 함수를 호출한다.
소스 편집기에서는 “//DO_NOT_MODIFY_THIS_LINE…”으로 앞뒤로 둘러싸인 부분과 모듈 설명 주석인 “DESCRIPTION :”의 아래 쪽만 편집이 가능하다.
생성된 EMB 모듈 함수(CustomerInfoManagement) 아래에는 InnerModule3 함수 구현 부분이 나타나 있다. InnerModule3 모듈에 추가되는 하위 노드는 아래 소스와 같이 함수구현 영역에 삽입된다.
/************************************** * KIND : Intermediary Module Function * NODE ID : 9 * NAME : Inner 모듈3 * DESCRIPTION : * *************************************/ static long InnerModule3(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration return RC_NRM; PFM_CATCH: return rc; } -
[Palette] 메뉴에 있는 [특성 뷰 보기]를 클릭한다.
-
EMB Designer에 배치된 Inner 모듈의 속성을 변경할 수 있는 특성 뷰가 나타나고, 여기서 생성된 Inner 모듈의 속성을 변경할 수 있다.
다음은 Inner 모듈의 속성에 대한 설명이다.
분류 및 속성 설명 Condition
Comments
If 조건문에 주석을 삽입한다.
Condition
코드 영역 시작부분에 If 조건문을 삽입하여 흐름을 제어한다.
Exception
Exception
예외처리의 실행 여부를 설정한다.
Exception Code
예외처리 코드를 삽입한다.
Exception Throw
실행 중 예외가 발생한 경우 Exception 처리 여부를 설정한다.
Ignore Exception Flag
예외처리를 무시할지 여부를 설정한다.
Information
Comment
모듈 자체에 대한 주석을 삽입한다.
Funtion Name
소스에 생성되는 함수명을 재설정한다.
Kind
생성된 Inner 모듈의 소스가 Function인지 Block인지를 설정한다.
Name
모듈의 논리명을 설정한다.
Reference Module
이 모듈이 실제로 참조하는 Inner 모듈을 설정한다.
Variable
Declare Code
변수 선언문을 소스에 직접 삽입한다.
Variable
지역변수를 선언할 수 있는 대화상자가 나타난다.
기타
Disabled
모듈을 비활성화할지 여부를 설정한다. 비활성화된 모듈은 소스가 생성되지 않는다.
Group id
현재 사용되지 않는다.
Level
현재 사용되지 않는다.
Node id
EMB 내에서 컴포넌트의 고유 식별번호이다.
Parent node id
EMB 내에서 부모 컴포넌트의 고유 식별번호이다.
Position
현재 사용되지 않는다.
다음은 Inner 모듈의 속성 중 Kind와 Reference Module를 변경하는 방법에 대해 설명한다.
-
Kind
Inner 모듈 – Kind 속성 변경 예특성 뷰에서 'Kind' 속성을 'function’에서 'block’으로 변경하면 Inner 모듈의 노드가 다음과 같이 변경된다. 즉, Inner 모듈의 노드 오른쪽 상단에 표시된 fx가 제거된다.
예를 들면 다음과 같다.
변경 전 변경 후 

'Kind' 속성을 변경하면 소스는 다음과 같이 수정된다.
static long InnerModule2(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration ① { /************************************** * KIND : Intermediary Module Block * NODE ID : 9 * NAME : Inner 모듈3 * DESCRIPTION : * *************************************/ // User Variables Declaration ② } return RC_NRM; PFM_CATCH: return rc; }위 소스 중에 ①, ②번은 특성 뷰의 'Kind' 속성을 'block’으로 변경하면 소스에 'Brace({…})'로 나타난다. Inner 모듈에 대하여 특성 뷰의 'Kind' 속성을 'block’으로 변경하는 이유는 불필요한 함수 생성을 막고 소스의 가독성을 높이기 위한 목적으로 사용하기 위해서다.
-
Reference Module
Inner 모듈 – Reference Module 속성 변경 예특성 뷰의 'Reference Module' 속성을 선택하면 현재 플로우 다이어그램에 존재하는 Inner 모듈 목록이 나타난다. 이들 중 하나를 선택하고 저장하면 선택된 Inner 모듈의 노드 색깔이 회색으로 변한다.
변경 전 변경 후 

'Reference Module' 속성을 변경하면 소스는 다음과 같이 수정된다.
{ /************************************** * KIND : Intermediary Module Function Call * NODE ID : 2 * NAME : Inner 모듈1 * DESCRIPTION : * *************************************/ ① PFM_TRY(InnerModule1(context)); //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:INNER_MODULE_EXCEPTION NODEID2------------------// //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:INNER_MODULE_EXCEPTION NODEID2------------------// } { /************************************** * KIND : Intermediary Module Function Call * NODE ID : 7 * NAME : Inner 모듈1 * DESCRIPTION : * *************************************/ ② PFM_TRY(InnerModule1(context)); //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:INNER_MODULE_EXCEPTION NODEID7------------------// //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:INNER_MODULE_EXCEPTION NODEID7------------------// }위 소스 중에 ①, ②번은 따로 함수를 구현하거나 호출하지 않고 앞서 선택된 Inner 모듈을 호출하고 있는 것을 확인할 수 있다.
플로우 다이어그램 상에서 특정 로직이 반복적으로 나타나면 비즈니스 모듈로 추출한다. 이렇게 호출하는 것이 물론 코드의 효율성 및 재사용성을 증가시키는 방법이나 모듈화하기에는 작은 단위이거나 내용상 부적합하다면 'Reference Module' 속성을 변경하는 방법을 권고한다.
-
가상 모듈
가상 모듈은 소스에 Brace({…})단락으로 나타나며 개발자는 이 단락 안에 직접 코드를 입력할 수 있다. 가상 모듈은 각종 모듈들 사이에 필요할 때마다 삽입될 수 있으며, 소스 코드의 연결을 만들어주는 역할을 수행한다.
다음은 가상 모듈를 생성하는 절차이다.
-
EMB Designer에서 [Palette] 메뉴의 일반 모듈 중 가상 모듈를 선택한다. 가상 모듈를 선택한 후 모듈 편집기 화면에 원하는 위치로 이동하면 아래 그림처럼 가상 모듈이 배치된다.
가상 모듈 생성 예제 화면위 그림과 같이 가상 모듈 하단에 원형의 버튼들이 보이는데 클릭하면 버튼의 유형에 따라 원하는 소스 코드 영역으로 이동한다. 원형의 버튼 위에 마우스를 놓으면 툴팁이 표시되며 버튼의 유형을 알 수 있다. 가상 모듈 하단에 나타나는 원형 버튼에 대한 설명은 EMB 버튼을 참고한다.
-
생성된 가상 모듈의 소스를 보기 위해 모듈 편집기 하단에 있는 [source] 탭을 선택하면 Inner 모듈 함수 안에 가상 모듈 영역이 생성된 것을 확인할 수 있다.
static long innerModule2(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration { /************************************** * KIND : Virtual Module * NODE ID : 7 * NAME : 가상 모듈4 * DESCRIPTION : *************************************/ //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:VIRTUAL_MODULE NODEID7------------------// // TODO Auto-generated method stub //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:VIRTUAL_MODULE NODEID7------------------// } return RC_NRM; PFM_CATCH: return rc; }위 소스 중 ① ~ ② 부분은 생성된 가상 모듈 영역이다.
소스 편집기 화면에서는 “// TODO..” 영역에 직접 코드를 작성하거나 [Palette] 메뉴의 특성 뷰 기능을 이용하여 작성할 수 있다.
-
[Palette] 메뉴에 있는 [특성 뷰 보기]를 클릭한다.
-
EMB Designer에 배치된 가상 모듈의 속성을 변경할 수 있는 특성 뷰가 다음과 같이 나타난다. 여기서 생성된 가상 모듈의 속성을 변경할 수 있다.
분류 및 속성 설명 Code
Code
소스에 삽입할 코드를 작성할 수 있다.
Condition
Comments
If 조건문에 대한 주석을 삽입한다.
Condition
코드 영역 시작부분에 if 조건문을 삽입하여 흐름을 제어한다.
Information
Comment
모듈자체에 대한 주석을 삽입한다.
Name
모듈의 논리명을 설정한다.
기타
Disabled
모듈을 비활성화할지 여부를 설정한다. 비활성화된 모듈은 소스가 생성되지 않는다.
Group id
현재 사용되지 않는다.
Level
현재 사용되지 않는다.
Node id
EMB 내에서 컴포넌트의 고유 식별번호이다.
Parent node id
EMB 내에서 부모 컴포넌트의 고유 식별번호이다.
Position
현재 사용되지 않는다.
가상 모듈은 Inner 모듈과는 다르게 소스 편집기에 코드만 삽입하는 블록이기 때문에 속성이 많지 않다.
다음은 가상 모듈의 속성 중 Code를 변경하는 방법에 대해 설명한다.
가상 모듈 – Code 속성 선택[…] 버튼을 클릭하면 다음과 같은 Code edit 대화상자가 나타난다. 대화상자에 다음과 같은 소스를 입력한다.
가상 모듈 – Code edit – 코드 작성 예Code edit 대화상자에서 작성할 소스 코드를 작성한 후 [확인] 버튼을 클릭한다. 그러면 다음과 같이 2가지 결과가 나타난다.
첫 번째는 특성 뷰의 'Code' 속성이 변경된다.
가상 모듈 – Code 속성 작성 결과 예두 번째는 소스 코드가 다음과 같이 수정된다.
static long innerModule2(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration { /************************************** * KIND : Virtual Module * NODE ID : 7 * NAME : 가상 모듈4 * DESCRIPTION : *************************************/ //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:VIRTUAL_MODULE NODEID7------------------// ① if (!pfmDateIsValidDate(INPUT->StrtDate)) { ApError("시작 일자를 확인해 주세요."); return RC_ERR; ② } //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:VIRTUAL_MODULE NODEID7------------------// } return RC_NRM; PFM_CATCH: return rc; }위 소스 중에 ① ~ ② 부분은 Code edit 대화상자에서 작성했던 소스 코드가 삽입된다.
루프 모듈
루프 모듈은 소스에 While 문으로 나타난다. 개발자는 생성된 루프 모듈의 하위 노드를 반복적으로 처리할 때 사용한다.
다음은 루프 모듈를 생성하는 절차이다.
-
EMB Designer에서 [Palette] 메뉴의 일반 모듈 중 [루프 모듈]를 선택한다. 루프 모듈를 선택한 후 모듈 편집기 화면에 원하는 위치로 이동하면 아래 그림처럼 루프 모듈이 배치된다.
루프 모듈 생성 예제 화면위 그림과 같이 루프 모듈 하단에 원형의 버튼들이 보이는데 클릭하면 버튼의 유형에 따라 원하는 소스 코드 영역으로 이동한다. 원형의 버튼 위에 마우스를 놓으면 툴팁이 표시되며 버튼의 유형을 알 수 있다. 루프 모듈 하단에 나타나는 원형 버튼에 대한 설명은 EMB 버튼을 참고한다.
-
생성된 루프 모듈의 루프 선후처리 소스 코드를 작성하기 위해 루프 모듈를 선택한 후 오른쪽 마우스 버튼을 클릭하면 다음과 같은 메뉴가 나타난다.
루프 모듈 – 루프 선후처리 메뉴 선택 -
루프 선후처리에 대한 소스 코드를 작성할 수 있는 루프 선후처리 대화상자가 나타난다. 본 예제에서는 루프 선처리 영역에 ‘while(test) {’를 입력하고 루프 후처리 영역에는 ‘}’를 입력한다. 여기서 test는 반복 조건이다.
루프 모듈 – 루프 선후처리 대화상자 -
생성된 루프 모듈의 소스를 보기 위해 모듈 편집기 하단에 있는 [source] 탭을 선택한다. 탭을 선택하면 연결된 Inner 모듈 함수 안에 루프 소스 코드가 생성되어 있는 것을 확인할 수 있다.
static long innerModule2(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration { /************************************** * KIND : Loop Module * NODE ID : 8 * NAME : 루프 모듈0 * DESCRIPTION : * *************************************/ //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:LOOP_MODULE_PRE NODEID8------------------// ① while(test){ //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:LOOP_MODULE_PRE NODEID8------------------// //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:LOOP_MODULE_POST NODEID8------------------// ② } //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:LOOP_MODULE_POST NODEID8------------------// } return RC_NRM; PFM_CATCH: return rc; }다음은 위 소스 중 ①, ②번 대한 설명이다.
① 루프 선후처리 대화상자에서 루프 선처리 영역에 작성된 소스 코드'( while(test) { )'가 나타난다.
② 루프 선후처리 대화상자에서 루프 후처리 영역에 작성된 소스 코드'( } )'가 나타난다.
루프 모듈에 하위 노드가 추가되는 경우 위 소스의 while 문 사이에 소스 코드가 삽입된다.
-
[Palette] 메뉴에 있는 [특성 뷰 보기]를 클릭한다.
-
EMB Designer에 배치된 루프 모듈의 속성을 변경할 수 있는 특성 뷰가 다음과 같이 나타난다. 여기서 생성된 루프 모듈의 속성을 변경할 수 있다.
분류 및 속성 설명 Pre/Post Processing
Pre Processing
루프 구문의 선처리 조건을 작성한다.
Post Processing
루프 구문의 후처리 조건을 작성한다 주로 입력하는 소스 코드는 ‘}’이다.
루프 선후처리 대화상자에서 입력한 루프 소스 코드는 루프 모듈 속성에는 다음과 같이 나타난다.
루프 모듈 – Pre/Post Processing 속성 예
3.2.2. 호출 모듈
[Palette] 메뉴에는 Resources(FileIO 루프 모듈, Dbio 호출, BM 호출)이 있다. 호출 모듈에 대한 자세한 내용은 호출 모듈을 참고한다.
Resources는 아래와 같은 동일한 절차로 디자인 편집기에 배치할 수 있다.
다음은 각 호출 모듈에 대한 상세 설명이다.
-
FileIO 루프 모듈
FileIO를 위한 Loop 모듈로써 일반적인 특성은 루프 모듈과 동일하나 특성 뷰에서 정확한 반복 횟수를 지정할 수 있다는 것과 예외처리가 가능하다는 점이 다르다.
-
DBIO 호출
DBIO 모듈을 검색한 후 삽입한다. 단, 운영 영역(RI)의 리소스만 검색 가능하다. 이 모듈들은 Resource Pool에 등록된 모듈을 호출하는 기능으로 호출 모듈에 해당된다.
-
BM 호출
비즈니스 모듈을 검색한 후 삽입한다. 단, 운영 영역(RI)의 리소스만 검색 가능하다. 이 모듈들은 리소스풀에 등록된 모듈을 호출하는 기능으로 호출 모듈에 해당된다.
3.2.3. 배치 모듈
[Palette] 메뉴에는 배치 모듈(배치 호출)이 있다. 호출하는 기능으로 호출 모듈에 해당된다. 호출 모듈에 대한 자세한 내용은 호출 모듈을 참고한다.
3.3. 호출 모듈
본 안내서에서는 EMB Designer에서 제공하는 모듈 외에 외부에서 생성된 모듈을 호출 모듈이라고 정의한다. 호출 모듈은 EMB Designer에서 자동으로 생성할 수 없는 함수를 호출할 때 사용한다.
호출 모듈은 외부에서 생성된 모듈을 호칭하는 용어로 EMB 모듈의 플로우를 작성할 때 사용할 수 있다. 예를 들면 Business Module, DBIO Module, Batch Module 등의 인터페이스 함수를 호출한다.
각 호출 모듈들은 특성 뷰에서 'Module Target' 속성을 가지는데, 해당 속성을 변경하여 단위 테스트시 호출되는 모듈의 Target을 선택적으로 RI 또는 WS 영역의 리소스로 바꿔 호출할 수 있다.
RI 영역을 선택한 리소스는 단위 테스트를 호출하는 경우 RI 리소스를 호출하게 되고 화면에는 모듈명이 표시된다. WS 영역을 선택한 리소스는 단위 테스트를 호출하는 경우 WS 리소스를 호출하게 되고 화면에는 모듈명 앞에 'WS -' 문구가 함께 표시된다.
| 모듈명 | 설명 |
|---|---|
Service Module |
현재 생성된 모듈에서 서비스 모듈을 호출할 때 사용한다. |
Business Module |
현재 생성된 모듈에서 비즈니스 모듈을 호출할 때 사용한다. |
Batch Module |
현재 생성된 모듈에서 배치 모듈을 호출할 때 사용한다. |
Persist DBIO Module |
현재 생성된 모듈에서 Persist 쿼리 타입의 DBIO 모듈을 호출할 때 사용한다. |
DynamicSQL DBIO Module |
현재 생성된 모듈에서 DynamicSQL 쿼리 타입의 DBIO 모듈을 호출할 때 사용한다. |
View DBIO Module |
현재 생성된 모듈에서 View 쿼리 타입의 DBIO 모듈을 호출할 때 사용한다. |
Fetch DBIO Module |
현재 생성된 모듈에서 Fetch Exec Type의 DBIO 모듈을 호출할 때 사용한다. |
ExecSQL DBIO Module |
현재 생성된 모듈에서 ExecSQL 쿼리 타입의 DBIO 모듈을 호출할 때 사용한다. |
|
위의 각 모듈은 하위 모듈을 가질 수 없다. |
다음은 각 모듈의 속성에 대한 설명이다.
-
호출 모듈 공통 속성
분류 및 속성 설명 Condition
Comments
진입조건에 대한 커멘트를 작성한다.
Condition
해당 모듈에 진입하기 위한 조건을 작성한다.
Exception
Exception Code
호출된 모듈을 처리할 때 발생하는 예외를 PFM_CATCH에서 처리하지 않고 모듈 호출 직후에 처리하기 위한 예외처리 코드를 작성한다.
Ignore Exception
호출된 모듈을 처리할 때 발생하는 예외에 대하여 PFM_CATCH 코드를 수행할지 예외를 무시하고 다음 플로우를 처리할지의 여부를 설정한다.
Module Target
Module Target
호출 모듈의 정보를 운영영역 또는 작업영역에서 참조할지를 설정한다.
기타
Disabled
모듈을 비활성화할지 여부를 설정한다. 비활성화된 모듈은 소스가 생성되지 않는다.
Group id
현재 사용되지 않는다.
Level
현재 사용되지 않는다.
Node id
EMB 내에서 컴포넌트의 고유 식별번호이다.
Parent node id
EMB 내에서 부모 컴포넌트의 고유 식별번호이다.
Position
현재 사용되지 않는다.
-
Service Module
분류 및 속성 설명 Call Property
Callee name
연동 서비스 모듈명을 작성한다.
Call kind
서비스 호출 종류를 작성한다.
-
L : dlcall 방식
-
R : tpcall 방식
Shared post-processing
시스템 후처리를 수행할지를 설정한다.
Shared pre-processing
시스템 선처리를 수행할지를 설정한다.
Sync
서비스 모듈의 Sync 방법을 작성한다.
-
dlcall 방식 : 무조건 Sync 방식으로 작동한다.
-
tpcall 방식 : Async 방식으로도 서비스를 호출할 수 있다.
Team Shared post-processing
업무 후처리 모듈을 수행할지를 설정한다.
Team Shared pre-processing
업무 선처리 모듈을 수행할지를 설정한다.
Transaction
호출되는 서비스를 한 개의 트랜잭션으로 처리할 것인지 별도의 트랜잭션으로 처리할 것인지를 설정한다.
Debug
Print Debug
디버깅을 위해 DBIO의 입출력 구조체 값을 출력한다.
I/O
Input structure name
호출 모듈의 입력 구조체명을 나타낸다.
Output structure name
호출 모듈의 출력 구조체명을 나타낸다.
Information
Called function
호출되는 함수명을 나타낸다.
Library path
라이브러리 경로를 나타낸다.
Logical name
논리명을 나타낸다.
Physical name
물리명을 나타낸다.
Resource id
리소스 아이디를 나타낸다.
Resource Path
리소스 경로를 나타낸다.
Tx code
서비스 모듈의 Tx 코드를 나타낸다.
Transformation
In type transform
입력 구조체 매핑방법을 설정한다.
Out type transform
출력 구조체 매핑방법을 설정한다.
-
-
Business Module
분류 및 속성 설명 Debug
Print Debug
디버깅을 위해 DBIO의 입출력 구조체 값을 출력한다.
Exception
Exception Code
호출된 모듈을 처리할 때 발생하는 예외를 PFM_CATCH에서 처리하지 않고 모듈 호출 직후에 처리하기 위한 예외처리 코드를 작성한다.
Exception Type
예외가 발생했을 때 호출될 함수명이다.
Ignore Exception
호출된 모듈을 처리할 때 발생하는 예외에 대하여 PFM_CATCH 코드를 수행할지, 예외를 무시하고 다음 플로우를 처리할지의 여부를 설정한다.
I/O
Input structure name
호출 모듈의 입력 구조체명을 나타낸다.
Output structure name
호출 모듈의 출력 구조체명을 나타낸다.
Information
Library path
라이브러리 경로를 나타낸다.
Logical name
논리명을 나타낸다.
Physical name
물리명을 나타낸다.
Resource id
리소스 아이디를 나타낸다.
Resource Path
리소스 경로를 나타낸다.
Return type
리턴 타입을 나타낸다.
Transformation
In type transform
입력 구조체 매핑방법을 설정한다.
Out type transform
출력 구조체 매핑방법을 설정한다.
-
DBIO Module
분류 및 속성 설명 DBIO call parameter
Array Kind
Array 구조체의 종류를 설정한다.
-
Array of Structure
-
Structure of Array
Count
개발자가 실제 사용하려는 Array 크기를 설정한다.
Dynamic Parameter
Dynamic SQL을 사용할 때 파라미터를 설정하는 부분을 직접 코딩 한다.
Lock Mode
SELECT/FETCH Exec 타입을 조회할 때 Lock의 사용가능 여부를 설정한다.
DBIO In/Out call
Execution Type
INSERT/UPDATE/DELETE/SELECT/FETCH Exec 타입을 설정한다.
Lock Query
Lock 쿼리를 수행할지를 설정한다.
Max Count
사용 가능한 최대 Array 크기를 설정한다.
Wait time
Lock 쿼리를 사용할 때 Wait time을 설정한다.
Debug
Print Debug
디버깅을 위해 DBIO의 입출력 구조체 값을 출력한다.
I/O
Array input structure name
Array 입력 구조체명을 설정한다.
Array output structure name
Array 출력 구조체명을 설정한다.
Dynamic structure name
DynamicSQL 쿼리 타입인 경우 Dynamic 변수 구조체명을 설정한다.
Input structure name
입력 구조체명을 설정한다.
Output structure name
출력 구조체명을 설정한다.
Information
Logical name
논리명을 나타낸다.
Physical name
물리명을 나타낸다.
Resource id
리소스 아이디를 나타낸다.
Resource Path
리소스 경로를 나타낸다.
Transformation
In type transform
입력 구조체 매핑방법을 설정한다.
Out type transform
출력 구조체 매핑방법을 설정한다.
-
-
Batch Module
분류 및 속성 설명 Information
Comments
배치 모듈의 커멘트를 나타낸다.
Name
배치 모듈의 논리명을 나타낸다.
Information(Batch)
Args
배치 모듈을 호출할 때 사용될 인수를 작성한다.
호출 모듈 호출
다음은 호출 모듈를 호출하는 방법이다. 아래의 방법 중 편한 방법을 선택하여 호출한다.
-
내비게이터 영역에서 호출 모듈를 호출한다.
-
리소스풀 뷰에서 호출 모듈를 호출한다. 단, 프로프레임 내비게이터(RI) 영역의 리소스만 검색 가능하다.
-
[Palette] 메뉴에 있는 호출 모듈를 호출한다.
구분 하위 메뉴 호출 모듈
-
DBIO 호출
-
BM 호출
배치
-
배치 호출
-
호출 모듈 매핑
호출 모듈은 여러 모듈에서 재사용할 수 있도록 블랙박스 형태로 설계되어 있다. 따라서 다른 모듈에서 호출 모듈를 호출하기 위해서는 입력되는 파라미터와 처리 후 결과값에 대한 입출력 변환 처리를 해야 한다. 호출된 호출 모듈를 선택한 후 오른쪽 마우스 버튼을 클릭하여 [변환] > [입력 변환] 메뉴를 선택한다.
다음과 같이 매핑을 설정하는 맵 대화상자가 나타난다.
입력 파라미터에 대한 매핑 정의가 완료되면 위 그림에서 [저장] 버튼을 클릭한다. 출력 파라미터에 대한 매핑 정의도 입력 변환과정과 동일하게 수행한다. 이때 구조체의 Target에 따라 운영 이미지 영역의 구조체는 연분홍색 작업영역의 구조체는 연두색 바탕으로 표시된다.
|
입출력 변환에 대한 자세한 내용은 ProFrame ProMapper 개발 안내서를 참고한다. |
3.4. 가상 함수
가상 함수는 함수를 생성해 EMB 모듈의 플로우 다이어그램에 삽입하는 기능이다.
[Palette] 메뉴에 있는 [가상 함수 뷰 보기] 바로가기 버튼을 클릭한다. EMB Designer의 모듈 편집기 화면에서 오른쪽 마우스 버튼을 클릭하면 [가상 함수 목록 보기] 메뉴가 나타난다.
다음은 가상 함수 뷰를 이용하여 함수를 생성하는 절차이다.
-
가상 함수 뷰에서 오른쪽 마우스 버튼을 클릭하면 [가상 함수 생성] 메뉴를 선택하면 가상 함수 설정 대화상자가 나타난다.
가상 함수 설정 대화상자-
논리명, 물리명
생성할 함수의 논리명과 물리명을 입력한다.
-
커멘트
생성할 함수에 대한 커멘트를 입력한다.
-
예외 여부
생성할 함수에 예외처리 여부를 설정한다. 단, 예외 여부를 'Yes’로 설정한 경우 리턴 타입은 long형으로만 설정해야 한다.
-
반환 타입
생성할 함수의 반환 타입을 설정한다.
항목 설명 논리명
리턴 타입의 논리명이다.
물리명
리턴 타입의 물리명이다.
리소스 타입
리턴 타입의 리소스 타입이다. 예를 들어 string, long형 등이 있다.
길이
리턴 타입의 길이이다.
배열 종류
리턴 타입의 배열 종류이다.
-
none
-
fixed
-
variable
배열 크기
리턴 타입의 배열크기이다.
커멘트
리턴 타입에 대한 커멘트이다.
-
-
파라미터 목록
생성할 함수의 파라미터를 정의한다.
항목 설명 변수 이름
생성할 함수의 변수명이다.
논리명
생성할 함수의 논리명이다.
물리명
생성할 함수의 물리명이다.
리소스 타입
생성할 함수의 리소스 타입이다.
길이
생성할 함수의 길이이다.
배열 종류
생성할 함수의 배열 종류이다.
배열 크기
생성할 함수의 배열크기이다.
커멘트
생성할 함수에 대한 커멘트이다.
파라미터 정의는 가상 함수 설정 대화상자에 보이는 Search 영역을 이용한다.
항목 설명 구조체 타입
등록된 구조체의 입력 파라미터를 검색한다.
프리미티브 타입
문자, 숫자 등의 가장 기본적인 단위의 입력 파라미터를 설정한다.
-
-
가상 함수 설정 대화상자에서 함수 생성에 필요한 항목을 모두 설정한 후 [확인] 버튼을 클릭하면 가상 함수 뷰에 생성된 결과가 다음과 같이 나타난다.
가상 함수 뷰 – 함수 생성 결과 -
일반 함수에서 수행할 로직을 작성하기 위해 생성된 함수를 선택하고 오른쪽 마우스를 클릭하면 [코드 편집] 메뉴가 나타난다.
가상 함수 뷰 – 코드 편집 메뉴 -
코드 작성을 위한 코드 편집 대화상자가 나타난다. 본 예제에서는 아래와 같은 코드를 작성한다.
FMW_DBG("***********************") FMW_DVG("**Virtual Function Test**") FMW_DBG("***********************") -
이와 같이 생성된 가상 함수를 EMB 모듈의 플로우 다이어그램에 삽입하기 위해서는 가상 함수 뷰에서 생성된 함수를 선택한 후 마우스로 드래그 앤드 드롭하여 원하는 위치에 삽입한다.
함수 삽입 화면 예삽입된 함수 노드를 마우스로 더블클릭하면 소스 편집기에 다음과 같은 소스 코드가 생성 되어 있는 것을 확인할 수 있다.
/************************************** * KIND : Virtual Function * NODE ID : 1 * NAME : vFunction01 * DESCRIPTION : * 고객정보 플로우 다이어그램에서 사용하는 일반 함수이다. *************************************/ ① static long vFunction01(CustomerInfoManagermentContext *context) { //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:VIRTUAL_FUNCTION NODEID1------------------// ② FMW_DBG("***********************") ③ FMW_DVG("**Virtual Function Test**") ④ FMW_DBG("***********************") } //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:VIRTUAL_FUNCTION NODEID1------------------//다음은 위 소스 중 ①, ②번에 대한 설명이다.
① 생성한 함수(vFunction01)이다.
② ~ ④ 코드 편집 대화상자에서 작성한 소스 코드가 나타난다.
4. 플로우 편집
플로우 편집은 EMB Designer에서 디자인된 서비스 또는 업무 플로우 다이어그램에 비즈니스 로직 등을 추가하여 EMB 모듈을 구체화시키는 작업이다.
본 절에서는 EMB 모듈의 플로우 다이어그램에 비즈니스 로직을 추가하거나 EMB 모듈의 플로우를 편집하는 기능과 방법에 대해 설명한다.
4.1. 진입조건
진입조건은 특정 조건에 따라 실행해야 하는 모듈의 플로우를 제어하는 기능이다. 즉, if 문을 설정하여 특정 조건에 맞는 경우에만 플로우가 실행하도록 제어하는 것이다.
다음은 진입조건 기능을 설정하는 절차이다.
-
진입조건을 설정할 모듈을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [진입조건] 메뉴가 나타난다.
-
다음과 같이 특정 조건을 입력할 수 있는 진입조건 대화상자가 나타난다. 대화상자에서 진입조건 영역에 특정 조건을 직접 입력하거나 아니면 변수 및 연산자를 조합하여 추가한다.
진입조건 대화상자항목 설명 진입조건
특정 조건을 입력하는 편집 영역이다.
변수
진입 조건에 사용할 수 있는 변수 목록이다.
연산자
진입 조건에 사용할 수 있는 연산자이다.
진입조건 영역에 조건문을 입력한 후 [확인] 버튼을 클릭하면 선택한 모듈에 진입조건 설정이 완료된다.
다음은 진입조건 대화상자 화면을 기준으로 진입조건 설정이 완료되면 소스 편집기에서 확인할 수 있는 결과이다.
static long innerModule2(CustomerInfoManagermentContext *context) { long rc = RC_NRM; // User Variables Declaration ① if( //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:LOOP_MODULE_CONDITION NODEID8------------------// context->input->goods > 2 //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:LOOP_MODULE_CONDITION NODEID8------------------// ② ) /************************************** * KIND : Loop Module * NODE ID : 8 * NAME : 루프 모듈0 * DESCRIPTION : * *************************************/ //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:LOOP_MODULE_PRE NODEID8------------------// ③ while(test){ //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:LOOP_MODULE_PRE NODEID8------------------// //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:LOOP_MODULE_POST NODEID8------------------// } //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:LOOP_MODULE_POST NODEID8------------------// } return RC_NRM; PFM_CATCH: return rc; }다음은 위 소스 중 ①, ②번에 대한 설명이다.
① ~ ② 진입조건 대화상자에서 입력한 조건문의 소스 코드가 나타난다.
③ 진입조건을 설정한 루프 모듈의 소스 코드이다.
-
다음은 진입조건을 설정한 후 모듈 편집기에 표시된 결과이다.
진입조건 설정 결과
4.2. XOR 처리/해제
XOR 처리는 선택한 모듈에 진입조건을 설정(if 문)한 후 else if 문으로 처리되어야 하는 여러 모듈들을 선택하여 XOR 처리를 하는 기능이다.
XOR 처리
다음은 XOR 처리 기능을 설정하는 절차이다.
-
XOR 처리를 설정할 모듈들을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [<(XOR 처리)] 메뉴가 나타난다.
-
XOR 처리를 위해 선택한 모듈은 다음과 같이 하나의 노드로 묶여 나타난다. 또한 EMB Designer의 도구 상자에 있는 XOR 처리 아이콘이 활성화된다.
XOR 처리 결과 -
XOR 처리가 설정된 모듈을 마우스로 더블클릭하면 else if 문이 추가된 소스 코드를 확인할 수 있다.
XOR 해제
다음은 XOR 해제 기능을 설정하는 절차이다.
-
else if 문 처리를 해제하기 위해서는 XOR 처리된 모듈들을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [<(XOR 해제)] 메뉴가 나타난다.
-
하나의 노드로 묶여 있던 모듈들은 해제되어 다음과 같이 나타난다. 이때 XOR 해제된 모듈의 소스 코드는 else if 문이 제거된다.
XOR 해제 결과
4.3. 예외처리, 예외처리코드 편집
예외처리는 선택한 모듈 또는 그 모듈에 포함되는 하위 노드에서 발생하는 에러에 대한 예외처리를 하는 기능이다.
예외처리
다음은 예외처리 기능을 설정하는 절차이다.
-
모듈을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [예외처리] 메뉴가 나타난다. Inner 모듈에 예외처리를 설정할 경우에는 하위 노드 중 가장 마지막에 위치한 모듈이 에러에 대한 처리를 담당하게 된다. 따라서 주로 마지막에 가상 모듈을 배치하여 에러처리를 담당하게 한다.
-
예외처리를 한 모듈의 가장 마지막 하위 노드는 빨간색 테두리와 함께 노드 오른쪽 하단에 삼각형 마크가 표시된다. 또한 예외처리를 한 모듈을 선택하면 EMB Designer의 도구 상자에 있는 예외처리 아이콘이 활성화된다.
예외처리 결과 -
소스 편집기 화면으로 이동하여 가장 마지막 하위 노드의 소스 코드를 확인한다.
... return RC_NRM; ① PFM_CATCH: { /************************************** ② * KIND : Intermediary Module Function Call * NODE ID : 9 * NAME : Inner 모듈3 * DESCRIPTION : * *************************************/ PFM_TRYNJ(InnerModule9(context)); //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:INNER_MODULE_EXCEPTION NODEID9------------------// //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:INNER_MODULE_EXCEPTION NODEID9------------------// } ③ return rc; }다음은 위 소스 중 ①, ②, ③번에 대한 설명이다.
①, ③ 예외처리가 설정된 소스 코드이다
② 예외처리를 한 모듈의 가장 마지막 하위 노드이다. 본 예제에서는 가상 모듈이 배치되어 있다.
호출 모듈과 Inner 모듈은 소스 코드에서 내부 또는 외부 함수를 호출할 수 있는데 이때 PFM_TRY로 감싼 코드가 생성되어 있는 것을 확인할 수 있다. ProFrame에서 제공하는 이 함수는 함수 호출 중에 에러가 발생하면 PFM_CATCH 부분으로 이동하고 그 부분의 로직이 에러처리를 담당하게 되어있다.
따라서 본 예제에서는 가장 마지막 하위 노드 즉 가상 모듈이 그 역할을 하고 있다. 만약 에러가 발생해도 PFM_CATCH로 이동하지 않고 그 외 플로우가 순차적으로 실행되길 원한다면 [예외처리코드 편집] 기능을 사용한다.
예외처리코드 편집
다음은 예외처리코드 편집 기능을 설정하는 절차이다.
-
예외처리를 한 모듈을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [예외처리코드 편집] 메뉴가 나타난다.
-
소스 편집기에 예외처리를 한 모듈의 PFM_TRY 소스 코드가 있는 영역으로 이동한다.
{ /************************************** * KIND : Intermediary Module Function Call * NODE ID : 2 * NAME : 고객 정보 조회 * DESCRIPTION : * *************************************/ ① PFM_TRY(innerModule2(context)); //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:INNER_MODULE_EXCEPTION NODEID2------------------// ② //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:INNER_MODULE_EXCEPTION NODEID2------------------// }다음은 위 소스 중 ①, ②번에 대한 설명이다.
① 예외처리를 한 모듈의 PFM_TRY 함수 영역이다.
② 이 영역에 소스 코드를 작성하면 자동으로 PFM_TRY가 PFM_TRYNJ로 변경되는데 PFM_TRYNJ는 호출한 모듈이 에러를 반환하더라도 PFM_CATCH로 이동하지 않고 순차적으로 플로우가 실행되게 한다. 또한 이 영역을 전부 삭제하면 PFM_TRYNJ는 다시 PFM_TRY로 변경된다.
4.4. 정의
EMB Designer에서는 소스 코드에서 사용할 수 있는 각종 변수들을 정의할 수 있다.
다음은 각종 변수를 정의하는 방법이다.
-
EMB Designer의 도구 상자에 있는 각종 정의 버튼을 클릭한다.
-
EMB Designer의 모듈 편집기 화면에서 오른쪽 마우스 버튼을 클릭하면 [정의] 메뉴가 나타난다.
EMB Designer의 모듈 편집기 화면에서 정의 메뉴를 선택하여 각종 변수를 정의한다.
| 변수 정의 | 설명 |
|---|---|
CommBuff 정의 |
서비스 모듈 간의 데이터 전달을 위해 사용하는 CommBuff 구조체를 선택한다. 서비스 모듈, 선처리 모듈, 후처리 모듈에서만 사용할 수 있다. |
상수 정의 |
모듈 내에서 사용되는 상수를 정의한다. |
컨텍스트 정의 |
모듈 내에서 사용되는 컨텍스트의 구조체와 변수를 정의한다. 컨텍스트는 플로우에 사용되는 모든 입출력 구조체를 기본적인 멤버로 가지고 있는 구조체로써 내부 함수을 호출할 때 파라미터로 사용된다. |
구조체 정의 |
모듈 내에서 사용되는 구조체를 정의한다. |
CommBuff 정의
CommBuff는 Shared Memory에 로드하는 변수를 말하며 CommBuff를 사용하므로써 시스템의 성능 향상을 도모할 수 있다. 즉, CommBuff를 사용하면 캐싱된 변수를 사용하기 때문에 그만큼 시스템의 속도가 빨라진다.
메뉴에서 [CommBuff 정의]를 선택하면 다음과 같은 CommBuff 정의 대화상자가 나타난다.
이 대화상자의 Search 영역에는 WebAdmin에서 정의한 CommBuff가 나타난다. 따라서 EMB Designer에서 CommBuff를 보기 위해서는 시스템 관리자가 미리 등록해야 한다.
|
만약 WebAdmin에 CommBuff를 등록하지 않은 상태에서 CommBuff 정의 대화상자를 띄운 경우 “컴버프 리스트를 다운로드 하지 못했습니다.”라는 메시지가 나타난다. 즉, CommBuff 정의를 할 수 없는 상태가 된다. |
Define 영역은 현재 EMB 모듈에서 사용하고 있는 CommBuff 목록을 표시한다. 서비스 모듈 또는 선후처리 모듈에서 CommBuff를 사용하기 위해서는 Search 영역에서 CommBuff를 검색한 후 마우스로 드래그하여 Define 영역에 드롭하면 현재 EMB 모듈에서 정의된 CommBuff 변수를 사용할 수 있다.
상수 정의
메뉴에서 [상수 정의]를 선택하면 다음과 같이 상수 정의 대화상자가 나타난다.
이 대화상자에서는 타입, 값, 커멘트를 설정할 수 있다. 이와 같이 설정된 상수는 헤더 파일에 삽입된다.
상수를 정의하는 방법은 Search 영역의 상수 리스트에서 상수타입을 선택한 후 마우스로 더블클릭하면 Define 영역에 생성된다. 여기서 논리명, 물리명, 값, 커멘트를 수정하여 상수를 정의할 수 있다.
본 예제에서는 string 타입으로 ‘CONSTANT_TEST’ 상수를 “TEST” 값으로 선언한다. 선언 후 헤더 파일 뷰어에서 생성 결과를 확인한다.
// Constants #define CONSTANT_TEST "TEST" /* 상수 정의 */
컨텍스트 정의
컨텍스트는 플로우에 사용되는 모든 입출력 구조체를 기본적인 멤버로 가지고 있는 구조체로써 내부 함수을 호출할 때 파라미터로 사용된다. 여기서 개발자는 필요에 따라 새로운 구조체나 기본 변수들을 추가할 수 있다.
메뉴에서 [컨텍스트 정의]를 선택하면 다음과 같이 컨텍스트 정의 대화상자가 나타난다.
이 대화상자에서는 Search 영역의 [구조체 타입] 또는 [프리미티브 타입] 탭을 이용하여 기존에 생성된 구조체를 Define 영역에 추가한다.
본 예제에서는 structVar1 구조체와 string 타입의 primitiveVar1를 컨텍스트 변수로 선언한다. 선언 후 헤더 파일 뷰어에서 생성 결과를 확인한다.
/ Context Data
typedef struct {
test_clob_qpstest_p_sIn structVar1;
/*test_dept_qpstest_p_s2In(test_dept_qpstest_p_s2In) */
test_dept_qpstest_p_s2In *input;
/*test_dept_qpstest_p_s2Out(test_dept_qpstest_p_s2Out) */
test_dept_qpstest_p_s2Out *output;
char primitiveVar1[0 + 1];
} CustomerInfoManagementContext;
구조체 정의
메뉴에서 [구조체 정의]를 선택하면 다음과 같이 구조체 정의 대화상자가 나타난다.
이 대화상자에서 Search 영역의 구조체 검색 기능을 이용하여 기존에 생성된 구조체를 Define 영역에 추가한다.
본 예제에서는 ‘em’으로 시작하는 emp_qpstest_p_sIn, emp_qpstest_p_sOut 구조체를 검색한 후 구조체 변수로 선언한다. 선언 후 헤더 파일 뷰어에서 생성 결과를 확인한다.
// Includes Structs #include <pfmMapperemp_qpstest_p_sIn.h> // emp_qpstest_p_sIn #include <pfmMapperemp_qpstest_p_sOut.h> // emp_qpstest_p_sOut
4.5. 모듈 정보 재구성
모듈 정보 재구성은 호출될 기존 모듈에 변화가 있는 경우 이 모듈을 호출하는 플로우에서 변경된 사항을 반영하는 기능이다. 만약 이 기능을 사용하지 않으면 컴파일 오류나 예상치 못한 결과가 발생된다. 따라서 기존 모듈에 변동이 있을 경우에는 반드시 [모듈 정보 재구성] 메뉴를 실행하여 변경사항을 반영해야 한다.
이 기능은 주로 모듈의 입출력 구조체에 변경된 사항이 있는 경우 실행하는데, DBIO 모듈인 경우 파라미터가 변경된 사항이 있는 경우에도 모듈 정보 재구성이 필요하다.
예를 들어 호출 모듈의 기존 구조체가 새로운 구조체로 변경될 때 기존 구조체의 소스가 다른 영역에서 사용하고 있다면 소스 삭제 여부를 묻는 대화상자가 나타난다. 이외 모듈 정보 재구성에 문제가 없는 경우 다음과 같은 Information 대화상자가 나타난다.
4.6. 커멘트 편집
커멘트 편집은 각 노드에 대한 부가 설명을 작성하는 기능이다. 예를 들어 Inner 모듈를 선택한 후 [커멘트 편집] 메뉴를 선택한다. 그러면 다음과 같은 커멘트 편집 대화상자가 나타난다.
이 대화상자에서 작성된 커멘트는 소스에서도 확인할 수 있다.
{
/**************************************
* KIND : Intermediary Module Function Call
* NODE ID : 2
* NAME : Inner 모듈1
* DESCRIPTION :
① * 고객정보를 조회하는 모듈이다.
*************************************/
}
① 커멘트 편집 대화상자에서 작성한 내용이다.
5. 컴파일, Dlupdate
EMB 모듈의 플로우 작성이 완료되면 EMB 모듈을 컴파일하고 Dlupdate를 해야 한다. RI/WS를 사용할 해당 리소스가 RI 리소스일 경우 RI 리소스를 컴파일하고 Dlupdate한다. WS 리소스일 경우 WS 리소스를 컴파일하고 Dlupdate한다.
컴파일
다음은 컴파일을 실행하는 방법이다.
-
내비게이터 영역에서 작성이 완료된 EMB 모듈을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [Compile Resource] 메뉴가 나타난다.
-
단축키(<Alt> + C)를 이용한다.
-
스튜디오에 내장된 컴파일 아이콘을 이용한다.
위와 같은 방법으로 컴파일을 실행하면 서버의 파일 시스템에 로드된 EMB 모듈 소스를 서버에 내장된 컴파일러를 통해 컴파일 작업을 수행한다. 컴파일 작업이 진행되는 상태 및 결과는 스튜디오의 콘솔 뷰에서 확인할 수 있다.
Dlupdate
다음은 Dlupdate를 실행하는 방법이다.
-
내비게이터 영역에서 작성이 완료된 EMB 모듈을 선택한 후 오른쪽 마우스 버튼을 클릭하면 [Dlupdate] 메뉴가 나타난다.
-
단축키(<Alt> + D)를 이용한다.
-
스튜디오에 내장된 Dlupdate 아이콘을 이용한다.
위와 같은 방법으로 Dlupdate를 실행하면 컴파일된 EMB 모듈의 소스를 하나의 라이브러리로 묶어 Shared Memory에 로드하는 작업을 수행한다. 이렇게 EMB 모듈에 대한 Dlupdate 작업을 수행함으로써 처리 중인 프로세스가 같은 버전의 라이브러리를 사용할 수 있게 되고 정합성을 유지하는 Hot Deploy가 가능해진다.
6. 단위 테스트
본 절에서는 생성된 EMB 모듈이 정상적으로 동작하는지 검사하기 위해 단위 테스트를 수행하는 방법에 대해 설명한다.
|
단위 테스트를 할 수 있는 모듈은 서비스 모듈과 비즈니스 모듈에 한하여 테스트할 수 있다. 단위 테스트에 대한 자세한 사항은 ProFrame 단위 테스트 안내서를 참고한다. |
단위 테스트를 실행하는 방법은 생성된 EMB 모듈을 선택한 후 내비게이터 영역에서 오른쪽 마우스 버튼을 클릭하면 [단위 테스트] 메뉴가 나타난다. 입력 구조체의 각 필드에 값을 입력한 후 [전송] 버튼을 클릭하면 테스트 결과가 나타난다.