UI 프로그램 및 게이트웨이 서비스

EGL은 한 호출과 다음 호출 간에 값을 유지하는 로직인 Stateful 서비스와 동격인 기술을 제공합니다. 이 기술에는 두 가지 주 컴포넌트가 있으며, 이들은 Java™ EE를 준수하는 애플리케이션 서버에서 실행됩니다. 일반적으로 두 컴포넌트는 모두 같은 웹 프로젝트에 배치됩니다.
두 컴포넌트는 UI 프로그램과 UI 게이트웨이 서비스입니다.
  • UI 프로그램은 비즈니스 로직을 포함하는 EGL 기본 프로그램입니다. 요청자는 프로그램에서 각 요청에 대한 응답으로 제공하는 특정 데이터 세트를 사용하여 이 로직을 정밀 제어할 수 있습니다. 요청자가 일련의 이벤트를 시작함으로써 이 로직에서 상호작용을 더 광범위하게 제어할 수도 있습니다. 예를 들면, 프로그램은 프리젠테이션을 위한 데이터를 제출하고, 양식 입력을 기다린 후 이 입력을 사용하여 다음에 전송할 양식 데이터를 판별할 수 있습니다.
    프로그램은 다음 요청자 제어 로직 개요에 표시되어 있는 바와 같이 UIProgram으로 스테레오타입 지정됩니다.
    program MyUIProgram type UIProgram {inputUIRecord = myInitialContainer}
       
       // the Record parts for the following two declarations are shown 
       // in a later description of the "gateway record" data property
       myInitialContainer  InitialContainer;     
       myRepeatedContainer RepeatedContainer;   
                                                
       endCondition Boolean = false; 
       start, end Int;
       myDataArray MySQLRecord[];
    
       function main()
    
          while (endCondition == false)
    
             // The logic retrieves data (not shown)
             // and determines what portion to send.
             for (i int from start to end)
                myRepeatedContainer.sendList[i] = myDataArray[n];
                n = n + 1;
             end
             // no explicit JSON conversion is required here.
             converse myRepeatedContainer; 
    
             // set endCondition in response to an input value
          end   endend

    이 경우 while 루프는 프로그램이 요청자의 특정 값에 대한 응답으로 종료 조건을 설정하는 경우 종료됩니다. 또 다른 경우 while 루프는 요청자가 ServiceLib.endStatefulServiceSession을 호출하면 종료됩니다. 이 두 번째 옵션은 권장되지 않으며, 게이트웨이 서비스의 요청자가 Rich UI 애플리케이션이거나 EGL Rich UI 프록시가 UI 프로그램과 같은 세션에 있는 경우에는 더욱 사용하지 말아야 합니다. 이러한 경우 ServiceLib.endStatefulServiceSession 함수를 호출하여 UI 프로그램을 종료하면 Rich UI 애플리케이션의 서비스 액세스 기능 또한 종료됩니다.

    다음 내용은 요청자와의 상호작용을 제어하는 두 번째 UI 프로그램의 개요입니다.
    program MyOtherUIProgram type UIProgram {}
       
       const MENU_FORM int = 0; 
       const FORM_ONE  int = 1;
       const FORM_TWO int = 2;
    
       // the Record parts are not shown
       myMenuContainer    MenuContainer;     // holds an integer: a menu choice
       myFormOneContainer FormOneContainer;  // holds data for form 1, with the form ID
       myFormTwoContainer FormTwoContainer;  // holds data for form 2, with the form ID
                                                
       endCondition Boolean = false; 
       formNumber Int = MENU_FORM;
       
       function main()
       
          while (endCondition == false)
             case (formNumber) 
                when (MENU_FORM)
                   converse myMENUContainer; 
                   // process in some way and set formNumber
    
                when (FORM_ONE)
                   converse myFormOneContainer;
                   // process in some way and set formNumber
    
                when (FORM_TWO)
                   converse myFormTwoContainer;
                   // process in some way
                   endCondition = true;
    
                otherwise
                   // throw an exception
             end      end   endend
  • UI 게이트웨이 서비스는 UI 프로그램을 호출하고 요청자와 프로그램 간에 데이터를 전송하는 서비스입니다. invokeProgram이라는 하나의 시작점이 있으며 사전 정의되어 있는 이 서비스의 로직은 사용자가 작성하지 않습니다.
    UI 게이트웨이 서비스는 EGL REST-RPC 서비스로서 배치하거나, Stateless SOAP 서비스로서 배치하거나, 동시에 두 서비스로서 배치할 수 있습니다.
    • EGL REST-RPC 서비스는 요청자와 UI 프로그램 간의 상호작용을 모니터하기 위해 애플리케이션 서버 세션에서 유지될 수 있습니다. UI 프로그램에 EGL converse 문을 코드하려는 경우에는 이 기능이 필요합니다.
    • 사용자 회사의 프로세스에 SOAP 서비스가 더 적합할 수도 있습니다. 사용자는 EGL로 생성된 WSDL 파일을 사용 가능한 상태로 만들어 서비스에 대한 세부사항을 분배합니다.

    UI 게이트웨이 서비스를 웹 서비스로 배치하기 위해 EGL 배치 디스크립터 편집기를 사용할 때는 서비스를 코드한 것처럼 배치 디스크립터 항목을 사용할 수 있게 됩니다. Stateful EGL REST-RPC 서비스를 배치하기 위해, 해당 편집기의 서비스 배치 태그에 서비스가 Stateful임을 지정할 수 있습니다.

요청자는 UI 프로그램을 시작하고 UI 프로그램이 다음 두 유형의 명령문 중 하나를 호출하면 데이터를 수신합니다.
  • 프로그램이 동일한 요청자의 후속 입력을 기다리도록 하는 converse
  • 프로그램을 종료하는 show 문. show 문은 지연된 전송을 발생시킬 수 있으며, 이 경우에는 요청자의 UI 게이트웨이 서비스에 대한 후속 요청이 두 번째 UI 프로그램을 시작합니다.
UI 프로그램은 다음 유형의 명령문을 호출하여 제어를 전송할 수도 있습니다.
  • 제어를 호출 대상 프로그램으로 동기 전송하는 call
  • 또 다른 기본 프로그램을 시작하고 전송 프로그램의 처리를 종료하는 transfer

전체 UI 프로그램 예제는 "UI 프로그램 및 데이터 그리드를 사용한 엔드-투-엔드 처리"에 있습니다.

게이트웨이 레코드

다음 절에 설명되어 있는 바와 같이, 요청자는 JSON 형식으로 비즈니스 데이터를 전달하고 수신하며, JSON 문자열은 유형이 UIGatewayRecord인 레코드의 필드에 임베드됩니다. 일반적으로 요청자를 코드할 때는 이 유형의 레코드를 처리하지만 UI 프로그램을 코드할 때는 처리하지 않습니다.

유형 UIGateRecord는 시스템 레코드 파트이며 다음과 같이 구조화되어 있습니다.
Record UIGatewayRecord
   uiProgramName STRING;
   data STRING;
   dataEncoding EncodingKind;
   terminated Boolean;
end
각 필드의 의미는 다음과 같습니다.
uiProgramName
호출할 UI 프로그램의 완전한 이름을 나타내는 문자열입니다. 예를 들어, myPkg 패키지에 있는 UI 프로그램의 이름이 Translate이며 게이트웨이 레코드의 이름이 gateRec인 경우에는 다음 지정이 유효합니다.
gateRec.uiProgramName = "myPkg.Translate";

서비스가 요청자에게 응답할 때, 서비스는 이 필드 값이 다음에 호출할 EGL 파트(있는 경우)를 나타내는지 확인합니다. 여기서도 일반적으로는 UI 프로그램에 있는 게이트웨이 레코드를 명시적으로 업데이트하지 않습니다.

data
JSON 형식의 비즈니스 데이터를 포함하고 있는 문자열입니다. 요청자는 JSON 문자열을 저장하거나 검색하기 위해 ServiceLib 변환 함수를 적절히 사용합니다.
JSON으로 변환되거나 JSON으로부터 변환되는 비즈니스 데이터는 일반적으로 특정 컨텐츠를 포함하는 컨테이너입니다. 예를 들어, 다음 레코드 파트에는 정수가 포함되어 있습니다.
Record InitialContainer
  initialValue INT;
end
다음 레코드 파트에는 두 개의 정수와 SQL 레코드의 배열이 포함되어 있습니다.
Record RepeatedContainer  
  numberOfRecords INT;
  pageNumber INT = 1;
  sendList theSQLRecord[]{};
end
dataEncoding
요청자와 UI 프로그램 간에 전송되는 비즈니스 데이터의 형식을 지정하는 값입니다. 이 값은 몇몇 자동 데이터 변환을 발생시킵니다. 데이터는 JSON 형식으로 전송되며 dataEncoding 필드의 유일한 유효 값은 EncodingKind.JSON입니다.
terminated
프로그램의 종료 여부를 표시하는 부울 값입니다. terminated 필드에는 값을 지정하지 마십시오. 이 필드는 UI 프로그램에서 자동으로 설정합니다. 요청자는 후속 처리를 안내하기 위해 이 필드를 읽을 수 있습니다.

요청자의 동작

요청자는 다음과 같이 행동합니다.
  1. 유형이 UIGatewayService인 서비스 액세스 변수를 동작합니다.
    gatewayServiceVar UIGatewayService{@BindService{bindingKey="UIGatewayService"}};
    EGL 배치 디스크립터의 INUIGatewayService 바인딩에는 이와 유사한 기본 URL 항목이 있습니다.
    http://localhost:8080/MyWebProject/restservices/uiGatewayService
  2. 유형이 UIGatewayRecord인 레코드인 UI 게이트웨이 레코드를 선언합니다.
    gateRec UIGatewayRecord;
  3. ServiceLib.convertToJSON 함수를 사용하여 비즈니스 데이터를 UI 게이트웨이 레코드의 data 필드에 배치되는 JSON 문자열로 변환합니다. 예를 들어, sendToProgram이 UI 프로그램에 전송되는 EGL 레코드인 경우에는 다음 명령문을 코드하십시오.
    gatewayRec.data = ServiceLib.convertToJSON( sendToProgram );

    이 문자열은 UI 프로그램을 위한 컨텐츠를 반영하고 있습니다.

  4. UI 게이트웨이 레코드를 전달하는 서비스 액세스 명령문을 포함시킵니다. 이 호출은 Rich UI에서 발생하는 경우 비동기 호출이며 Rich UI 외부에서 발생하는 경우에는 동기 호출입니다. Rich UI의 서비스 액세스 명령문은 다음과 같습니다.
    call gatewayServiceVar.invokeProgram(gateRec) 
       returning to callbackFunc onException handleException;
    UI 게이트웨이 서비스의 invokeProgram 함수 시그니처는 다음과 같습니다.
    function invokeProgram(gatewayRecord UIGatewayRecord INOUT);
  5. 유형이 UIGatewayRecord인 레코드를 사용하여 UI 게이트웨이 서비스로부터 리턴되는 데이터를 수신합니다. Rich UI 핸들러의 콜백 함수 시그니처는 다음과 같습니다.
    function callbackFunc(gatewayRecord UIGatewayRecord in)

    UI 프로그램 converse 문에 응답하는 요청자의 경우, 수신되는 게이트웨이 레코드에 있는 data 필드 컨텐츠의 구조는 UI 프로그램으로 다시 전송되는 data 필드 컨텐츠의 구조와 같아야 합니다. 데이터의 컨텐츠만 달라질 수 있습니다.

    UI 프로그램에 전송되는 데이터에는 호출할 EGL 파트의 완전한 이름이 포함되어 있습니다. 즉, 이 데이터에는 패키지 이름과 파트 이름이 포함됩니다. 이 파트에 별명이 있는 경우에는 이 별명이 파트 이름 대신 사용됩니다. 이 파트는 다른 UI 프로그램 또는 EGL 라이브러리가 될 수 있습니다.

  6. ServiceLib.convertFromJSON 함수를 사용하여 UI 프로그램으로부터 수신한 데이터를 변환하고 변환된 데이터를 EGL 변수에 배치합니다. 예를 들어, dataRecord가 UI 프로그램으로부터 예상되는 데이터의 구조와 일치하는 구조를 가진 EGL 레코드인 경우에는 Rich UI 콜백 함수에 다음 명령문이 있을 수 있습니다.
    ServiceLib.convertFromJSON( gatewayRecord.data, dataRecord);
  7. UI 게이트웨이 서비스가 Stateful EGL REST-RPC 서비스인 경우 요청자는 ServiceLib.endStatefulServiceSession을 호출하여 프로그램을 종료할 수 있습니다. 이 경우 요청자가 Rich UI 애플리케이션이면 사용자는 애플리케이션이 UI 프로그램을 다시 시작할 수 있도록 브라우저에 다시 애플리케이션을 다운로드해야 합니다.
    세션을 종료하면 오류 메시지가 발생할 수 있다는 점을 참고하십시오. 이 메시지는 UI 프로그램을 실행하는 애플리케이션 서버에서 표시합니다. 예제는 다음과 같습니다.
    EGL2156E The session associated with program MyUIProgram was invalidated.

요청자는 JSON 변환 함수를 사용하지만 UI 프로그램은 일반적으로 이를 사용하지 않습니다.

UI 프로그램의 동작

UI 프로그램은 다음과 같이 동작합니다.
  • 다음 두 가지 방법 중 하나로 데이터를 수신할 수 있습니다.
    • 호출이 요청자로부터 직접 이뤄진 경우 요청자의 데이터는 inputUIRecord 특성으로 식별되는 레코드에 배치됩니다. 이 레코드는 구조화되지 않은 기본 레코드여야 합니다. 이 레코드는 게이트웨이 레코드가 아닙니다.

      레코드에 데이터를 수신하는 과정에는 JSON 변환 함수가 관련되지 않습니다. 이 변환은 자동으로 처리됩니다.

    • 이 호출이 다른 프로그램으로부터의 전송인 경우 전송 프로그램의 데이터는 inputRecord 특성으로 식별되는 레코드에 배치됩니다. 이 레코드는 구조화되거나 구조화되지 않은 기본 레코드가 될 수 있습니다. 이 레코드는 게이트웨이 레코드가 아닙니다.
  • 다음 방법 중 하나를 사용하여 요청자에게 데이터를 리턴할 수 있습니다.
    • show 문을 호출합니다. show 문에 있는 I/O 오브젝트는 구조화되지 않은 기본 또는 SQL 레코드가 될 수 있습니다. 이 명령문은 라이브러리 함수가 될 수 있습니다.

      show 문은 라이브러리가 UI 프로그램으로부터 호출된 경우에만 라이브러리에서 유효합니다.

    • 제어를 직접 반환합니다. 즉, show 문을 실행하지 않고 다른 프로그램으로 제어를 전송하지 않은 상태로 종료합니다.
    • converse 문을 호출합니다. 이는 UI 게이트웨이 서비스가 EGL REST-RPC 서비스로 배치된 경우에만 사용합니다. converse 문에 있는 I/O 오브젝트는 구조화되지 않은 기본 또는 SQL 레코드가 될 수 있습니다. 이 명령문은 라이브러리 함수 내에 있을 수 있으나 converse 문은 라이브러리가 UI 프로그램으로부터 호출된 경우에만 라이브러리에서 유효합니다.

      특정 converse 문에서 전송하는 데이터는 해당 명령문에서 수신하는 데이터와 동일하게 구조화되어야 합니다.

    UI 프로그램에서 요청자에게 제어를 반환하면 요청자는 UI 게이트웨이 레코드를 수신하며 다음 내용이 적용됩니다.
    • UI 프로그램이 show 또는 converse 문을 호출한 후에는 UI 게이트웨이 레코드의 data 필드에 비즈니스 데이터의 JSON 동격에 해당하는 데이터가 저장됩니다.
    • 다음 경우에는 UI 게이트웨이 레코드의 programName 필드가 빈 문자열로 설정됩니다.
      • UI 프로그램이 제어를 직접 반환하여 종료되었습니다.
      • UI 프로그램이 지연된 전송을 포함하지 않는 show 문으로 종료되었습니다.
    • 다음 경우에는 UI 게이트웨이 레코드의 terminated 필드가 true로 설정됩니다.
      • UI 프로그램이 제어를 직접 반환하여 종료되었습니다.
      • UI 프로그램이 show 문으로 종료되었습니다.

    showconverse 문은 JSON 변환 함수를 사용하지 않습니다. 요청자가 프로그램을 다시 호출하여 converse 문 뒤에 있는 명령문을 처리하도록 하는 경우 converse 문 뒤에 발생하는 변환을 포함, 필요한 변환은 자동으로 처리됩니다.

UI 프로그램 특성은 다음과 같습니다.
alias
프로그램을 식별하는 선택적 문자열입니다. 이 문자열이 지정되는 경우 요청자는 이를 프로그램 이름 대신 사용해야 합니다.
inputRecord
앞서 언급된 바와 같이, 전송 프로그램으로부터 데이터를 수신하는 레코드입니다.
inputUIRecord
앞서 언급된 바와 같이, UI 게이트웨이 서비스로부터 데이터를 수신하는 레코드입니다.
segmented
UI 프로그램이 세그먼트된 모드에서 실행되는지 표시하는 부울 값입니다.
true(기본값)
프로그램이 converse 문 이후 종료되며 사용자 응답 후 적절한 시점에서 다시 로드됩니다.

기본값을 수락하여 얻을 수 있는 이점은 사용자 대기 시간 중에 애플리케이션 서버 자원을 해제한다는 것입니다. 그러나 EGL 런타임 코드가 파일 및 데이터베이스 연결을 닫고, 라이브러리를 해제하며 converse 문 전체에서 저장되지 않는 EGL 시스템 변수의 값을 재설정하므로 프로그램 종료로 인해 추가 코딩이 필요할 수 있습니다.

false
프로그램이 요청자의 응답을 기다리는 동안 메모리에 남아 있습니다.

추가 세부사항은 "텍스트 UI 프로그램 및 UI 프로그램에서의 세그먼테이션"을 참조하십시오.

UI 프로그램을 생성할 때는 j2ee 빌드 디스크립터 옵션이 YES로 설정되었는지 확인하십시오.

UI 프로그램을 디버그할 때는 다음 세부사항을 참고하십시오.
  • UI 게이트웨이 서비스의 소스는 사용할 수 없으며 이 서비스는 디버그할 수 없습니다.
  • UI 프로그램이 이미 서버에서 실행 중인 경우에만 이 프로그램을 디버그할 수 있습니다.

예외

UI 게이트웨이 서비스 또는 UI 프로그램이 종료되도록 하는 예외는 Rich UI 애플리케이션에 ServiceInvocationException으로서 리턴됩니다. 예외 처리를 다시 수행하여 관련 메시지를 업데이트할 수 있으나, 요청자에게 리턴되는 세부사항은 ServiceInvocationException에서 제공하는 내용뿐입니다. 예를 들어, 다음 코드에 있는 굵은체 항목의 유일한 영향은 애플리케이션 서버에서 UI 프로그램이 표시하는 메시지를 변경하는 것뿐입니다.
Record MyException type Exception end

Program MyUIProgram type UIProgram {}
   function main()
      try
         // get an array of data from a relational database
         get mySQLRecord; 
            onException(except AnyException)
               throw new MyException{message = 
                         "Error at get mySQLRecord:  " + except.message};               
      end   endend

UI 프로그램이 요청자와의 상호작용 중에 제한시간을 초과하는 경우 예외는 요청자가 프로그램을 다음에 호출할 때 리턴됩니다.