본문 바로가기

IT/mendix

빠른 개발자 되기(Become a Rapid Developer) - 7. 앱 내 프로세스 자동화

반응형

7. 프로세스 자동화


긴 양식을 작성하는 것이 상당히 번거로운 과정이라는 것을 경험해 보셨을 것입니다. 이름, 주소, 우편번호, 날짜를 수동으로 입력하면 시간이 오래 걸리고 사용자 경험이 불쾌해질 수 있습니다.

Mendix 개발자는 항상 사용자의 요구를 최우선으로 생각해야 합니다. 마이크로플로는 각 사용자의 여정을 최대한 쾌적하게 만들기 위한 최고의 도구입니다. 마이크로플로우를 사용하면 사용자의 특정 요구 사항에 따라 맞춤형 기능을 구축할 수 있습니다.

대부분의 사람들이 여행 중에 휴대폰으로 앱을 사용하나요? 동일한 정보를 여러 번 입력해야 하나요? 이미 가지고 있는 데이터를 기반으로 일부 정보를 자동으로 입력할 수 있나요? 이러한 질문은 앱을 더 효과적으로 만들 수 있는 방법을 생각할 때 스스로에게 물어봐야 할 질문입니다.

이러한 질문에 대한 답이 '예'라면 마이크로플로우가 사용자를 위해 데이터를 자동으로 채우는 데 큰 도움이 될 수 있습니다. LearnNow 앱에서 교육 이벤트의 시작 날짜와 코스 기간을 알면 교육 이벤트의 종료 날짜를 자동으로 채울 수 있습니다. 또한 총 등록 수를 자동으로 계산하거나 특정 페이지에서 새 항목을 만들 때 특정 필드를 미리 채울 수도 있습니다. 이를 통해 Jimmy는 시간을 절약하고 비즈니스 개선에 집중할 수 있습니다.

이 모듈에서는 마이크로플로우를 사용하여 사용자 지정 로직을 추가하여 앱을 더 효율적으로 만드는 Mendix Studio Pro를 사용합니다. 방법을 배우게 됩니다:

마이크로플로우를 트리거하도록 위젯 이벤트 설정하기

객체와 값 변경을 위한 마이크로플로우 생성

오류를 해결하여 마이크로플로우가 의도한 대로 작동하는지 확인

사용자에게 아직 입력해야 하는 정보에 대한 표시 제공

다음 강의에서 교육 이벤트의 종료일을 자동으로 계산하는 방법을 알아보세요!

 

7.2 종료 날짜 자동 채우기

현재 지미가 교육 이벤트를 예약하려면 세부 정보를 수동으로 입력해야 합니다. 하지만 교육 이벤트의 시작 날짜와 코스 기간을 기준으로 종료 날짜가 자동으로 계산되도록 설정하면 시간을 절약하고 데이터의 일관성을 유지할 수 있습니다. 이렇게 하면 지미의 수고를 덜어줄 뿐만 아니라 실수로 종료 날짜를 잘못 선택할 가능성도 없앨 수 있습니다!

아래 이미지에서 Jimmy가 생성하려는 교육 이벤트의 코스와 시작 날짜를 선택하면 종료 날짜가 자동으로 계산되는 것을 볼 수 있습니다. 이 코스의 이미지에는 유럽 날짜 형식이 사용되었습니다.

이 기능을 구축하기 위한 계획을 수립해 보겠습니다. 몇 가지 단계가 필요합니다:

첫 번째 단계는 마이크로플로우를 트리거하는 것입니다. 시작 날짜와 코스 기간에 따라 종료 날짜가 결정되므로 이러한 날짜가 선택될 때 트리거가 발생해야 합니다. 위젯 이벤트를 사용하여 이 작업을 수행할 수 있습니다. 시작 날짜 입력 위젯과 코스 선택기 위젯에 두 개의 위젯 이벤트가 필요합니다. 두 이벤트 모두 종료 날짜를 계산하는 마이크로플로우를 트리거하며, 이 마이크로플로우를 생성합니다.

두 번째 단계는 이 새 마이크로플로우를 사용하여 계산된 종료 날짜를 채우는 것입니다. 이를 위해서는 TrainingEvent(개체 변경 활동)를 변경하고 새 EndDate 값을 설정해야 합니다. 이렇게 하려면 addDays 함수를 사용하는 마이크로플로우 표현식을 작성해야 합니다. 이 함수는 날짜(시작 날짜)에 일 수(코스 기간)를 더하고 새 날짜를 계산합니다.

그런 다음 앱을 로컬에서 실행하고 가능한 모든 방법으로 교육 이벤트 데이터를 입력하여 오류를 일으킬 수 있는지 확인하여 기능을 테스트합니다.

다음 단계는 발생했을 수 있는 오류를 분석하고 이러한 오류가 다시 발생하지 않도록 마이크로플로우를 조정하는 것입니다.

마지막으로 작업을 커밋합니다.

이러한 단계는 이 모듈의 과제를 진행하면서 더 자세히 설명합니다.

 

7.3 입력 위젯에서 마이크로플로우 트리거하기  


첫 번째 단계인 사용자가 코스 또는 교육 이벤트의 시작 날짜를 변경할 때 마이크로플로우가 트리거되도록 하는 것부터 시작하겠습니다.

이전 강의에서 언급했듯이 입력 위젯은 일반적으로 사용자에게 데이터를 표시하고 사용자가 데이터를 편집할 수 있도록 하는 데 사용됩니다. 입력 위젯의 몇 가지 예로는 확인란, 날짜 선택기, 라디오 버튼, 드롭다운 및 텍스트 상자가 있습니다. 아래 이미지에서 볼 수 있듯이 교육 이벤트 세부 정보 페이지에서 드롭다운을 사용하여 코스를 선택할 수 있습니다. 또한 교육 이벤트의 시작 날짜는 날짜 선택기를 사용하여 선택할 수 있습니다.

버튼이 사용자가 클릭할 때 이벤트를 트리거할 수 있는 것처럼(예: 페이지 열기 또는 마이크로플로우 호출), 입력 위젯도 동일한 방식으로 이벤트를 트리거할 수 있습니다! 입력 위젯과의 차이점은 이벤트가 세 가지 다른 지점에서 트리거될 수 있다는 것입니다:

입력 시: 사용자가 입력 위젯을 입력(클릭)할 때

변경 시: 사용자가 변경 후 입력 위젯을 떠날 때

떠날 때: 사용자가 입력 위젯을 떠날(닫을) 때(위젯의 값을 변경했는지 여부와 관계없이)

입력 위젯을 사용할 때 입력, 변경 또는 종료 시 선택할 수 있는 이벤트 중 하나는 마이크로플로우 호출입니다.

마이크로플로우를 사용하여 필드 값을 확인하고 최종 사용자에게 즉각적인 피드백을 제공할 수 있습니다.

예를 들어 StartDate 값을 변경하는 입력 위젯은 마이크로플로우를 트리거할 수 있습니다:

입력 시: 사용자가 안건 아이콘을 클릭하면 마이크로플로우가 트리거됩니다.

변경 시: 사용자가 교육 이벤트의 시작 날짜를 변경하면 마이크로플로우가 트리거됩니다. 이는 시작 날짜의 값을 '선택 없음'에서 특정 날짜로 변경하는 것을 의미할 수도 있습니다.

휴가 중: 사용자가 날짜 변경 여부에 관계없이 날짜 선택기를 열었다가 닫으면 마이크로플로우가 트리거됩니다.

교육 이벤트의 종료 날짜를 자동으로 계산하는 데 사용할 마이크로플로우를 언제 트리거할지 짐작할 수 있나요? 다음 강의로 이동하여 알아보세요.

7.3.1 입력 위젯 설정
 


이 과제에서는 입력 위젯에서 마이크로플로우를 호출하여 교육 이벤트의 종료 날짜를 자동으로 채우는 방법을 살펴봅니다. 마이크로 플로우는 다음을 계산합니다: 종료 날짜 = 시작 날짜 + 기간.

시작 날짜는 날짜 선택기 입력 위젯에서 선택되며 기간은 드롭다운 입력 위젯에서 어떤 코스를 선택했는지에 따라 달라집니다. 사용자가 코스와 시작 날짜를 모두 변경할 수 있으므로 마이크로플로우를 트리거하려면 두 위젯을 모두 설정해야 합니다! 첫 번째 위젯부터 시작하겠습니다.

 

시작 날짜 입력 위젯(날짜 선택기)
TrainingEvent_NewEdit 페이지를 엽니다. .

시작 날짜 입력 위젯을 두 번 클릭하여 해당 속성을 엽니다. 팝업 창이 열립니다. 이 창에는 4개의 탭이 있습니다: 일반, 공통, 이벤트 및 모양입니다. 이벤트 탭을 엽니다. 이 경우 시작 날짜가 변경되었을 때 종료 날짜를 계산하고 싶으므로 변경 시 이벤트가 필요합니다.

변경 시 이벤트를 마이크로플로우 호출로 설정합니다. 기존 마이크로플로우 중 하나를 선택하거나 새 마이크로플로우를 만들 수 있는 선택 창이 열립니다. 종료 날짜를 계산하는 마이크로플로우가 아직 존재하지 않습니다. 새로 만들기를 클릭하여 새 마이크로플로우를 만듭니다.

마이크로플로우의 명명 규칙을 기억하시나요? 접두사_엔티티_작동. 변경 시 이벤트의 접두사는 OCH입니다. 명명 규칙에 따라 마이크로플로우에 명확한 이름을 지정하세요. 이렇게 하면 다른 개발자가 필요할 때 마이크로플로우의 정의와 기능을 더 쉽게 해석할 수 있습니다. 좋은 이름은 다음과 같습니다: OCH_TrainingEvent_CalculateEndDate...

코스 입력 위젯(드롭다운)
코스마다 기간이 다르므로 종료 날짜는 선택한 코스에 따라 달라집니다. 즉, 코스 선택기에서도 동일한 마이크로플로우를 트리거해야 합니다.

TrainingEvent_NewEdit 페이지로 돌아가서 코스 선택기에 변경 시 이벤트를 추가합니다. 여기에 OCH_TrainingEvent_CalculateEndDate 마이크로플로우를 연결합니다. 이벤트 섹션은 이 위젯의 일반 탭 하단에 있지만 변경 시 이벤트는 동일하게 작동합니다. 일부 입력 위젯에는 입력 시 또는 퇴실 시 이벤트가 없으므로 이벤트 탭이 없어도 모두 표시할 수 있습니다.

새로 만든 마이크로플로우를 엽니다. TrainingEvent 입력 매개변수가 어떻게 있는지 보셨나요? 이것은 최종 사용자가 현재 생성하거나 편집 중인 TrainingEvent를 나타냅니다.

 

7.3.2 마이크로플로우 구축
 

마이크로플로우에 대해 자세히 알아봅시다. 마이크로 플로우에 대한 지식을 복습하고 싶다면 이 학습 경로에서 마이크로 플로우에 대한 이전 모듈을 확인하세요. 사용자가 시작 날짜 및 코스를 선택할 때마다 이 마이크로플로우의 종료 날짜가 올바르게 설정되도록 하는 것이 목표라는 점을 기억하세요.

 

가장 먼저 해야 할 일은 마이크로 흐름에 활동을 추가한 다음 이를 변경 객체로 변환하는 것입니다. 이렇게 하려면 마이크로 플로우 도구 모음에서 활동 아이콘을 클릭한 다음 새 활동을 시퀀스 흐름으로 끌어다 놓습니다. 도구 상자에서 특정 활동 및 마이크로 플로우 요소를 가져올 수도 있습니다.

액션 활동을 종료 이벤트에 가깝게 배치합니다. 항상 최종 결과부터 시작해야 한다는 점을 기억하세요!

이제 변경 개체로 변환하려면 활동을 마우스 오른쪽 버튼으로 클릭하고 작업 유형 설정...을 클릭한 다음 개체 변경을 선택합니다. 활동의 속성 창이 나타나고 변경할 개체를 선택할 수 있습니다. 종료 날짜는 교육 이벤트 엔티티의 일부이므로 교육 이벤트를 선택합니다.

지미가 이벤트를 변경하고, 이를 확인하고, 선생님과 연수생이 볼 수 있도록 표시할 수 있기를 원합니다. 이제 데이터베이스에 변경 사항을 즉시 커밋하는 것이 무엇을 의미하는지, 클라이언트를 새로 고쳐야 하는지 생각해 보아야 합니다. 교육 이벤트는 최종 사용자가 앱에서 저장 버튼을 클릭할 때만 데이터베이스에 저장(커밋)되어야 합니다. 원하는 최종 결과는 계산된 종료 날짜를 앱에 즉시 표시하는 것이므로 클라이언트를 새로 고쳐야 합니다. 즉, 지금 교육 이벤트를 커밋할 필요가 없습니다. 변경된 정보가 표시되도록 클라이언트를 새로 고쳐야 합니다. 클라이언트를 새로 고치지 않으면 런타임에 정보가 변경되지만 최종 사용자에게는 변경 사항이 표시되지 않습니다.

곧 데이터베이스와 클라이언트에 대해 자세히 알아보겠습니다.

클라이언트에서 새로 고침을 예로 설정합니다.

클라이언트에서 새로 고침 아래에서 새로 만들기를 클릭하여 변경 사항을 추가합니다. 변경 항목 편집 팝업이 열립니다. 먼저 변경할 멤버를 선택해야 합니다. '멤버'는 속성과 연관을 모두 포괄하는 용어입니다. 이 경우 EndDate 속성을 변경하려는 것이므로 드롭다운에서 해당 속성을 선택합니다. 즉시 표현식 편집기(큰 텍스트 영역)를 편집할 수 있게 됩니다.

표현식 편집기는 앱에 사용자 정의 논리를 추가하기 위한 표현식을 작성하는 곳입니다. 다음 강의에서는 그 방법을 배우게 될 것입니다!

 

7.4 마이크로 플로우 표현식


일수를 계산하려면 표현식을 사용해야 합니다. 표현식은 '로우 코드'의 '코드' 부분입니다. 표현식을 사용하면 함수를 만들고, 검사를 작성하고, 값을 변경할 수 있습니다.

마이크로 플로우 표현식을 작성할 때 가장 친한 친구는 키보드 단축키 Ctrl + 스페이스입니다. 이 단축키를 사용하면 마이크로 플로우 표현식을 만드는 데 사용할 수 있는 모든 요소의 목록이 표시됩니다.

다음 유형의 요소를 사용할 수 있습니다:

함수: 값을 변경, 비교 또는 값에서 정보를 추출하는 많은 함수를 사용할 수 있습니다. 전체 목록은 마이크로 플로우 표현식 문서에서 찾을 수 있습니다. 함수가 작동하려면 항상 함수 뒤에 괄호()가 있어야 합니다. 괄호 안에는 함수가 마법을 부리는 데 필요한 재료를 넣으면 됩니다! 따라서 함수명(성분 1, 성분 2)와 같은 형태가 됩니다.

변수는 단일 객체, 객체 목록 또는 원시(단일) 값을 포함합니다. 변수는 항상 $(달러 기호)와 변수 이름으로 시작합니다. 마이크로플로우의 모든 데이터는 변수에 저장되며 고유한 이름을 갖습니다.

예를 들어, 연수생 개체는 $Trainee 변수에 저장됩니다. 개체의 속성은 변수 뒤에 $Trainee/EmailAddress와 같이 추가됩니다.

토큰은 현재 사용자 토큰을 제외한 모든 토큰이 날짜/시간과 관련이 있습니다. 입력하여 제안 목록을 가져옵니다.

예를 들어 현재 날짜와 시간을 사용하려면 [%CurrentDateTime%]을 입력합니다.

다음은 몇 가지 일반적인 표현식입니다:

타입
Arithmetic *  :  +   -
Relational <   >   <= >= =  !=
Special checks empty isNew 
Boolean and   or   not
If expressions If  then  else

마이크로 플로우 표현식의 예
반올림 함수를 사용하여 숫자를 반올림할 수 있습니다. 변수 $Number의 값이 0.99인 경우 round($Number) 함수의 결과는 1이 됩니다.

소문자 함수를 사용하여 텍스트를 소문자로 변환할 수 있습니다. 예를 들어 $Name 변수에 'BeStName3veR'이 값으로 있는 경우, toLowerCase($Trainee/Name) 함수는 Name 값을 'bestname3ver'로 설정합니다.

 

7.4.1 종료 날짜 계산을 위한 표현식 만들기


이전 과제에서 표현식 편집기가 열립니다. 여기에서 교육 이벤트의 종료 날짜를 계산하는 함수를 입력할 수 있습니다. addDays 함수가 필요합니다. 이 경우 addDays 함수는 코스 기간을 시작 날짜에 추가합니다.

마이크로 플로우 표현식 편집기 내부를 클릭하고 Ctrl + 스페이스 키를 누릅니다. AddDays를 입력하기 시작하고 옵션 목록에 해당 옵션이 표시되면 Enter 키를 누르거나 두 번 클릭하여 선택합니다.

이제 AddDays 함수 뒤에 괄호를 추가합니다. 함수가 빨간색으로 바뀝니다. 이제 Mendix Studio Pro가 해당 함수를 함수로 인식하고 누락된 재료가 있음을 알려주기 때문입니다. Mendix Studio Pro는 누락된 재료와 괄호 사이에 어떤 순서로 배치해야 하는지 알려줍니다. 이 경우 첫 번째 성분은 날짜 및 시간 값이고 두 번째 성분은 정수 또는 길이입니다. 따라서 함수는 addDays(날짜 및 시간, Integer/Long)가 됩니다.

따라서 함수는 addDays(날짜 및 시간, 정수/길이, 또는 이를 도메인 모델 및 생성 중인 계산과 연관시키는 경우 addDays([시작 날짜], [기간])가 됩니다.

괄호 사이에 두 속성을 모두 배치할 수 있는지 확인합니다. 기억해야 할 몇 가지 중요한 사항이 있습니다:

입력할 내용을 정확히 알고 있는 경우가 아니라면 항상 Ctrl + 스페이스를 사용하세요.

객체의 속성은 항상 해당 객체를 나타내는 변수 뒤에 작성됩니다(따라서 속성에서 직접 시작하지 말고 변수에서 시작하세요). 표기법: $[변수명]/[속성명].

각 요소 사이에 쉼표를 넣어 구분합니다.

Duration 속성을 추가할 수 있었나요? 아마 못했을 겁니다! 하지만 이것은 여러분의 잘못이 아닙니다! 마이크로플로우에서 사용할 수 있는 TrainingEvent 변수($TrainingEvent/StartDate) 내에서 StartDate에 액세스할 수 있습니다. 어떤 코스를 선택했는지도 확인할 수 있습니다($TrainingEvent/MyFirstModule.TrainingEvent_Course). 그러나 /를 입력하여 코스에 들어가서 기간으로 이동할 수는 없습니다. 그 이유는 범위 때문이며 다음 강의에서 설명하겠습니다!

 

7.5 마이크로플로우의 범위


마이크로플로우에서 사용할 수 있는 개체가 있으면 아래 이미지에 표시된 것처럼 개체 내부의 모든 정보(속성)와 개체가 연결된 개체(연결)에 액세스할 수 있습니다. 이를 마이크로플로우의 범위에 속한다고 합니다. 하지만 연결된 개체 내부의 정보에는 액세스할 수 없습니다.

이를 염두에 두고 TrainingEvent 개체가 마이크로플로우의 범위에 있고 StartDate가 해당 개체 내부에 있으므로 범위에도 있음을 알 수 있습니다. Duration은 코스 객체에 있으므로 아직 범위에 속하지 않습니다. 검색을 사용하여 마이크로 흐름으로 가져와야 합니다! 다음 강의에서 검색이 무엇이며 검색을 수행하는 방법을 배우게 됩니다.


7.6 데이터 검색


마이크로플로우를 구축하기 시작할 때 필요한 데이터가 범위에 없는 경우가 있습니다. 이를 범위로 가져오는 방법은 검색을 사용하는 것입니다. 검색은 개체 변경 및 개체 만들기 활동과 마찬가지로 마이크로플로우의 활동입니다. 검색은 개체 목록에서 특정 개체를 찾아 마이크로 플로우에서 사용할 수 있도록 합니다.

검색을 수행할 때 정보를 어디서 가져올지 결정해야 합니다. 메모리 또는 데이터베이스의 두 가지 선택지가 있습니다. 먼저 데이터가 어디에 있는지, 언제 저장되는지 살펴봅시다.

예를 들어 보겠습니다. 텍스트 문서 작성을 시작할 때 컴퓨터를 부팅하고 텍스트 편집기를 실행한 다음 새 문서를 엽니다. 그 순간 문서가 생성되어 메모리에 로드되고(2) 화면에 표시됩니다(1). 화면에서 변경하면 해당 내용이 화면에 표시되고(1) 장치의 메모리에 기록됩니다(2). 문서를 저장하지 않고 문서를 닫으면 메모리에 있던 문서가 삭제되고(4) 더 이상 메모리나 하드 드라이브에 문서가 존재하지 않게 됩니다.

 

하지만 문서를 저장하면 하드 드라이브에 저장됩니다(3). 이제 문서를 닫으면 메모리에 있던 버전은 삭제되지만(4) 저장된 버전은 하드 드라이브에 남아 있습니다(3). 문서를 다시 열면 하드 드라이브(3)에서 메모리(2)로 로드되고 화면(1)에 표시됩니다. 문서(1)를 새로 변경하면 메모리(2)에 저장되고, 다시 저장하면 하드 드라이브(3)의 파일이 메모리(2)의 변경 사항으로 업데이트됩니다. 변경을 취소하면 메모리에 있는 버전은 삭제되고(4) 하드 드라이브의 버전은 변경되지 않은 상태로 유지됩니다.

이것이 멘딕스 애플리케이션과 무슨 관련이 있는지 궁금하실 수도 있습니다.

Mendix 앱도 매우 유사합니다. LearnNow 애플리케이션에 새 위치를 추가할 때 사용자가 추가 버튼을 클릭하면 애플리케이션 서버의 메모리에 빈 위치 객체가 새로 생성됩니다(2). 그러면 객체가 클라이언트로 전송되어(1) 사용자가 객체를 보고 수정할 수 있습니다. 변경하면 클라이언트(1)에 표시되고 메모리(2)에 기록됩니다. 저장하지 않고 위치 개체를 취소하면 페이지를 닫고 메모리에 있는 위치 개체가 삭제됩니다(4). 위치 개체는 더 이상 메모리에 존재하지 않으며 데이터베이스에 저장되지 않습니다.

그러나 위치 개체를 저장하면 데이터베이스에 새 레코드로 저장되고(3) 메모리에 보관된 위치 개체는 휴지통으로 전송됩니다(4). 위치 세부 정보를 다시 열면 데이터베이스(3)에 저장된 위치 레코드가 위치 개체로 메모리(2)에 로드되고 클라이언트(1)에서 볼 수 있습니다. 위치 개체를 변경하면 이러한 변경 사항이 메모리(2)에 기록됩니다. 변경된 위치 개체를 저장하면 메모리(2)의 변경 사항에 따라 데이터베이스 레코드(3)가 업데이트됩니다. 또는 변경을 취소하면 메모리에 기록된 위치 개체가 휴지통(4)으로 보내지고 데이터베이스의 위치 레코드는 원래 저장된 개체로 유지됩니다.

여기서 다음과 같은 방식으로 상호 작용의 유사성을 확인하는 것이 중요합니다:

클라이언트 <-> 메모리 <-> 데이터베이스

화면 <-> 메모리 <-> 하드 드라이브

 

7.7 연관 검색 기준


Mendix에서 메모리에서 검색을 수행하는 것을 연관 검색이라고 합니다. 즉, 앱이 요청된 정보를 메모리에서 먼저 찾습니다. 아직 메모리에 없거나 정보가 특정 임계값보다 오래되어 오래된 정보일 수 있는 경우 앱은 데이터베이스에서 해당 정보를 가져옵니다.

정보가 이미 메모리에 있는 경우 연결 기준 검색이 데이터베이스 검색보다 빠릅니다. 데이터베이스에 연결할 필요가 없기 때문입니다.

연관 검색을 사용하는 주된 이유는 데이터베이스에 아직 없는 정보를 검색하려는 경우입니다. 잼 예시를 기억하시나요? 새로운 유형의 잼을 만들고 있다고 가정해 봅시다. 감독이 새로운 맛을 시식하고 싶어합니다. 이 잼은 아직 창고(데이터베이스)에서 사용할 수 없으므로 생산 라인(메모리)에서 직접 샘플을 가져와야 합니다.

메모리에는 존재하지만 데이터베이스에는 없는 객체를 일시적 객체라고 합니다. 연관을 통해 검색하면 데이터베이스의 모든 정보뿐만 아니라 메모리에만 있는 일시적 객체도 포함됩니다. 위의 예에서 새로운 잼 맛을 검색할 때 유용할 수 있지만, 실수로 생각보다 많은 개체가 검색될 수 있습니다. 따라서 어떤 유형의 검색을 사용해야 하는지 정확히 파악하는 것이 중요하며, 어떤 검색이 본질적으로 다른 검색보다 나은 것은 아닙니다.

이를 이해하기 위해 잼 공장으로 돌아가 보겠습니다. 공장장은 현재 판매되고 있는 모든 잼 종류에 대한 개요를 원합니다. 생산 및 테스트 중인(아직 판매 승인을 받지 않은) 새로운 잼 맛은 이 목록에 포함되어서는 안 됩니다. 즉, 생산 라인 직원(기억)이 아닌 창고 직원에게 목록(데이터베이스)을 요청해야 합니다.  

따라서 일시적 객체는 항상 연관 기준 검색에 포함됩니다. 임시 개체를 포함하지 않으려면 데이터베이스에서 검색을 사용하세요.

 

7.7.1 데이터 검색


코스 객체를 마이크로플로우의 범위로 가져올 시간입니다! 마이크로 흐름은 왼쪽에서 오른쪽으로 순차적으로 작동하므로 객체 변경 활동 전에 코스 객체를 검색해야 합니다. 그렇지 않으면 객체 변경 활동의 마이크로 흐름 표현식에 대한 범위에 포함되지 않습니다.

개체 변경 활동의 왼쪽에 있는 마이크로 플로우 라인에 새 활동을 배치하고 새 활동을 두 번 클릭하여 작업 유형을 설정합니다. 검색을 선택합니다.

이제 데이터 소스를 결정해야 합니다: 연결 기준 또는 데이터베이스에서. 이 경우 연결 기준이어야 합니다. 여기에는 두 가지 이유가 있습니다:

마이크로플로우가 실행될 때 새 TrainingEvent가 생성될 수 있습니다. 이는 아직 데이터베이스에 저장되지 않았음을 의미합니다. 코스 개체는 데이터베이스에 존재하지만 코스에 대한 새 교육 이벤트의 연결은 존재하지 않으며, 이것이 검색의 시작점입니다. 그러나 이 모든 것은 메모리에 존재합니다.

기존 교육 이벤트를 수정하고 코스 유형을 변경했을 수 있습니다. 데이터베이스에서 연결을 조회하면 방금 선택한 코스가 아닌 다른 코스에 대한 이전 연결을 찾을 수 있습니다.

선택을 클릭하여 이 검색에 사용할 연결, 즉 검색할 객체를 선택합니다. TrainingEvent_Course 연결을 선택합니다. 선택을 클릭하고 다음 화면에서 확인을 클릭합니다.

객체 변경 활동을 열고 AddDays 함수로 돌아갑니다. 이제 범위 내에 Course 개체가 $Course 변수로 있으므로 Duration 속성에 액세스할 수 있습니다. 아래와 같이 마이크로플로우 표현식을 완성합니다:

7.7.2 실행, 테스트, 충돌

 

앱을 테스트할 시간입니다! 로컬에서 실행하고 몇 가지 데이터를 입력합니다. 이제 마음껏 플레이해 보세요. 목표는 애플리케이션을 깨뜨리는 것이므로 창의력을 발휘하여 가능한 모든 방법으로 교육 이벤트를 예약해 보세요.

해냈어요! 두 속성 중 하나를 설정하면 오류가 발생합니다. 일반적으로 앱 충돌은 축하할 일이 아니지만, 앱이 배포된 후가 아니라 지금 발생하기를 원합니다. 이제 앱 디버깅을 통해 무엇이 잘못되었는지 파악하는 방법을 배워보겠습니다.

 

7.7.3 오류 분석


다음 단계는 오류를 분석하는 것입니다.

멘딕스 스튜디오 프로에서 콘솔을 엽니다. 이것은 앱의 로컬 로그이며 앱이 충돌하는 경우 오류 메시지가 표시되는 곳입니다.

하단의 빨간색 선 두 개는 방금 트리거한 오류를 나타냅니다. 클립 아이콘이 있는 줄을 두 번 클릭하여 자세히 살펴보세요. 이와 같은 오류가 발생하면 Mendix는 오류를 수정하는 방법과 위치에 대한 좋은 출발점을 제공하기 위해 매우 명확한 로그 메시지를 제공합니다.
메시지에서 오류가 발생한 마이크로플로우의 이름을 확인할 수 있습니다(다음 이미지에서 빨간색으로 강조 표시됨). 현재 빌드 중인 마이크로플로우가 바로 OCH_TrainingEvent_CalculateEndDate 마이크로플로우입니다! 확률이 얼마나 될까요? 디버깅을 통해 오류의 원인을 확인해 봅시다.
팁: Mendix 내에서 로그 메시지를 생성하는 방법에 대해 자세히 알고 싶다면 고급 모듈 오류 처리를 살펴보세요.

OCH_TrainingEvent_CalculateEndDate 마이크로플로우를 열고 첫 번째 활동을 마우스 오른쪽 버튼으로 클릭합니다. 중단점 추가를 클릭합니다. 활동의 오른쪽 하단에 빨간색 점이 나타납니다. 이 중단점은 이 활동을 통과할 때 마이크로플로우를 일시 중지하여 마이크로플로우를 단계별로 조사할 수 있도록 합니다. 중단점을 실행 취소하려면 언제든지 활동을 다시 마우스 오른쪽 버튼으로 클릭하고 중단점 사용 안 함 또는 제거를 선택하면 됩니다.

앱으로 돌아가 브라우저를 새로 고친 다음 앱 충돌을 일으킨 단계를 반복합니다(코스 또는 시작 날짜 선택). 마이크로플로우가 일시 중지되면 컴퓨터의 작업 표시줄에 있는 Mendix 아이콘이 깜박이기 시작합니다.
Mendix Studio Pro로 돌아갑니다. 디버거 및 변수 창이 나타나야 합니다! (그렇지 않은 경우 보기, 디버그 창으로 이동하여 해당 옵션을 클릭합니다.) 디버거와 변수 창이 나란히 표시된 다음 이미지와 같이 Mendix Studio Pro를 설정하는 것이 좋습니다. 탭을 드래그하여 이 작업을 수행할 수 있습니다. (창을 이동하는 데 어려움을 겪는다면 언제든지 보기 > 레이아웃 재설정...으로 이동하여 인터페이스 레이아웃을 재설정할 수 있습니다).

주위에 빨간색 테두리가 있는 활동이 현재 마이크로플로우가 일시 중지된 활동입니다. 활동이 실행되기 전에 일시 중지되므로 이 시점에서는 아직 검색이 완료되지 않았습니다. 디버거 창에서 다음 활동으로 이동하려면 단계를 클릭합니다. 변수 창을 조사하여 무엇이 잘못되었는지 파악할 수 있는지 확인합니다.

코스가 성공적으로 검색되었으므로 Duration(값 열에 ID가 있으므로 확인할 수 있음)이 있지만 StartDate의 값은 (비어 있음)입니다. 두 가지 요소 중 하나가 여전히 누락되었기 때문에 addDays 함수가 충돌하게 됩니다. 하지만 새 교육 이벤트의 세부 정보를 작성할 때 코스 유형과 시작 날짜를 동시에 선택할 수 없기 때문에 이는 당연한 일입니다. 시작 날짜를 먼저 선택했다면 시작 날짜 대신 코스 개체만 누락되는 똑같은 충돌이 발생했을 것입니다. 이 문제를 어떻게 방지할 수 있을까요? addDays 함수를 실행하기 전에 필요한 모든 요소가 있는지 확인하는 체크포인트를 만들어야 합니다! Decisions라는 것을 사용하여 이를 수행할 수 있습니다.
디버거 창에서 계속을 클릭하여 디버깅 프로세스를 완료합니다.

 

7.7.4 의사 결정 사용


노란색 다이아몬드 모양의 요소인 결정을 사용하여 마이크로 플로우에서 확인을 작성할 수 있습니다. 이 경우 마이크로 흐름을 계속하도록 허용하기 전에 시작 날짜와 코스가 모두 선택되었는지 확인하는 데 사용할 수 있습니다.

이 마이크로 플로우에는 시작 날짜를 확인하는 것과 코스를 확인하는 두 가지 결정이 필요합니다.
 

기존 두 활동 사이에 있는 마이크로 플로우 라인에 결정을 배치합니다. 두 번 클릭하여 속성을 엽니다. 가장 먼저 결정해야 할 것은 캡션입니다. 이것은 의사 결정에 표시됩니다. 좋은 캡션은 결정을 열지 않고도 결정이 무엇을 확인하는지 이해할 수 있게 해줍니다. 이 결정은 시작 날짜가 선택되었는지 여부를 확인하므로 좋은 캡션은 시작 날짜가 선택되었는지 여부입니다.

다음으로 마이크로플로우 표현식이 필요합니다. 여기에서 확인해야 할 항목을 정의합니다. 선택이 이루어졌는지 여부를 확인하면 참 또는 거짓 결과가 나옵니다. 참 값은 항상 긍정적인 결과를 나타내야 합니다. 즉, 검사 결과가 참이면 마이크로플로우가 계속 진행됩니다. 결과가 거짓이면 실행이 취소됩니다. 마이크로플로우 표현식에는 값이 존재하는지 확인하는 특별한 단어가 없지만, 값이 존재하지 않는지 확인하는 단어인 비어 있음이 있습니다.  시작 날짜가 비어 있는지(선택이 이루어지지 않은 경우의 값) 묻는 대신 !=를 사용하여 비어 있지 않은지 확인하여 참 결과는 처리를 계속하고 거짓 결과는 중단합니다. 원하는 표현식은 $TrainingEvent/StartDate != empty입니다.

확인을 클릭하여 마이크로 플로우로 돌아갑니다.

이제 의사 결정에서 나오는 화살표가 빨간색으로 표시됩니다. 이는 흐름이 이 경로가 참 경로인지 거짓 경로인지 알지 못하기 때문입니다. 기본적으로 약간의 정체성 위기를 겪고 있는 것입니다! 화살표를 마우스 오른쪽 버튼으로 클릭한 다음 조건 값을 true로 설정합니다. 이제 이 흐름은 모든 것이 정상이라는 결과를 나타내며 종료 날짜를 계속 계산합니다. 결정에는 거짓 경로에 대한 흐름도 필요합니다. 의사 결정의 아래쪽 모서리에서 아래쪽으로 선을 끕니다. 릴리스에서 이벤트 종료를 선택합니다. 이 결정에는 두 가지 가능한 결과만 있으므로 이 경로는 자동으로 거짓 경로가 됩니다. 한 경로가 참이면 다른 경로는 자동으로 거짓 경로가 됩니다.

이 단계를 반복하여 코스가 선택되었는지 확인하는 다른 결정을 작성합니다. 코스 객체는 $Course 변수에 저장된다는 점을 기억하세요. 해당 변수가 비어 있는지 여부를 확인해야 합니다.

다음 이미지를 사용하여 솔루션을 확인합니다.

이제 전체 마이크로플로우가 다음과 같이 표시되어야 합니다:

7.7.5 마이크로플로우 완료


마지막 단계는 마이크로플로우를 완료하고 작업을 저장한 후 커밋하는 것입니다.

첫 번째 활동을 마우스 오른쪽 버튼으로 클릭하고 중단점 제거를 클릭합니다. 이렇게 하면 마이크로플로우가 트리거될 때 앱이 더 이상 일시 중지되지 않고 디버거로 전환되지 않습니다.

앱을 다시 실행(로컬로 실행)하고 교육 이벤트를 예약해 보세요. 이제 작동합니다! 하지만 한 가지 오류가 남아있지만 이것은 다른 종류의 오류입니다. 앱이 더 이상 충돌하지 않는데 무슨 문제일까요? 계산 중인 날짜를 살펴보고 문제가 있는지 확인하세요. 표시되지 않는 경우 기간이 하루인 코스를 생성하고 해당 코스를 예약합니다. 종료 날짜는 시작 날짜보다 하루 늦지만 하루 동안 진행되는 코스는 같은 날에 시작하고 같은 날에 종료해야 합니다! addDays 함수는 24시간을 추가하므로 이 함수는 요청하신 대로 정확히 수행하지만 여기서 원하는 것은 아닙니다. 로직을 조금 변경해 봅시다!

마이크로플로로 돌아가서 개체 변경 활동을 엽니다. 코스 기간에서 하루를 뺀 값을 더하도록 addDays 함수를 편집합니다. 이렇게 하면 하루 동안 지속되는 코스가 이제 같은 날에 시작하고 같은 날에 종료됩니다. 코스/기간 뒤에 "- 1"을 추가하기만 하면 됩니다.

참고: 마이크로 플로우 표현식에서는 공백, 탭 및 반환이 무시되므로 표현식의 가독성을 높이려면 원하는 만큼 서식을 추가하세요.

이제 기간이 1일인 코스의 시작 날짜에 0일이 추가되어 종료 날짜가 계산되며, 다른 모든 기간도 올바르게 계산됩니다.

마지막으로 한 번 더 테스트한 다음 마지막 단계를 계속 진행하세요!

 

7.5 작업 커밋


축하합니다! 이제 자동으로 종료 날짜를 계산하여 세 가지 방법으로 교육 이벤트 일정을 더 효율적으로 예약할 수 있게 되었습니다! 작업을 커밋하고 사용자 스토리의 상태를 업데이트할 시간입니다.

변경사항 창을 엽니다. 변경사항 창은 멘딕스 스튜디오 프로 하단에서 찾을 수 있습니다.

마지막 커밋 이후 수행한 모든 작업이 표시됩니다. 현재 두 가지 변경 사항이 있습니다. 변경 내용을 두 번 클릭하면 변경 내용에 대한 자세한 내용을 볼 수 있습니다.

커밋을 클릭하여 커밋 프로세스를 시작합니다. Mendix Studio Pro는 먼저 업데이트에 대한 자동 확인을 수행한 다음 커밋 창을 엽니다.

탭 위의 텍스트 영역은 커밋 메시지를 입력하는 곳입니다. 이 메시지는 커밋을 진행하기 위해 필요합니다. 팁: 이 커밋 메시지를 설명적인 메시지로 작성하세요. 예를 들면 다음과 같습니다: "TrainingEvent_NewEdit 페이지의 코스 및 시작 날짜 입력 위젯에 변경 이벤트에 대한 두 가지를 추가했습니다. 코스 및 시작 날짜를 기반으로 올바른 종료 날짜를 계산하여 표시하는 마이크로플로우를 추가했습니다.".  이 메시지는 프로젝트 대시보드의 팀 서버 탭에 표시되며 다른 모든 팀원이 이 메시지를 볼 수 있습니다. 스크럼 마스터와 비즈니스 엔지니어만 앱 콘텐츠에 액세스할 수 있으므로 다른 팀원들도 프로젝트 대시보드에서 지금까지의 진행 상황을 읽고 기뻐할 것입니다!

관련 스토리 탭에서 관련 사용자 스토리를 선택합니다. 커밋 창에서 모델 변경 사항 탭을 클릭합니다. 여기에서 팀 서버에 커밋하려는 변경 사항을 볼 수 있습니다. 변경사항 창에서 이미 찾은 내용과 일치합니다.

확인을 클릭합니다. 커밋하는 데 몇 초 정도 걸립니다. 커밋이 완료되면 변경사항 창에 변경사항이 0개가 남습니다.

이제 개발자 포털로 이동하여 커밋을 확인하세요! 개발자 포털의 앱 프로젝트 페이지에서 팀 서버를 클릭하여 모든 커밋을 확인합니다. 마지막 커밋이기 때문에 커밋이 맨 위에 있습니다.

커밋에 대한 세부 정보를 클릭하면 리비전 보기 페이지로 이동하여 리비전의 세부 정보를 자세히 읽을 수 있습니다.

Mendix Studio Pro로 돌아가서 스토리 창을 엽니다. 현재 사용자 스토리를 완료로 설정합니다.

축하합니다! 다음 강의로 넘어가서 지미와 선생님들의 삶을 더욱 편리하게 만들어 줄 자동화를 몇 가지 더 추가해 보겠습니다.

7.8 총 등록 수 자동으로 계산하기


다음 사용자 사례에 설명된 대로 Jimmy는 사용자 지정 로직에 대한 마지막 요청이 있습니다: 교사로서 교육 이벤트에 참석하는 교육생 수를 언제든지 확인할 수 있어 필요한 리소스를 파악할 수 있기를 원합니다.

각 교육 이벤트에는 최대 12명의 교육생을 수용할 수 있습니다. 하지만 교육에 참석하는 교육생이 6명밖에 되지 않는데 강사가 항상 12명분의 점심을 주문하거나 유인물을 준비한다면 비용 낭비가 될 수 있습니다. 따라서 교사가 각 교육 이벤트에 등록한 인원을 쉽게 확인할 수 있다면 매우 유용할 것입니다.

이 기능을 구축하려면 지난 이야기와 마찬가지로 몇 가지 단계를 거쳐야 합니다:

앱에서 정보를 볼 수 있는지 확인합니다.

등록 수를 계산할 시점을 결정합니다.

총 등록 수를 계산하는 마이크로플로우를 구축합니다.

작업을 배포하고 테스트합니다.

변경 사항을 팀 서버에 커밋합니다.

다음 강의에서 저장된 속성과 계산된 속성의 차이점에 대해 자세히 알아보세요!

 

7.9 저장된 속성과 계산된 속성

앱에 새로운 동적 정보인 교육 이벤트당 총 등록 수를 표시하려고 합니다. 앱에서 동적 정보를 표시하려면 도메인 모델에 속성으로 표시해야 합니다. 이 경우 총 등록 횟수는 각 교육 이벤트에 대한 정보를 제공하므로 새 속성을 TrainingEvent 엔티티에 추가합니다. 이 새 속성의 좋은 이름은 총 등록 횟수이며 데이터 유형은 Integer입니다. 등록이 1건, 7건, 12건일 수는 있지만 1.5건, 8건, 3/4건일 수는 없으므로 정수가 완벽할 것입니다.

한 가지 더 중요한 결정이 있는데, 이 속성을 저장된 속성으로 사용할지 계산된 속성으로 사용할지 결정해야 합니다. 저장된 속성의 값은 데이터베이스에 저장됩니다. 계산된 속성의 값은 클라이언트에 표시될 때마다 즉석에서 결정됩니다. 계산은 마이크로플로우에 의해 수행됩니다. 이 마이크로플로는 사용자가 앱에서 값을 보거나 사용할 때마다 트리거됩니다.

계산된 속성과 저장된 속성 중 어느 것을 사용할지 결정할 때의 경험 법칙은 다음과 같습니다. 값이 보는 빈도보다 자주 변경되는 경우 계산된 속성으로 설정합니다. 값이 변경되는 횟수보다 자주 보는 횟수가 더 많으면 데이터베이스에 저장합니다. 이렇게 하면 값을 정확하게 유지하는 데 필요한 계산 횟수가 줄어듭니다.

계산된 속성의 좋은 예는 앱에서 최신 환율을 표시하려는 경우입니다. 이러한 값은 항상 변경되지만 사용자가 매초마다 모니터링하지는 않을 것입니다. 그렇기 때문에 이를 계산된 속성으로 만드는 것이 좋습니다. 이제 총 등록 횟수 속성에 대해 어떻게 작동하는지 살펴보겠습니다.

앞서 설명한 것처럼 교육 이벤트에는 최대 12명까지 참석할 수 있습니다. 완전히 예약된 교육 이벤트의 경우 총 등록자 수가 12번 변경된다는 의미입니다. 교육생 중 소수가 등록을 취소하고 다른 교육생이 대신 등록한다고 가정해 보겠습니다. 그러면 총 등록 횟수가 최대 16~20회 변경된다는 뜻입니다. 앱을 사용하는 교사가 이 정보를 20회 이상 볼 수 있나요? 교육 이벤트 개체의 수명 동안에는 그럴 가능성이 매우 높으므로 이 경우 총 등록 횟수는 저장된 속성이 되어야 합니다.

 

7.9.1 새 속성 추가

계속해서 TrainingEvent 엔티티에 총 등록 횟수 속성을 추가합니다. 이전 강의에서 설명한 대로, 이 속성은 Integer 유형의 저장된 속성이어야 합니다.

이 속성은 앱의 교사에게도 표시되어야 합니다. 이를 위한 좋은 위치는 TrainingEvent_Overview 페이지입니다. 이렇게 하면 교사가 일정을 볼 때 각 교육 이벤트에 등록된 사람 수를 즉시 확인할 수 있습니다. TrainingEvent_Overview 페이지를 열고 목록 보기에 속성을 추가합니다. 도구 상자에서 {.../이름} 아래에 텍스트 위젯을 추가합니다. 위젯을 두 번 클릭하여 속성을 엽니다. 맨 위에 있는 편집 버튼을 클릭하여 캡션을 편집합니다.  

새로 만들기를 클릭하여 새 매개변수(동적 텍스트)를 추가합니다. 총 등록 횟수 속성을 선택합니다.

캡션은 교사에게 표시되는 텍스트입니다. 텍스트를 등록 수로 바꿉니다: {1}. 1}은 총 등록 수 매개변수로 대체됩니다.

마지막에 표시되는 모습은 다음과 같습니다:

7.10 객체 이벤트 핸들러


데이터베이스에 총 등록 수를 저장하기로 결정했습니다. 이제 이 숫자가 언제 변경되는지, 즉 언제 계산하여 데이터베이스에 저장할 것인지 결정해야 합니다. 교육 이벤트의 총 등록 수는 언제 변경되나요? 시스템에 새 등록이 추가되거나 기존 등록이 삭제될 때입니다! 그리고 일부 경우에만 그런 것이 아닙니다. 등록이 추가되거나 삭제될 때마다 총 등록 수를 다시 계산해야 합니다.  

마이크로 플로우를 트리거하는 버튼을 만드는 방법은 이미 알고 계실 것입니다. 이 사용자 스토리에 대한 로직을 사용자 지정 저장 및 사용자 지정 삭제 버튼에 추가할 수 있습니다. 교사가 등록을 추가하거나 삭제할 때마다 총 수가 다시 계산됩니다. 그러나 자동화된 프로세스에서 등록을 삭제하는 경우(예: 등록이 속한 연수생이 삭제된 경우) 해당 특정 버튼이 클릭되지 않으므로 재계산이 발생하지 않습니다. 즉, 사용자 지정 버튼은 이 문제에 대한 최선의 해결책이 아닙니다. 객체 이벤트 핸들러가 필요합니다!

객체 이벤트 핸들러는 이벤트가 발생할 때까지 기다리면서 앱을 "수신"합니다. 객체에 발생할 수 있는 네 가지 이벤트는 객체가 생성, 커밋, 삭제 또는 롤백(저장하기 전에 취소)될 때입니다. 그런 다음 이벤트가 실행되기 전 또는 후에 트리거할 수 있는 마이크로플로우를 선택할 수 있습니다. 현재 사용자 스토리의 경우 커밋 후 및 삭제 후 개체 이벤트 핸들러가 필요합니다. 이렇게 하면 등록이 저장된 후와 등록이 삭제된 후에 숫자가 업데이트됩니다. 객체 이벤트 처리기는 이벤트가 발생하는 엔티티를 통해 도메인 모델에 추가됩니다. 이 경우에는 등록 엔티티입니다.  

다음 강의의 지침에 따라 앱에 객체 이벤트 핸들러를 추가하는 방법을 알아보세요!

 

7.10.1 개체 이벤트 핸들러 추가

두 개의 객체 이벤트 핸들러가 필요합니다. 하나는 커밋 후용이고 다른 하나는 등록 삭제 후용입니다. 두 개체 이벤트 핸들러 모두 곧 생성할 동일한 마이크로플로우를 사용합니다. 로직을 재사용하면 나중에 앱을 더 쉽게 유지 관리할 수 있으므로 가능하면 로직을 재사용하는 것이 가장 좋습니다. 두 이벤트 핸들러가 동일한 마이크로플로우를 트리거하도록 하면 앱의 내부 작동을 단순화할 수 있습니다!

도메인 모델을 열고 등록 엔티티를 두 번 클릭합니다. 네 번째 탭은 이벤트 핸들러 탭입니다. 이 탭을 열고 새로 만들기를 클릭하여 새 이벤트 핸들러를 추가합니다.

먼저 커밋 후 오브젝트 이벤트 핸들러를 설정합니다. 모멘트를 After로 설정하고 이벤트를 커밋으로 설정합니다. 선택을 클릭하여 트리거할 마이크로플로우를 선택합니다.

새로 만들기를 클릭하여 새 마이크로플로우를 만듭니다. 이제 이 마이크로플로우에 좋은 이름을 정해야 합니다. 이름 지정 규칙인 접두사_엔티티_작업을 기억하시나요?

이것이 개체 이벤트 핸들러의 접두사입니다:

  Before After
Create BCR ACR
Commit BCO ACO
Rollback BRO ARO
Delete BDE ADE

이 마이크로플로는 커밋 후와 삭제 후 시나리오에 모두 사용되므로 다음과 같이 이름에 접두사를 모두 추가합니다: ACO_ADE_Registration_SetTotalNumberOfRegistration.

이 화면과 다음 화면에서 확인을 클릭하여 프로세스를 완료합니다.

이제 이 단계를 반복하여 삭제 후 개체 이벤트 핸들러를 추가하되, 새 마이크로플로우를 만드는 대신 방금 만든 ACO_ADE_Registration_SetTotalNumberOfRegistrations 마이크로플로우를 선택합니다.

등록 엔티티의 속성 창을 닫고 도메인 모델에서 엔티티를 확인합니다. 엔터티 이름 왼쪽에 번개 모양이 있는 것이 보이시나요? 이것은 이 엔티티에 하나 이상의 개체 이벤트 핸들러가 있음을 알려줍니다.

7.10.2 등록 목록 만들기

ACO_ADE_Registration_SetTotalNumberOfRegistrations 마이크로플로우를 엽니다. 입력 매개변수가 Registration 유형인 빈 마이크로플로우입니다. 이것은 방금 커밋되거나 삭제된 등록이 될 것입니다. 이 마이크로플로우를 구축하기 위한 계획을 수립해 봅시다:

이 마이크로플로우의 최종 결과는 방금 커밋되거나 삭제된 등록을 소유하는 TrainingEvent 개체에 총 등록 수를 저장하는 것입니다. 또한 업데이트된 값을 클라이언트(이 경우 교육 이벤트 개요 페이지)에 표시하려고 합니다.

해당 교육 이벤트 개체, 더 구체적으로 총 등록 수 속성은 아직 마이크로플로우의 범위에 속하지 않으므로 이를 검색해야 합니다. 등록 개체가 데이터베이스에서 방금 삭제된 경우 TrainingEvent에 대한 연결도 더 이상 데이터베이스에 존재하지 않으므로 이 검색은 연관을 통해 이루어져야 합니다. 그러나 이 마이크로플로우의 입력 매개변수에는 여전히 존재합니다.

범위에서 TrainingEvent를 가져오려면 마이크로플로우의 시작 이벤트 바로 뒤에 새 활동을 추가합니다. 유형을 검색으로, 소스를 연결 기준으로 설정하고 등록 엔티티에서 등록_훈련이벤트 연결을 선택합니다.

각 교육 이벤트의 등록 횟수를 저장하려면 종료 이벤트 직전에 새 활동을 추가합니다. 유형을 개체 변경으로 설정하고 변수 목록에서 TrainingEvent를 선택합니다. 새로 만들기를 클릭하고 총 등록 횟수 속성을 선택합니다.  값을 $Count로 입력합니다(아직 작동하지 않지만 곧 이 변수를 만들 예정이므로 걱정하지 마세요). 또한 커밋을 예로 설정하지 않으면 앱이 닫힐 때 계산 중인 새 값이 손실됩니다.

이제 마이크로플로우의 시작과 끝이 생겼지만 아직 아무 것도 수행하지 않습니다. 다음에 해야 할 일은 총 등록 횟수를 결정하고 이를 TrainingEvent 객체의 속성에 대한 새 값으로 설정하는 것입니다.

마이크로플로우에서는 After Commit 또는 After Delete 개체 이벤트 핸들러가 트리거되었는지 여부를 알 수 없으므로 단순한 +1 또는 -1 솔루션을 사용할 수 없습니다. 대신 매번 이 TrainingEvent에 속하는 모든 등록을 계산해야 합니다. 하지만 아직 마이크로플로우의 범위에 모든 등록이 있는 것이 아니라 방금 커밋되거나 삭제된 등록만 있습니다. 이 데이터를 어떻게 얻을 수 있을까요? 바로 또 다른 검색을 수행하면 됩니다!

메모리에 생성되었지만 아직 데이터베이스에 없는 개체를 일시적 개체라고 합니다. 연결 기준 검색을 수행하면 데이터베이스의 모든 정보와 메모리에서 사용할 수 있는 임시 개체에 액세스할 수 있습니다. 지금은 이러한 커밋되지 않은 일시적 객체가 계산되지 않기를 원합니다! 아직 작성 중이고 취소될 수 있는 등록이 아니라 데이터베이스에 저장된 최종 등록만 계산하고 싶을 것입니다. 데이터베이스에서 검색을 수행해야 합니다!

첫 번째 검색 활동 바로 뒤에 검색 활동을 마이크로플로우에 추가합니다. 소스를 데이터베이스에서로 설정합니다. 선택을 클릭하여 검색할 엔티티를 선택합니다.

다음 이미지에서 등록 엔티티를 선택할 수 있는 두 가지 옵션이 있음을 알 수 있습니다. 하나는 선택 창의 아래쪽(MyFirstModule 아래)에 있는 옵션이고 다른 하나는 창 위쪽의 TrainingEvent 변수에 중첩되어 있는 옵션입니다. 하단 옵션을 사용하면 전체 데이터베이스에 존재하는 모든 등록을 가져올 수 있습니다. 여기서 원하는 것은 이 TrainingEvent에 속한 등록만 원하는 것이 아닙니다. 그렇기 때문에 화면 상단의 중첩 옵션을 사용하여 이 교육 이벤트에 연결된 등록만 가져와야 합니다. .

목록 이름은 등록 목록이므로 자동으로 RegistrationList로 설정됩니다. 마지막 단계는 등록 수를 계산하고 개체 변경 활동에서 TotalNumberOfRegistration 속성의 값을 이 값으로 설정하는 것입니다. 집계 목록 활동이라는 활동(놀랍게도!)을 통해 카운트가 수행됩니다. 두 번째 검색 후 개체 변경 전에 마이크로플로우에 새 활동을 추가합니다. 활동 유형을 목록 집계로 설정합니다. 다음 설정을 사용하여 활동을 구성합니다:

이제 마이크로플로우가 다음과 같이 보일 것입니다:

기능 실행 및 테스트
축하합니다, 기능을 구축했습니다! 이제 실제로 작동하는지 확인할 시간입니다! 앱을 실행하고 교육 이벤트에 몇 번의 등록을 추가하여 작동하는지 확인해 보세요.

도메인 모델을 변경했기 때문에 데이터베이스를 동기화하라는 메시지가 표시될 수 있습니다. 메시지가 표시되면 동기화를 진행합니다.

작업 커밋
앱에 몇 가지 등록을 추가한 후에는 새 기능을 팀 서버에 커밋합니다. 또한 사용자 스토리를 완료로 설정합니다. 잘하고 계십니다!

 

로직 봇으로 실험하기
모듈 5의 멘딕스 어시스트 로직 봇을 기억하시나요? 이제 한 걸음 물러나서 로직 봇이 무엇을 할 수 있는지 살펴보기에 완벽한 시기입니다. 이 마이크로플로우를 작성하기 시작하면서 이미 무엇을 하고 싶은지에 대한 아이디어가 있다고 상상해 보세요. 로직 봇을 사용하면 이 과정을 훨씬 더 빠르고 쉽게 진행할 수 있습니다. 한번 사용해 보세요!

앱 탐색기에서 방금 작성한 마이크로플로우를 마우스 오른쪽 버튼으로 클릭하고 복제를 클릭합니다. 그러면 두 번째 마이크로플로우가 만들어집니다.
네 가지 활동을 모두 삭제합니다. 매개변수를 그대로 둡니다.
아직 켜져 있지 않은 경우 마이크로플로우 편집 창의 오른쪽 상단에 있는 스위치를 사용하여 MxAssist를 켭니다. 편집 > 환경설정으로 이동하여 찾을 수도 있습니다.

마이크로플로우 중앙에 있는 MxAssist 점을 클릭합니다. 방금 전에 만든 마이크로플로우와 동일한 마이크로플로우를 만들고 싶지만, 어시스트를 사용하면 쉽게 만들 수 있습니다. 먼저 교육 이벤트를 검색하려고 합니다. 트레이닝 이벤트가 보이면 해당 옵션을 선택하세요!

다음으로 해당 등록에 속한 등록을 검색합니다. 이 경우에는 어시스트가 활동을 가져온 후에 추가로 구성해야 합니다. 이전과 마찬가지로 등록 목록을 가져와야 합니다.

셋째, 숫자를 세어야 하죠? MxAssist가 도와드립니다:

마지막으로 TrainingEvent에서 총 등록 횟수를 설정합니다. 다시 말하지만, MxAssist는 올바른 활동을 가져올 것이지만 Commit을 설정하고 $Count를 사용하여 Member를 올바르게 설정해야 합니다.

이제 완전히 동일한 마이크로 플로우를 갖게 되었지만 훨씬 더 적은 노력이 필요했습니다. 약간 일방적이지만 이 역시 수정할 수 있습니다. 시작 이벤트에서 종료 이벤트까지의 흐름을 강조 표시하고 강조 표시된 활동 중 하나를 마우스 오른쪽 버튼으로 클릭한 다음 가로로 배포를 선택합니다. 훨씬 보기 좋아졌습니다!

MxAssist 탐색을 마친 후에는 앱 탐색기에서 이 중복 마이크로플로우를 마우스 오른쪽 버튼으로 클릭하고 삭제를 선택하여 자유롭게 삭제할 수 있습니다.

 

요약
이 모듈에서는 앱 내에서 특정 프로세스를 자동화하는 방법을 배웠습니다. 구체적으로 학습한 내용은 다음과 같습니다:

다른 입력 데이터를 기반으로 필드를 자동으로 채우는 방법

입력 위젯에서 마이크로플로우를 트리거하는 방법

마이크로 플로우 표현식을 사용하는 방법

객체가 마이크로플로우의 범위에 포함된다는 것의 의미

두 가지 유형의 검색을 사용하는 방법 및 시기

오류를 분석하는 방법

의사 결정 사용 시기

제한된 개체 목록을 검색하는 방법

객체 목록을 계산하는 방법

저장된 속성과 계산된 속성의 차이점

객체 이벤트 핸들러 사용 방법

MxAssist 로직 봇 사용 방법
축하합니다! 사용자들은 여러분이 만든 개선 사항에 만족할 것입니다! 다음 모듈로 이동하여 사용자가 추가할 수 있는 모든 데이터가 일관되고 유효한지 확인하는 방법을 알아보세요!

https://academy.mendix.com/link/modules/94/lectures/757/7.11-Summary

 

Mendix

 

academy.mendix.com

 

반응형