지난 2주간의 PoC를 진행하면서, 직접 작업을 해 보고 워크플로우를 작성해 보며 개인적으로 정리를 해 두면 괜찮을 것 같은 내용 위주로 정리를 해 볼까 합니다. 이번에는 지난 포스팅과는 달리 세부적이고 구체적인 예시와 그렇게 구현한 이유나 장단점등을 정리 해 보고자 합니다.

 

또한 PoC뿐 아니라 UiPath 작업을 위해 필요한 숙제라고 할만한 그런 내용은 팁 이후에 정리를 해 보겠습니다.

 

먼저 이번에 작업하며 남길만 한 Tip 3가지는 아래와 같습니다.

 

 

1. 편리한 테스트 환경 구축하기

2. 무한 반복에 대한 처리하기

3. 안전한 예외처리와 재시도하기

 

 

먼저 1. 편리한 테스트 환경 구축하기

 

 위의 항목은 실제 구현에 있어서는 2~3개 정도의 작업을 진행하였습니다. 주로 1차 PoC에서 작업을 하였고, 1차 PoC의 경우 무한반복을 하며, 로그를 통해 각 워크플로우에서의 소요시간을 계산해야 하는 요구사항이 있었습니다.

아직 UiPath를 다뤄본 경험이 많지 않았기 때문에 프로그밍에서의 블록의 소요시간을 측정하는 것과 같이 작업의 시작단계에서 시작시간을 받아오고 (Assign을 통해서 현재시간을 받아옴) 작업의 종료(예외 발생 포함) 시 종료시간을 받아온 후 그 두 시점의 차이로 소요시간을 계산하여 로그로 남기는 작업을 하였습니다.

 

 로그를 남기는 것은 결국 파일에 대한 작업인데, 하나의 파일에 로그를 계속 쌓아서 이력을 남기기 위해 프로그래밍 함수인 AppendText와 같이 Append 작업을 할 수 있는 방법을 찾아야 했습니다. 이하 작업내용은 지난 PoC의 나름 최선책이었으나 추가로 작업을 해야 하는 숙제와 같은 부분이기도 합니다. 먼저 Log를 어떤 형태(문자열의 형식)로 남겨달라는 요청이 명확하여, 로그 발생 시간, 해당 시나리오의 소요시간, 사용한 Site 등의 정보를 남기며, 작업 완료 시 매번 다음행에 추가를 하였습니다. Text파일에 내용을 추가하기 위해 Read Text File Write Text File을 통해서 항상 읽어오고 그 문자열을 변수로 받은 후 새로 발생한 로그 행을 문자열로 가장 마지막 줄에 더하여 파일에 다시 썼습니다. 내용이 많지 않은 경우에는 큰 문제가 없었으나, 시작 시점이 종료 시점보다 더 늦은 시점으로 남아 소요시간이 -값이 나오거나 로그 발생 카운트를 하였을 때 21번이 22번보다 뒤에 출력되는 등의 플로우상에서는 발생하지 않을 것 같은 문제들이 발생하였습니다.

 또한 해당 고객사의 자동 문서보안 솔루션 때문인지 파일을 쓸 때 동시에 보안 작업이 걸렸는지 파일이 1번 암호화되어 읽히지 않고 깨져있는 Text가 남아있던 경우가 발생하였습니다. 이러한 경우를 피하기 위해서 Invoke Code를 통해서 프로그래밍으로 Append작업을 하는 코드를 작성하여 추가하는 방식으로 작업을 할 수 있다는 것을 봤습니다.

 

 

 

 

2. 무한 반복에 대한 처리하기

 

우선, 무한히 반복하게 하는 방법도 한 가지가 아니라는 것, 당연히 Activity이름만 보고도 While을 사용하여 무한히 반복시키면 되겠다 싶었지만, Flowchart를 통해서도 충분히 가능했습니다. Flowchat의 마지막 노드가 끝난 후 작업의 처음, 또는 특정 지점으로 이동하면 해당 구간을 특별한 처리를 하지 않는 한 계속 수행하게 됩니다. While을 사용한 것보다 보기가 편하다고 팁을 주셔서 그렇게 작업을 했습니다.

 

 무한반복 작업이 요청사항이었지만 중단을 하고 싶은 경우 중단을 할 수 있도록 모니터링하여 예외처리를 통한 작업 중단을 하였습니다. Parallel이라는 Activity를 활용하여, 2가지의 (혹은 그 이상) 작업을 넣었습니다. 하나는 작업 시나리오를 구현한 워크플로우이고, 다른 하나는 특정 단축키의 입력을 탐지하여 워크플로우를 종료하는 모니터 이벤트를 넣었습니다. 

 

왼쪽에 보이는  Flowchart-S1_S3가 요청 시나리오였고, 반복 작업 과정에서 시간에 단위작업당 시나리오별로 20~30초 정도 소요가 되었는데, 중단하고 다시 테스트를 하고 싶은 경우 굉장히 불편하게 빠르게 스튜디오를 열어서 중지를 시켜야 하며, 화면이 다시 워크플로우 자동화 화면으로 넘어가 이 작업을 반복해야 하는 경우를 막을 수 있습니다. 물론 굳이 이렇게 구현을 하지 않고 중단을 저렇게 하는 것도 하나의 방법이긴 하겠습니다.

 

 

 

마지막으로 3. 안전한 예외처리와 재시도하기

 

 Try - Catch 문을 적절하게 사용하거나 Retry Scope를 활용하여 문제가 발생해도 워크플로우 전체가 중단되는 상황을 막아야 합니다. 이 부분에서 Try-Catch를 정말 컴퓨터를 의심하며 사용하여 성공한 경우는 Dynamic Selector를 활용하여 클릭을 하는데 해당 작업의 처리 과정 및 시간이 균일하지 않고, 50~80번 사이의 클릭 작업 후 1번 정도씩 클릭을 하지 않는 문제가 발생하였습니다. 그 문제를 처리하기 위해서 Try-Catch를 활용하여 Try문에 Click Activity를 그리고 Catch문에도 같은 Selector를 통한 Click이벤트를 넣었습니다. 클릭을 한번 못해서 Element를 찾지 못하는 예외가 발생하여 그 예외가 발생하는 경우 한번 더 클릭할 수 있도록 처리를 한 것이고, 그렇게 처리를 하자 17개의 검색어를 통한 크롤링 작업 과정에서 워크플로우가 예외로 중단되는 경우를 없앨 수 있었습니다. 

 그리고 문제가 발생해도 무한히 반복될 수 있도록, 전체 플로우를 Try문에 넣고, Catch문에는 예외 발생 로그만 남겨서 전체 플로우를 수행하는 중 문제가 발생하면 예외 기록을 하도록 작업을 한 후 해당 Try-Catch문이 종료되면 다시 해당 Try-Catch문이 수행되도록 Flow를 작성하여 두면 반복적으로 작업을 할 수 있습니다. 또한 그렇게 구성을 하였을 때 전체 플로우에서 가장 앞부분에 이전 포스팅에서 설명한 것과 같이 모든 브라우저나 관련 프로그램을 종료하는 등의 작업을 추가하여 안정성을 높인다면, 반복적으로 수행을 하는 것도 가능하며, 예외가 발생하여 정상종료가 되지 않는 경우에도 작업을 모두 안정적인 초기 상태(프로그램이나 브라우저가 열려있지 않은 상태)에서 프로세스의 진행이 가능합니다.

 

 

 

PoC를 진행하고 나니 위의 팁과는 달리 미리 준비가 되어있었으면 훨씬 편할 것 같은 작업과 있었으면 하는 Activity나 조금 더 학습/연구/테스트가 필요한 부분에 대해 몇 가지 정리를 해 두겠습니다.

 

있었으면 싶은 Activity 목록입니다.

 

1. Append Text File - 텍스트 파일을 읽어와 가장 마지막에 String을 추가하는 Activity

2. CheckDuration - 안에 Activity를 받아서 이 Activity안에 있는 Activity들의 총 수행 시간을 반환해주는 Activity

3. ZipFromFolder - 폴더 경로 안에 있는 모든 파일/폴더를 하나의 Zip 파일로 압축해주는 Activity

 

 

 

1. Append Text File

 

우선 각각 구현의 방법 또는  예상 구현 방법과 필요 이유에 대해 간단히 설명합니다. 먼저 Append Text File의 경우 이전에 포스팅에서 설명하였던 것처럼 파일에 입/출력하는 양이 많아지는 경우 확실하지는 않지만 문제가 발생하는 경우가 있었으며, 그러한 문제가 발생하지 않도록 하기 위해서라도 제작이 필요한 Activity입니다. 당장 해당 기능이 필요하다면 Invoke Code를 통해서도 작업을 할 수 있었습니다. 

 

 

2. CheckDuration

 

 이 Activity의 경우 요청사항이 시나리오 내부에서 각각의 단계에 소요시간을 알아야 하는 경우에는 보다 유용하게 사용할 수 있으며, 그렇지 않고 전체에 해당하는 프로세스 소요시간의 경우는 반복적으로 사용하지 않으므로 위에서 설명한 방법으로 한번 체크하여 구현을 하는 것이 더 효율적일 수 있습니다.. 하지만 이 Activity를 만들어 둔 다면 물론 그런 작업 필요 없이 한 번에 소요시간을 확인할 수 있습니다. 작성방법은 또한 몇몇 방법이 있겠지만 실제로 플로우에서 사용했던 것처럼 본 작업 전 시작시간을, 작업 종료나 예외 발생 후 종료시간을 받아 차이를 비교하고 반환해줄 수 있도록 작성을 하면 되겠습니다.

 

 

 

3. ZipFromFolder

 

 당장은 필요하지 않을 수 있지만 업무에 따라서 첨부파일을 모아 한번에 압축하여 전달하는 것과 같은 류의 작업에서는 이런 Activity가 존 제한 다면 훨씬 수월하게 작업을 할 수 있습니다. 물론, 고객사에 따라 보안 압축을 사용해야 한다거나 하는 경우에는 사용할 수 없는 Activity가 될 수 있지만 그래도 범용적으로 사용할 수 있는 여지가 충분한 Activity라고 생각합니다. 입력 폴더 경로와 출력 파일 경로를 받아서 입력받은 경로의 모든 파일을 압축하여 출력 파일을 만들어주는 작업을 할 수 있도록 만들면 되겠습니다.  

 

 

 

연구과제

 

연구과제라고 이름을 붙이기에는 과한 것도 모호한 것도 있지만, 추가적인 분석과 연구나 테스트가 필요한 항목들입니다.

 

1. Get Text 관련 Activity와 Get Attribute 

2. Dynamic Selector

3. Click 관련 Activity

 

 

 

1. Get Text 관련 Activity와 Get Attribute 

 

우선 Get Text와 관련된 Activity들입니다.

 

특정 Element에서 필요한 Text값을 받아와야 하는데, 이번에 2차 PoC를 진행하는 경우에 반복적으로 테스트를 했는데도 꼭 10~15번 정도에 1번씩 값을 받아오지 못하는 경우가 있었습니다.

 해당 문제가 발생한 시나리오는 게시판을 크롤링해야 하며, Dynamic Selector를 사용하여 구현하였기 때문에 페이지 수와 페이지당 표시되는 게시물의 건수, 그리고 마지막 페이지의 게시물 수만 정확하게 알고 있으면 수행에 문제가 없었습니다. 하지만, UiPath Studio에서도, 그리고 UiExplorer에서도 잘 잡혀 값을 받아오는데 꼭 가끔 한 번씩 문제가 있었습니다. 하필 문제가 발생하는 부분이 가장 단순하고 눈으로 보기에는 숫자 값인 텍스트로 다른 String 가공 처리도 할 필요가 없는데 값 자체를 받아오는 경우 종종 문제가 발생하였습니다.

 그래서 처리 한 방법은 각각의 Get Text, Get Full Text, Get Visible Text를 사용하고, 해당 값들 중 숫자로 변환 시도한 값이 0이 아닌 것을 사용하도록 처리하였습니다. 물론 모두 0이고 게시물 수 또한 0인 경우는 문제없이 정상적으로 게시물이 없는 경우로 판단하여 처리할 수 있었습니다. 

 

 

2. Dynamic Selector

 

반복적인 작업을 해야 하는데, UI의 간격이나 Table화 되지 않는 경우, Selector를 찾았는데 거기에 순차적인 id나 Index로 Selector들이 잡히는 경우에는 반복적인 작업을 위해서 Selector값 안의 Index를 순차적으로 늘리거나 줄여가면서 반복적으로 활용을 할 수 있습니다. 이때 Selector에 Wildcard를 적절히 활용하여 Index를 통해서 Selector가 순차적으로 잘 잡히는지 확인을 한 후 해당 XML 꼴의 Selector String을 변수에 넣어 작업을 하였습니다. 하지만 이상하게도, 한 번에 변수로 잡은 Index를 중간에 넣어 문자열을 조합하면 Error가 발생하고, Assign문을 2번 활용하여 작업을 하면 문제가 생기지 않아서 그렇게 작업을 하였습니다. 

 

 

3. Click 관련 Activity

 

Click도 위 1번의 Get Text관련 Activity와 같이 Click을 처리하기 위한 Activity들이 여러 개 있습니다.

 

Click의 경우 크게 3가지만 이번 PoC에서 사용을 하였습니다. Click, Click Text, Click Image이 3가지였습니다. 우선 PoC전에 짧게 배운 Tip에서는 가능하면 "절대로"라는 말까지 들어가며 Click Image를 사용하지 말라고 조언을 듣고 PoC를 시작하였습니다. 하지만 시나리오에 공인인증서 및 주민등록번호를 입력해야 하는 상황이 발생하였고, Type Into 및 Set Text로는 입력이 되지 않아서 가상 마우스를 활용한 클릭으로 입력방식을 구상하고 테스트를 하였습니다. 하지만 보안 입력 키보드의 경우 같은 자리에 인덱스가 붙고 문자들의 위치는 미세하게 임의로 공백(빈 문자)이 있어 해당 부분은 클릭을 해도 입력이 되지 않게 처리가 되어있어 Click이나 Click Text로도, 그리고 고정된 자리를 확인해주는 Index로 Dynamic Selector를 활용하여서도 처리가 되지 않는 경우가 있었습니다.

 이 경우는 그런데 의외로 Click Image가 굉장히 정상적으로 잘 동작했습니다. 물론 Element가 아닌 이미지를 찾아서인지 Click간격이 Element를 정확히 Selector로 지정할 수 있는 경우보다 오래 걸렸습니다. 미세하긴 하지만 최소 7~ 15자 정도 입력하는데 약 0.3초 정도 차이가 난다면 전체적으로 2~4.5초까지의 차이가 벌어지는 것을 조금이나마 체감을 할 수 있었습니다.

 

 

 

요즘 유독 좋아하지 않게 된 단어가 2개 있다면 '원래'와 '절대'입니다. 아직 경험도 많이 부족하고 실력도 부족하지만 그래도 그런 두 가지를 꾸준하게 키울 수 있던 바탕은 원래 그런 거다라는 말보다는 왜 그런지, 이유와 전후관계 상황 파악 등을 하고, 절대라는 말보다는 최대한 많은 방법을 시도해 보고 유연하게 대처할 수 있도록 생각하는 것들을 좋아하게 되어 그런 것 같습니다.

 

 

+ Recent posts