Rich UI 유효성 검증 및 형식화

이 주제에서는 로직을 조직하는 MVC(Model, View, and Controller) 방식에 대해 간략하게 설명하고 Rich UI에서 유효성 검증 및 형식화를 지원하는 MVC를 사용하는 방법에 대해 탐색합니다.

MVC

현대적인 데이터 처리 시스템에서는 보기모델과 분리하며, 이러한 용어는 여러 가지로 정의됩니다.
  • 보기는 사용자 인터페이스, 사용자 인터페이스를 지원하는 로직, 또는 사용자 인터페이스의 비즈니스 데이터입니다.
  • 모델은 데이터베이스(또는 다른 데이터 스토리지), 데이터베이스에 액세스하는 로직, 또는 데이터베이스로 보내거나 데이터베이스에서 검색하는 데이터입니다.

제어기는 사용자 인터페이스와 데이터베이스 액세스 로직 사이에서 데이터 전송을 감독하는 로직입니다.

많은 경우에 약어 MVC는 여러 플랫폼에서의 처리를 참조합니다. 예를 들어 Windows 플랫폼의 Rich UI 애플리케이션은 보기(및 제어기 포함)라고 할 수 있으며, 반변 데이터베이스에 액세스하는 서비스는 모델이라고 할 수 있습니다.

또한 Rich UI 애플리케이션의 모델에서 보기 디비전을 고려해 볼 수 있습니다. 이 경우 용어에는 다음과 같은 의미가 있습니다.
  • 보기는 사용자 인터페이스의 위젯입니다. 해당 위젯에 놓이는 데이터는 다른 처리에서 사용되기 전에 유효성 검증되어야 합니다. 위젯이 표시하려는 애플리케이션 데이터는 표시되기 전에 형식화되어야 합니다.
  • 모델은 애플리케이션 내부에 사용되는 데이터 필드입니다.

EGL 정의인 제어기를 사용하면 특정 보기(특정 위젯)를 특정 모델과 묶을 수 있습니다. 또한 제어기는 유효성 검증과 형식 규칙(나중에 설명됨)을 감독합니다.

또한 표시 필드 세트 및 관련 제어기를 식별하는 양식을 정의할 수도 있습니다. 이러한 양식으로 유효성 검증 및 형식화 결과인 오류 메시지를 표시할 수 있습니다.

다음 절에서는 제어기와 제어기에 대한 작업 방법을 설명합니다. 양식 작성에 대한 세부사항은“여기에 설명된 메커니즘을 사용하는 Rich UI에서 양식 처리”를 참조하십시오.

Rich UI의 제어기

다음 선언을 고려하십시오.
nameField TextField;
name String {inputRequired=yes, 
             validationPropertiesLibrary=myLibrary,
             inputRequiredMsgKey="requiredMessage"};
name 선언에는 다음 특성이 있습니다.
  • inputRequired는 사용자가 데이터 필드와 연관된 위젯(보기)에 입력을 제공하도록 합니다.
  • validationPropertiesLibrary는 메시지와 다른 텍스트에 사용할 선언이 포함된 라이브러리(스테레오타입 RUIPropertiesLibrary)를 식별합니다. 이 특성을 포함하지 않는 경우 EGL 런타임은 기본 메시지에 액세스합니다. Rich UI의 유효성 검증 사용자 정의 메시지에 대한 세부사항은 “표시 가능한 텍스트에 특성 파일 사용”을 참조하십시오.
  • inputRequiredMsgKey는 사용자 정의된 유효성 검증 메시지를 식별합니다.
다음은 Rich UI 제어기의 선언 예입니다.
nameController Controller
   { @MVC 
      { model=name, view=nameField },
      validators = [myValidationFunction01, myValidationFunction02]
   };

선언은 특정한 모델(name 필드)을 특정한 보기(nameField 위젯)에 묶습니다. 일반적으로 특수한 유형의 위젯만이 보기를 제어할 수 있습니다(“제어기 보기로 사용할 수 있는 위젯”에 설명됨).

다음과 같이 모델과 보기 사이의 전송을 제어합니다.
  • 보기에서 모델로 데이터를 전송하려면 데이터를 유효성 검증하고 유효성 검증된 데이터를 커미트합니다. 대부분의 경우 커미트 단계에서는 통화 기호와 같은 형식화 문자를 제거합니다.
  • 모델에서 보기로 데이터를 전송하기 위해 데이터를 공개합니다. 대부분의 경우 공개 단계에서는 표시할 데이터를 형식화합니다.
이 예에서 제어기 선언은 유효성 검증기를 나열하며, 이는 한 함수에서 다음 함수 순서대로 입력을 작성하고 유효성 검증하는 함수입니다. 각 유효성 검증기는 다음 위임을 기반으로 합니다.
Delegate 
	  MVCValidatorFunction(input String in) returns(String?)
end

함수에서 비어 있는 문자열 또는 널을 리턴하지만 유효성 검증기에서 컨텐츠가 있는 문자열을 리턴하는 경우 유효성 검증기에 대한 입력은 유효하다고 인식됩니다. 이러한 문자열은 오류 메시지라고 합니다. 함수에서 오류 메시지를 리턴하면 후속 함수가 실행되지 않습니다.

대부분의 경우 데이터를 유효성 검증한 후에만 보기에서 모델로 데이터를 커미트합니다. 다음은 nameField 위젯에서 name 필드로 사용자 입력을 커미트하는 구문입니다.
if (nameController.isValid())
   nameController.commit(); 
end

사용자 입력 유효성 검증

제어기 레벨 유효성 검증은 두 개의 제어기 특정 함수의 호출로부터 수행되는 값 검사입니다.
  • 사용자가 위젯에서 포커스를 멀리 이동시킬 때마다 isValid 함수가 호출됩니다. 또한 사용자 코드는 실패한 유효성 검증으로부터의 오류 메시지를 표시하는 함수를 호출할 수 있습니다.

    오류 메시지는 사용자가 포커스를 다시 위젯으로 가져오지 않고 유효성 검증이 성공한 경우에만 제거됩니다.

  • isValid 함수가 validate 함수를 호출하고 처음 발견도었지만 표시되지 않은 오류 메시지를 저장합니다. 제어기 특정 getErrorMessage 함수를 호출하여 저장된 오류 메시지에 액세스할 수 있습니다. 이 함수에는 매개변수가 없으며 STRING? 유형의 값을 리턴합니다.

    사용자 코드는 향상된 제어 기능을 위해 isValid 함수 대신 validate 함수를 호출할 수 있습니다. 예를 들어 사용자 코드는 validate 함수를 호출하여 도움말 페이지를 표시할지 또는 오류 발견 시 다른 조치를 수행할지 여부를 테스트하고, 함수에서 리턴된 오류 메시지를 표시하지 않도록 할 수 있습니다.

  • 유효한 상태 변경 리스너를 알리지 않고 유효한 제어기 상태를 조사하기 위해 isControllerValid 함수를 호출할 수 있습니다.

관련 제어기 특정 함수는 isValidStateInitialized이며, 이는 제어기 특정 유효성 검증 함수(whether isValid or validate)가 현재 Rich UI 애플리케이션 실행에서 적어도 한 번 이상 실행되었는지를 지정합니다. isValidStateInitialized 함수에는 매개변수가 없으며 부울을 리턴합니다.

부수적으로 몇 가지 유형의 EGL Dojo 위젯은 보기 레벨 유효성 검증을 지원하며, 이는 사용자 키 입력마다 발생되는 값 검사입니다. 보기 레벨 유효성 검증은 다음 유형의 위젯에서 사용 가능합니다.
  • DojoCurrencyTextBox
  • DojoDateTextBox
  • DojoTextField
  • DojoTimeTextBox
이러한 유형의 위젯에는 다음 규칙이 적용됩니다.
  • 실패한 보기 레벨 유효성 검증으로 인한 오류 메시지는 항상 위젯 근처의 도구 팁에 표시됩니다. 위젯이 포커스를 유실한 경우 도구 팁이 숨겨지고, 위젯이 포커스를 획득한 경우 도구 팁이 표시됩니다.

    이전에 설명된 동작은 Dojo의 특성입니다.

  • 사용자가 위젯에서 포커스를 멀리 이동시키면 제어기 레벨 유효성 검증이 발생하지만 이는 보기 특정 유효성 검증이 성공한 경우에만 해당됩니다.
코드 또는 isValid 함수에 의해 호출된 경우와 같이 validate 함수는 다음과 같습니다.
  1. retrieveViewHelper 특성이 참조하는 함수를 실행합니다(이 예에서는 표시되지 않음). 이 특성은 위젯 컨텐츠를 검색하는 함수를 식별합니다. 이 함수에는 매개변수가 없으며 문자열을 리턴합니다. 이 함수를 사용하여 어떤 방식으로 입력을 변환할 수 있습니다. 그러나 대부분의 경우 retrieveViewHelper 특성을 설정할 필요가 없습니다. 해당 특성이 없는 경우 이후의 처리를 위해 위젯 컨텐츠를 문자열로 사용할 수 있습니다.
  2. unformatters 특성이 참조하는 함수를 실행합니다(이 예에서는 표시되지 않음). 이 특성은 함수 배열을 식별합니다. 각 함수에는 문자열 매개변수(STRING in)가 있으며 문자열을 리턴합니다. 이러한 함수를 사용하여 입력에서 형식화 문자를 제거할 수 있습니다. 첫 번째 나열된 함수는 retrieveViewHelper 함수에서 리턴된 문자열을 허용하고 이후에 나열된 각 함수는 이전 함수에서 리턴된 문자열을 허용합니다. unformatters 특성을 설정할 필요가 없을 수 있습니다.
  3. 소스 코드에 지정된 형식화 특성(있는 경우)에 따라 사용자 입력에서 형식화 문자를 제거합니다. 형식화 문자의 예는 통화 기호입니다. 이는 currency 특성과 연관됩니다. 두 번째 예는 dateFormat 특성에서 지정된 구분 기호입니다.
  4. 데이터 유형과 관련된 유효성 검증 오류가 발생하는 경우 사용자에게 제어가 리턴됩니다. 예를 들어 모델이 숫자 필드인 경우 사용자가 문자를 입력했을 수 있습니다.
  5. 보기가 아닌 모델에 설정된 EGL 특성에서 지정한 대로 기본 유효성 검증을 실행합니다.

    이후의 절에서는 사용 가능한 특성을 나열합니다. 여기에는 이 예에서 표시된 inputRequired 특성이 포함됩니다. (해당 특성을 사용하면 사용자가 해당 데이터 필드와 연관된 위젯에 입력을 제공합니다.)

    다음은 기본 유효성 검증에 가능한 결과입니다.
    • 기본 유효성 검증이 실패하면 사용자에게 제어가 리턴됩니다. 제어기가 양식에 있는 경우 첫 번째 실패한 유효성 검증과 연관된 메시지가 저장됩니다.

      주어진 유효성 검증에 대해 기본 EGL 메시지를 허용할 수 있습니다. 그러나 사용자 소유의 메시지를 지정할 경우 “표시 가능한 텍스트에 특성 파일 사용”의 설명을 검토하십시오.

    • 모든 기본 유효성 검증이 이행되면 유효성 검증기가 실행됩니다(다음에 설명).
  6. 제어기 validators 배열에 지정된 순서 대로 유효성 검증기를 실행합니다. 각 유효성 검증기는 통화 기호와 같은 형식화 문자가 없는 입력 문자열(STRING in)을 허용하며, 각 유효성 검증기는 문자열이나 널을 리턴합니다. (리턴 값은 STRING? 유형입니다.)
    유효성 검증기가 널이나 공백을 리턴하는 경우 EGL 런타임에서는 유효성 검증이 성공했다고 인식합니다. 그러나 유효성 검증이 다른 값(예: “표시 가능한 텍스트에 특성 파일 사용”에 설명된 특성 파일에서 검색된 값)을 리턴하는 경우 다음 명령문이 적용됩니다.
    • EGL 런타임은 유효성 검증이 실패했다고 인식합니다.
    • 제어가 즉시 사용자에게 리턴됩니다. 이 경우 후속 유효성 검증이 실행되지 않습니다.
    • 리턴된 문자열이 오류 메시지로 저장됩니다. 보기 레벨 유효성 검증을 지원하는 EGL Dojo 위젯에 특정한 세부사항은 EGL Dojo 위젯에 제어기 레벨 오류 메시지 표시의 내용을 참조하십시오.
    여러 제어기에서 액세스하는 유효성 검증기를 작성할 수 있습니다. 이제 제어기를 식별할 수 있으므로 다음과 같이 재사용할 수 있습니다.
    function commonValidator(input string in) returns(string?)
       currController Controller = MVCLib.getCurrentContext();
       viewId string = currController.view.id;
    end 		

마지막으로 publishMessageHelper 특성은 단일 매개변수가 있는 함수를 사용하며, 이 함수는 IN에 의해 수정되며 리턴값이 없습니다. 이 함수는 위젯이 포커스를 획득할 때 호출되며, 해당 함수에 대한 입력은 위젯에서 포커스가 유실될 때 저장된 마지막 메시지입니다.

올바르지 않은 입력 표시 변경 및 오류 메시지 핸들링

기본적으로 올바르지 않은 컨텐츠가 있는 위젯은 캐스케이딩 스타일시트(CSS) 클래스에 지정된 스타일로 표시됩니다. 특히 초기 클래스(예: EglRuiTextField)가 다음 보조 클래스 FormErrorEditor와 함께 사용됩니다. 일반적으로 사용자 조직의 웹 디자이너가 최적의 효과를 위해 스타일시트를 설정합니다.

유효성 검증 실패에 대한 응답에서 다른 CSS 클래스 세트(또는 다른 CSS ID)를 지정할 수 있습니다. 또는 표시되는 출력의 다른 측면을 변경할 수 있습니다. 예를 들어 유효성 검증 양식을 사용하는 경우 발생되는 레이블(기본값)과 같은 레이블에 CSS 클래스를 지정할 수 있습니다. (세부사항은 “Rich UI를 사용하여 양식 처리” 참조)

다음은 제어기 레벨 유효성 검증 이후 표시되는 출력을 변경하는 프로시저입니다.
  • 유효성 검증이 종료될 때 호출할 EGL 런타임의 함수를 식별하는 제어기 특성 validStateSetter를 설정하십시오.
  • 두 개의 매개변수가 있고 리턴값이 없는 함수를 작성하십시오. 첫 번째 매개변수는 유효성 검증 중인 데이터를 보유한 위젯을 받습니다. 두 번째 매개변수는 유효성 검증이 성공되었는지 여부를 나타냅니다. 다음은 각 함수가 따라야 하는 위임 파트입니다.
    Delegate MVCValidStateSetter(widget Widget in, valid boolean in) end
  • 해당 함수에서 추가 또는 다른 클래스(또는 다른 CSS ID)를 올바르지 않은 컨텐츠가 있는 위젯 또는 해당 위젯의 레이블에(가능성이 더 높음) 지정하십시오.

동일한 함수에서 제어기 특정 getErrorMessage 함수를 호출하여 제어기 레벨 오류 메시지에 액세스할 수 있습니다. 이전에 설명된 대로 이 함수에는 매개변수가 없으며 STRING? 유형의 값을 리턴합니다.

EGL Dojo 위젯에 제어기 레벨 오류 메시지 표시

제어기 레벨 유효성 검증으로 인한 오류 메시지를 두는 위치를 선택할 수 있습니다.
  • 보기 레벨 유효성 검증을 지원하는 EGL Dojo 위젯과 관련하여 보기 레벨 유효성 검증으로 인한 메시지가 표시되는 도구 팁에 이 메시지를 둘 수 있습니다. 이 경우 위젯은 오류에 대한 응답으로 오류 표시기를 즉시 표시하지만 위젯이 포커스를 획득한 후에만 제어기 레벨 메시지가 표시됩니다. (이전에 설명한 보기 레벨 유효성 검증에 대해서는 사용자 입력 유효성 검증 참조)

    위젯이 양식에 있는 경우 오류 레이블을 제거하여 오류 레이블에 제어기 레벨 오류 메시지가 표시되지 않도록 할 수 있습니다.

  • EGL 또는 EGL Dojo 위젯과 관련하여 오류 메시지를 오류 레이블에 둘 수 있습니다(“Rich UI를 사용하여 양식 처리”에서 설명됨). 이 경우 위젯은 오류에 대한 응답에서 오류 표시기를 즉시 표시하며, 메시지는 오류가 발생하는 즉시 표시됩니다.

    오류 레이블에 메시지를 두고 보기 레벨 유효성 검증을 지원하는 EGL Dojo 위젯을 사용할 경우 메시지가 도구 팁에 표시되지 않도록 할 수 있습니다. 중복 표시를 방지하려면 제어기 특정 publishMessageHelper 특성을 널로 설정하거나 사용자 소유의 함수를 해당 특성에 지정하십시오. 특성을 설정하지 않거나 사용자 소유의 함수를 지정하지 않는 경우 도구 팁에 대한 오류 메시지를 가리키도록 내부 EGL 함수가 호출됩니다.

보기 레벨 유효성 검증이 지원되는 EGL Dojo 위젯에 대한 문서에서 설명된 대로 위젯 특정 showErrorIndicator 함수를 호출하여 오류 표시기를 설정할 수 있으며 위젯 특정 showErrorMessage 함수를 호출하여 오류 메시지를 표시할 수 있습니다.

유효성 검증된 입력 커미트

제어기 특정 commit 함수를 실행할 때 보기에서 모델로 데이터가 전송됩니다. 해당 프로세스 중에 여러 옵션을 제공하는 제어기 특성 세트에 의해 판별되는 몇 개의 함수가 호출됩니다. 다음은 특성입니다.
  1. retrieveViewHelper 특성은 위젯 컨텐츠를 검색하는 함수를 식별합니다. 이 함수에는 매개변수가 없으며 문자열을 리턴합니다. 이 함수를 사용하여 어떤 방식으로 입력을 변환할 수 있습니다. 그러나 대부분의 경우 retrieveViewHelper 특성을 설정할 필요가 없습니다. 해당 특성이 없는 경우 이후의 처리를 위해 위젯 컨텐츠를 문자열로 사용할 수 있습니다.
  2. unformatters 특성은 함수 배열을 식별합니다. 각 함수에는 문자열 매개변수(STRING in)가 있으며 문자열을 리턴합니다. 이러한 함수를 사용하여 입력에서 형식화 문자를 제거할 수 있습니다. 첫 번째 나열된 함수는 retrieveViewHelper 함수에서 리턴된 문자열을 허용하고 이후에 나열된 각 함수는 이전 함수에서 리턴된 문자열을 허용합니다. unformatters 특성을 설정할 필요가 없을 수 있습니다.
  3. 소스 코드에 지정된 형식화 특성(있는 경우)에 따라 사용자 입력에서 형식화 문자를 제거합니다. 형식화 문자의 예는 통화 기호입니다. 이는 currency 특성과 연관됩니다. 두 번째 예는 dateFormat 특성에서 지정된 구분 기호입니다.
  4. commitHelper 특성은 모델에 값을 지정하는 함수를 식별합니다. 이 함수는 문자열 매개변수를 사용하며 리턴값은 없습니다. 이 특성을 설정할 필요가 없을 수 있습니다. 이 특성을 설정하지 않으면 모델이 이전 함수에서 제공하고(있는 경우) 형식화 문자가 포함되지 않은 문자열을 받습니다.

모델 데이터 공개

제어기 특정 publish 함수를 실행할 때 모델에서 보기로 데이터가 전송됩니다. 해당 프로세스 중에 여러 옵션을 제공하는 제어기 특성 세트에 의해 판별되는 몇 개의 함수가 호출됩니다. 다음은 특성입니다.
  1. retrieveModelHelper 특성은 데이터 컨텐츠를 검색하는 함수를 식별합니다. 이 함수에는 매개변수가 없으며 문자열을 리턴합니다. 이 함수를 사용하여 어떤 방식으로 출력을 변환할 수 있습니다. 그러나 대부분의 경우 retrieveModelHelper 특성을 설정할 필요가 없습니다. 해당 특성이 없는 경우 이후의 처리를 위해 모델 컨텐츠를 문자열로 사용할 수 있습니다.
  2. 소스 코드에 지정된 형식화 특성(있는 경우)에 따라 데이터 컨텐츠에 형식화 문자를 추가합니다. 형식화 문자의 예는 통화 기호입니다. 이는 currency 특성과 연관됩니다. 두 번째 예는 dateFormat 특성에서 지정된 구분 기호입니다.
  3. formatters 특성은 함수 배열을 식별합니다. 각 함수에는 문자열 매개변수(STRING in)가 있으며 문자열을 리턴합니다. 이러한 함수를 사용하여 출력을 형식화할 수 있습니다. 첫 번째 나열된 함수는 2단계에서 추가된 형식화 문자를 사용하여 retrieveModelHelper 함수에서 리턴된 문자열을 허용하고 이후에 나열된 각 함수는 이전 함수에서 리턴된 문자열을 허용합니다. formatters 특성을 설정할 필요가 없을 수 있습니다.
  4. publishHelper 특성은 보기에 값을 지정하는 함수를 식별합니다. 이 함수에는 문자열 매개변수(STRING in)가 있으며 리턴값은 없습니다. 이 특성을 설정할 필요가 없을 수 있습니다. 이 특성을 설정하지 않으면 보기가 이전 함수에서 제공하고(있는 경우) 형식화 문자가 포함되지 않은 문자열을 받습니다.

유효성 검증 및 형식화 특성

Rich UI에서 사용되는 각 필드 레벨 특성은 “양식 필드 특성”에 설명되어 있습니다. 현재 절에서는 간단하게 각각 단일 문자로 분류된 특성을 나열합니다.
  • F는 형식화를 의미합니다. 이 카테고리의 특성은 커미트 중에 형식화 문자를 제거하고 공개 중에 형식화 문자를 추가합니다. 이러한 특성을 사용하면 오류 메시지가 표시될 수 있습니다. 예를 들어 입력 날짜가 필요한 날짜 형식과 현저하게 다르거나 정수 값이 0 또는 1 외의 숫자이지만 isBoolean과 연관된 경우입니다.
  • V는 입력 유효성 검증을 의미합니다.
다음은 모든 특성입니다.
  • currency (F)
  • currencySymbol (F)
  • dateFormat (F)
  • fillCharacter (F)
  • inputRequired (V)
  • inputRequiredMsgKey (V)
  • isBoolean (F)
  • isDecimalDigit (V)
  • isHexDigit (V)
  • lowercase (F)
  • minimumInput (V)
  • minimumInputMsgKey (V)
  • numericSeparator (F)
  • sign (F)
  • timeFormat (F)
  • timestampFormat (F)
  • typeChkMsgKey (V)
  • uppercase (F)
  • validValues (V)
  • validValuesMsgKey (V)
  • zeroFormat (F)
다음 특성은 “표시 가능한 텍스트에 특성 파일 사용”에서 상세하게 설명되어 있습니다.
  • inputRequiredMsgKey (V)
  • minimumInputMsgKey (V)
  • typeChkMsgKey (V)
  • validValuesMsgKey (V)

DataItem 정의, 변수 및 레코드 필드에서 유효성 검증 및 형식화 특성을 지정할 수 있습니다. 그러나 이러한 항목은 제어기를 선언할 때 @MVC 특성을 지정한 경우에만 주어진 Rich UI 제어기에 대해 의미를 가집니다.