시작하기
Mendix에서 개발을 시작하기 전에 항상 사용자 스토리를 준비하는 것이 좋습니다. 이 경우 프로젝트 패키지와 사용자 스토리 모두 이 페이지 상단의 이 모듈의 리소스에서 찾을 수 있습니다. 둘 다 다운로드하세요. 이제 패키지를 가져와 보겠습니다!
1. 멘딕스 스튜디오 프로 버전 9.11.x를 열고 File > Import App Package…를 클릭한 다음 다운로드한 .mpk 파일을 선택합니다. 앱에 HolidayRequest와 같은 설명이 포함된 이름을 사용합니다.
이제 애플리케이션을 만들었으니 로깅을 추가해 보겠습니다!
로깅 설정
Mendix에서 로깅을 구현할 때는 모든 로그 메시지의 로그 노드 이름이 동일한지 확인해야 합니다. 이는 쉽게 확인할 수 있는 이름을 설정하면 가장 잘 수행할 수 있습니다. 많은 프로그래머가 상수를 떠올리지만 Mendix에서는 이것이 최선의 선택이 아닙니다.
Mendix의 상수는 애플리케이션을 배포하는 환경에 따라 변경되는 변수를 위한 것입니다. 예를 들어 애플리케이션을 Mendix 클라우드에 배포하는 경우 외부 데이터베이스에 액세스하는 설정이 자체 클라우드에 앱을 배포할 때와 다를 수 있습니다. 그러나 로그 노드 이름은 변경되지 않아야 합니다. 따라서 로그 노드 이름을 정의할 때는 열거형을 사용해야 합니다. 열거형은 Name이라는 레이블이 붙은 키와 Caption이라는 레이블이 붙은 값이 모두 문자열인 키-값 쌍입니다. 이렇게 하면 로그 노드 이름이 일관성을 유지할 수 있으며, 열거형을 사용하면 모듈의 모든 로그 노드를 찾기 쉬운 중앙 위치에 배치할 수 있다는 이점이 있습니다. 로그 노드 이름에는 열거형의 이름 부분을 활용하게 됩니다.
로그 노드 이름 정의하기
이제 로그 노드 이름 열거를 만들 차례입니다. Mendix Studio Pro에서 프로젝트에 다시 집중하세요.
- PublicHolidays 모듈을 마우스 오른쪽 버튼으로 클릭하고 Add other… > Enumeration를 클릭합니다. Enum_LogNodes라는 이름을 지정하고 확인을 클릭합니다.
- 새로 만들기를 클릭하여 열거형 값을 추가하고 캡션 및 이름에 PublicHolidays를 입력합니다.
3. OK를 클릭하여 새 열거형 값을 추가하고 다시 OK를 클릭하여 열거형을 저장합니다.
이제 로깅에 새로운 열거형을 사용해 보겠습니다!
정상 작동 중 로깅
애플리케이션이 언제 로깅해야 하고 어떤 정보를 포함해야 하는지를 결정하는 것은 개발자로서 내려야 하는 중요한 결정입니다. 너무 많은 정보로 인해 중요한 메시지가 가려질 수 있다는 사실과 정보 제공의 필요성 사이에서 균형을 맞춰야 합니다. 이를 달성하는 가장 좋은 방법은 로그 수준을 사용하여 런타임 중에 로그에 기록되는 정보의 양을 조정하는 것입니다. 자체 로그 메시지를 만들 때는 로그 수준과 그 설명을 잘 알고 있는 것이 중요합니다. 레벨에 대해 간단히 살펴보겠습니다:
- Critical: 심각한 문제가 발생하여 애플리케이션이 종료되었습니다.
- Error: 애플리케이션이 작업을 성공적으로 수행할 수 없었지만 복구할 수 있었습니다.
- Warning: 예상치 못한 문제가 발생하여 조사가 필요하지만 애플리케이션은 계속 정상적으로 작동할 수 있습니다.
- Info: 정보: 애플리케이션이 모니터링할 가치가 있는 작업을 수행했습니다.
- Debug: 진단에 도움이 될 수 있는 정보입니다.
- Trace: 추적: 앱이 수행한 각 단계를 자세히 설명하는 정보입니다.
생성한 앱의 첫 번째 작업은 개발자가 애플리케이션의 정상적인 작동을 추적하는 로깅 도구를 설정할 수 있도록 Info 수준에서 로그 메시지를 추가하는 것입니다. 애플리케이션의 맥락에서 이것은 외부 API에서 공휴일을 성공적으로 검색하는 것입니다.
Mendix에서 로깅은 로그 메시지 활동을 사용하여 수행됩니다. Microflow 도구 상자의 로깅 활동 아래에서 찾을 수 있습니다. 이 활동은 사용 중인 로그 수준을 보여줍니다. 아래에서 6개의 로그 활동을 볼 수 있으며, 각 활동의 캡션에 로그 수준이 표시됩니다. 다른 활동과 마찬가지로 캡션을 편집할 수 있습니다. 수정한 후에는 로그 수준이 자동으로 업데이트되지 않습니다.
로그 활동을 더블클릭하면 속성 화면이 표시됩니다. 로그 수준, 로그 노드 이름 및 메시지를 설정할 수 있습니다. 템플릿 상자에 메시지를 추가할 수 있습니다.
로그 수준 드롭다운 상자를 클릭하면 사용 가능한 모든 로그 수준이 표시됩니다. 로그 메시지당 하나의 로그 수준만 선택할 수 있습니다. 각 로그 수준에는 이전 로그 수준의 모든 메시지가 포함된다는 점을 기억하세요. 로그 활동에서 수준은 역순으로 표시되며, 맨 위에는 Trace , 맨 아래에는 Critical이 표시됩니다. 하지만 이는 로그 수준 작동 방식에는 영향을 미치지 않으며, 모든 중요 로그 메시지는 여전히 Error 로그 수준에 포함됩니다.
로그 노드 이름 오른쪽에 있는 Edit… 버튼을 클릭하면 어떤 로그 노드 이름을 사용할지 정의할 수 있습니다. 이 모듈의 시작 부분에서 설명한 대로 열거형 이름을 사용하게 됩니다. 표현식 편집기에서 getKey() 함수를 사용하여 이름을 검색할 수 있습니다. 식 편집기에서 Ctrl+스페이스는 자동 완성 기능을 제공한다는 점을 기억하세요. 모듈, 열거형 또는 열거형에 사용한 이름을 잊어버렸을 때 유용하게 사용할 수 있습니다.
모든 이론을 이해했으니 이제 첫 번째 로그 메시지를 작성할 차례입니다.
로그 노드 초기화하기
로그 노드는 동적으로 등록되므로 로그 노드도 등록해야 합니다. 이 작업은 모듈의 각 로그 노드에 대한 메시지를 기록하는 하위 마이크로플로우를 생성하여 수행합니다. 그런 다음 이 마이크로플로우를 시작 후 마이크로플로우에서 호출해야 합니다. 일반적으로 시작 후 마이크로플로는 다른 용도로도 사용되므로 로그 노드 등록을 위해 별도의 마이크로플로를 만드는 것이 가장 좋습니다.
시작 후 마이크로플로우에 로그 노드를 등록하지 않으면 첫 번째 로그 메시지가 기록될 때까지 로그 노드를 사용할 수 없습니다. 이렇게 하면 애플리케이션을 디버깅할 때 로그 수준을 변경하기 어렵고 로그 메시지가 손실될 수 있습니다.
1. 프로젝트에 SUB_RegisterLogNodes라는 이름의 마이크로플로우를 추가하고 마이크로플로우에 로그 메시지 활동을 추가합니다.
2. Log activity을 두 번 클릭하고 아래 스크린샷에 따라 로그 수준, 로그 노드 이름 및 템플릿을 설정합니다.
3. 앱에 ASU_PublicHolidays라는 이름의 마이크로플로우를 추가합니다. ASU_PublicHolidays 마이크로플로우의 반환 유형을 부울 참값으로 설정해야 합니다. 그런 다음 프로젝트에서 Settings 을 클릭하고 Runtime 탭으로 전환합니다. 새 마이크로플로우를 After Startup 마이크로플로우로 선택합니다.
4. Microflow call activity 을 사용하여 ASU_PublicHolidays 마이크로플로우에서 SUB_RegisterLogNodes를 호출합니다.
이제 프로젝트 로깅을 시작할 준비가 되었습니다.
첫 번째 정보 로그 메시지 만들기
이론을 실천에 옮길 시간입니다. 첫 번째 로그 메시지는 API에서 공휴일을 검색한 국가 수와 기간을 기록합니다. 이를 통해 애플리케이션 운영자는 이 모듈의 동작을 모니터링할 수 있습니다. 정상적으로 작동하는 동안 애플리케이션 운영자는 모듈이 정기적으로 검색을 수행하기를 기대할 것입니다.
1. ACT_ImportHolidays 마이크로플로우를 열고 End 이벤트 바로 전에 Agregate list activity를 추가합니다. AvailableCountryList에서 국가 수를 계산하고 변수 이름을 NumberOfCountries로 설정합니다.
2. Aggregate list activity와 End 이벤트 사이에 Log message activity를 추가합니다. 로그 수준을 Info로 설정하고 로그 노드 이름, 템플릿 및 매개 변수를 아래 스크린샷의 값으로 설정합니다. 완료했으면 확인을 클릭합니다.
3. 로컬에서 실행을 클릭하고 앱 보기를 클릭합니다. 앱이 로드되면 사용 가능한 국가 가져오기를 클릭합니다. 그러면 API에서 사용 가능한 모든 국가가 검색됩니다.
4. 사용 가능한 국가를 클릭하면 가져온 모든 국가가 표시됩니다.
5. 국가 중 하나 이상의 Import holidays 열 값을 아니요에서 예로 변경합니다. 해당 행의 아니요를 클릭하여 예로 변경한 다음 다른 곳을 클릭하여 변경 사항을 저장합니다.
6. Import All Holidays 를 클릭하고 원하는 경우 시작 연도와 종료 연도를 변경한 다음 가져오기를 누릅니다. 앱에서 API에서 공휴일을 가져올 것인지 확인하라는 메시지가 표시됩니다. 계속을 클릭합니다.
7. Studio Pro로 전환하고 콘솔을 확인합니다. 아래 스크린샷과 같이 콘솔에 새 PublicHolidays 로그 노드의 로그 메시지가 표시되어야 합니다.
첫 번째 로그 메시지를 구성하셨군요, 수고하셨습니다. 이제 애플리케이션에 로그 메시지를 몇 개 더 추가하여 문제가 발생하는 개발자를 도울 차례입니다!
오류 로깅
정상 작업에 대한 로깅을 구성했으니 이제 오류를 로깅할 차례입니다. 로그 수준을 다시 생각해 보면 여기에는 몇 가지 옵션이 있습니다: Critical, Error 및 Warning입니다. 각 옵션에 대한 설명을 다시 한 번 살펴보겠습니다:
- Critical: 심각한 문제가 발생하여 애플리케이션이 종료되었습니다.
- Error: 애플리케이션이 작업을 성공적으로 수행할 수 없었지만 복구할 수 있었습니다.
- Warning: 예상치 못한 문제가 발생하여 조사가 필요하지만 애플리케이션은 계속 정상적으로 작동할 수 있습니다.
고객 애플리케이션의 PublicHolidays 모듈이 중요하지만, 시스템에서 특정 국가의 공휴일을 검색할 수 없는 경우에도 휴가를 요청할 수 있습니다. 사람들은 요청하는 날짜가 실제로 근무일인지 아닌지 비판적으로 살펴봐야 하지만, 그렇다고 해서 요청을 제출하는 것을 막을 수는 없습니다. 이 특별한 경우에는 'Critical '은 지나친 것으로 보이며 'Warning'는 충분히 심각하지 않습니다. 시스템에서 공휴일을 검색할 수 없는 경우 애플리케이션 운영자의 즉각적인 조치가 필요합니다. 따라서 다음 연습에서는 Error 로그 수준을 사용하게 됩니다.
REST 호출에 오류 로그 추가하기
이 프로젝트에는 REST 호출을 수행하는 4개의 마이크로플로우가 포함되어 있습니다. 모두 접두사 CRS_를 사용합니다. 각 REST 호출에는 오류 처리가 롤백이 있는 사용자 지정으로 설정되어 있으며 오류 흐름이 정의되어 있습니다. 그러나 오류 흐름은 아무 작업도 수행하지 않습니다. 이상적인 경우에는 오류 흐름이 무언가를 기록하여 애플리케이션 운영자가 무언가 실패했음을 인식하고 적절한 조치를 취할 수 있도록 하는 것이 좋습니다. 이것이 다음 과제가 될 것입니다. 네 개의 마이크로 플로우 모두 로그 메시지가 필요하므로 이러한 모든 마이크로 플로우에 대해 다음 지침을 반복해야 합니다.
1. CRS_AvailableCountries 마이크로플로우를 열고 오류 흐름에 로그 메시지 활동을 추가합니다.
2. 아래 스크린샷에 따라 로그 수준, 로그 노드 이름 및 템플릿을 설정합니다. 매개변수에는 $latestHttpResponse 변수를 사용합니다. 디버깅에 도움이 되도록 Include latest stack을 예로 설정하세요.
$latestHttpResponse 변수를 사용하면 반환된 오류 코드, 이 코드에 속하는 응답 구문 및 응답 내용에 액세스할 수 있습니다. 매개변수가 비어 있는 경우 매개변수 주위에 따옴표를 사용하는 것이 좋습니다. 이렇게 하면 누락된 부분이 있는지 확인할 수 있습니다.
3. CRS_NextPublicHoliday, CRS_NextPublicHolidayWorldwide 및 CRS_PublicHolidays에 대해 이 단계를 반복합니다. 프로 팁: 첫 번째 마이크로플로우에서 로그 메시지 활동을 복사하여 세 개의 마이크로플로우 각각에 붙여넣을 수 있습니다. 그런 다음 흐름으로 드래그합니다.
이제 로깅을 위한 모든 마이크로플로우를 설정했으니 새 로그 메시지를 확인하고 싶을 것입니다. 하지만 API가 실패하지 않는 한 애플리케이션이 로그 메시지 활동에 도달할 이유가 없습니다. 물론 치명적인 오류를 시뮬레이션할 수는 있습니다. CRS_NextPublicHolidayWorldwide 마이크로플로우에 치명적인 결함이 있는 것으로 구성되었습니다. 이를 트리거하기만 하면 됩니다.
4. navigation 메뉴에 CRS_NextPublicHolidayWorldwide 마이크로플로우를 추가합니다. 별표 아이콘과 Get Next Public Holiday Worldwide 라고 캡션에 입력합니다. 프로젝트를 로컬에서 실행하고 마이크로플로우를 트리거합니다. 콘솔의 오류 메시지를 사용하여 이 마이크로플로우의 심각한 오류를 수정합니다.
애플리케이션에서 오류 처리를 구현하는 데 수고하셨습니다! 애플리케이션 운영자가 앱의 이 부분을 관리하는 데 정말 도움이 됩니다. 하지만 여기서 멈추지 말고 다른 프로젝트의 동료가 이 모듈을 사용한다면 어떻게 해야 할까요? 그 동료를 어떻게 도울 수 있을까요? 다음 강의에서는 디버깅을 위한 로깅을 추가하는 방법에 대해 다뤄보겠습니다!
디버깅을 위한 로깅
문제가 발생했을 때 무엇을 기록할지 결정하는 것은 비교적 쉽지만, 디버깅을 위해 무엇을 기록할지 결정하는 것은 훨씬 더 어려울 수 있습니다. 다시 로그 레벨로 돌아가서 마지막 두 가지 레벨을 살펴보겠습니다:
- Debug: 진단에 도움이 될 수 있는 정보입니다.
- Trace: 앱이 수행한 각 단계를 자세히 설명하는 정보입니다.
이 모듈에서는 디버그 수준을 사용하겠습니다. 애플리케이션에서 어떤 일이 일어나고 있는지 확인할 수 있기 때문에 마이크로플로우에 추적 수준 로깅을 추가할 필요가 없는 경우가 많습니다. 애플리케이션이 복잡해지거나 Java 액션을 사용하는 경우 추적 로깅은 모듈에 익숙하지 않은 개발자에게 매우 유용할 수 있습니다.
단계별 로그
이 앱에 몇 가지 디버그 메시지를 추가해 보겠습니다. 마이크로플로우의 목표를 달성하기 위해 여러 단계가 필요한 더 복잡한 마이크로플로우에 이러한 유형의 로깅을 추가하는 것이 가장 좋습니다. 귀하의 애플리케이션에서는 ACT_ImportHolidays 마이크로플로우가 적합한 것으로 보입니다. 이미 해당 마이크로 플로우에 로깅을 추가했지만 많은 작업을 수행하는 마이크로 플로우에 비해 메시지 한 개는 다소 미미해 보입니다. 개발자가 어떤 국가와 연도가 검색되고 있는지 확인하는 것이 도움이 될 것입니다. 이렇게 하면 요청된 특정 국가 코드나 연도가 사용할 수 없거나 잘못된 경우 이를 쉽게 파악할 수 있습니다.
1. ACT_ImportHolidays를 열고 기존 Microflow call activity 앞에 Log message activity을 loop activity에 추가합니다.
2. 아래 스크린샷에 따라 Log message activity의 내용을 설정합니다.
3. 로컬에서 애플리케이션을 실행하고 휴일을 가져와서 새 로그 메시지를 시험해 보세요. 5.3.1 강의에서 이 작업을 수행하는 방법에 대한 몇 가지 팁을 제공합니다.
로그 메시지를 보셨나요? 그렇다면 새 로그 노드에 대해 디버깅할 로그 수준을 설정한 것을 기억하고 계셨군요. 로그 메시지를 보지 아래를 다시 설정 합니다.
4. 콘솔에서 Advanced > Set log levels…. 을 클릭합니다. PublicHolidays 로그 노드를 찾아 디버그로 설정합니다. 이제 일부 공휴일을 다시 가져와서 이번에는 로그 메시지가 표시되는지 확인합니다.