약 8분 읽기
안녕하세요, RPA 엔지니어 황민입니다. 오늘은 제가 겪었던, 어쩌면 많은 RPA 엔지니어분들이 한 번쯤은 마주했을 법한 난감한 상황에 대해 이야기해보려 합니다. 바로 UiPath 로봇이 분명히 작업을 완료했는데, 메일을 보내지 않은 경우입니다. 그것도 하루도 아니고, 116개의 PO(Purchase Order)를 처리하는 로봇이 96개는 정상적으로 처리했지만, 나머지 20개에 대한 결과 메일이 발송되지 않은 상황이었죠. 로그를 파고들고, 커피를 연거푸 들이키며 밤을 새웠던 그날의 경험을 솔직하게 풀어보겠습니다.
116개 중 20개, 왜 메일이 안 갔을까?
상황은 이랬습니다. 저희 팀에서 운영 중인 PO 처리 자동화 로봇이 있었습니다. 이 로봇은 시스템에서 PO 데이터를 가져와 처리한 후, 관련 담당자들에게 결과 메일을 보내는 역할을 담당했죠. 그런데 어느 날, 모니터링 시스템에서 PO 처리 건수와 실제 발송된 메일 건수에 차이가 있다는 알림이 왔습니다. 116개의 PO가 처리되었지만, 결과 메일은 96개만 발송되었다는 겁니다. 나머지 20개에 대한 메일은 어디로 증발한 걸까요?
처음에는 단순한 오류라고 생각했습니다. 혹시 메일 서버 문제인가? 네트워크 문제인가? 아니면 로봇 자체에 일시적인 결함이 생긴 건 아닌가 하는 생각들이 머릿속을 스쳤죠. 하지만 이런 기본적인 점검을 해봐도 특별한 이상은 발견되지 않았습니다. 시스템은 정상적으로 작동하고 있었고, 네트워크 상태도 양호했습니다. 그렇다면 문제는 로봇 자체, 혹은 로봇이 실행하는 프로세스 어딘가에 있을 가능성이 높았습니다.
로그 분석의 늪: ‘쓰레드 탐색 실패’ 오류의 등장
문제를 파악하기 위해 가장 먼저 한 일은 역시 로그 분석이었습니다. UiPath Orchestrator의 로그를 꼼꼼히 살펴보며 어떤 부분에서 문제가 발생했는지 추적하기 시작했죠. 96개의 성공적인 메일 발송 기록과 20개의 누락된 메일 발송 시도를 비교하며 차이점을 찾아내려 했습니다. 하지만 처음에는 명확한 원인을 찾기 어려웠습니다. 대부분의 로그는 정상적으로 기록되어 있었고, 오류 메시지도 눈에 띄지 않았습니다.
몇 시간을 꼬박 로그를 들여다보고 나서야, 드디어 의심스러운 로그를 발견했습니다. 실패한 20건의 메일 발송 시도와 관련된 로그에서 반복적으로 나타나는 오류 메시지가 있었던 겁니다. 바로 ‘System.InvalidOperationException: 스레드 탐색 실패 (Thread search failed)’라는 메시지였습니다. 처음 보는 오류 메시지는 아니었지만, 이 상황에서 왜 이 오류가 발생했는지 명확하게 이해하기는 어려웠습니다.
‘쓰레드 탐색 실패’ 오류, 무엇이 문제였을까?
이 오류 메시지를 접했을 때, 저는 두 가지 가능성을 염두에 두었습니다. 첫째, 로봇이 메일을 보내기 위해 특정 스레드(Thread)를 탐색하는데, 해당 스레드를 찾지 못했을 가능성. 둘째, 스레드를 찾긴 했지만, 어떤 이유로든 해당 스레드에 접근하거나 제어하는데 실패했을 가능성이었습니다. RPA에서 ‘스레드’라는 용어는 일반적으로 프로그램의 실행 흐름 단위를 의미합니다. 메일 발송과 같은 작업은 여러 스레드와 연관되어 처리될 수 있는데, 이 과정에서 예기치 못한 문제가 발생한 것으로 보였습니다.
저희가 사용하던 메일 발송 방식은 특정 애플리케이션(예: Outlook)을 통한 발송이 아니라, SMTP(Simple Mail Transfer Protocol)를 이용한 직접 발송 방식이었습니다. 즉, UiPath의 ‘Send SMTP Mail Message’ 액티비티를 사용하여 메일을 발송하고 있었죠. 이 액티비티는 내부적으로 메일 서버와 통신하여 메일을 보내는데, 이때 어떤 시스템적인 요인으로 인해 메일 발송 요청이 정상적으로 처리되지 못했던 것으로 추정되었습니다.
삽질의 연속과 결정적인 단서
오류 메시지를 단서 삼아 관련 자료들을 찾아보기 시작했습니다. UiPath 커뮤니티 포럼, 기술 문서 등을 샅샅이 뒤졌죠. 하지만 ‘Thread search failed’ 오류가 메일 발송과 직접적으로 연관되어 발생하는 사례는 흔치 않았습니다. 대부분 UI 자동화나 다른 종류의 애플리케이션 상호작용에서 발생하는 경우가 많았죠. 마치 엉뚱한 곳에서 실마리를 찾고 있는 듯한 느낌도 들었습니다.
몇 시간 동안 원인을 파악하지 못하고 헤매던 중, 문득 이런 생각이 들었습니다. ‘혹시 메일 발송 시점의 특정 환경적 요인이 문제였던 건 아닐까?’ 예를 들어, 로봇이 실행되는 서버의 리소스 부족, 혹은 메일 서버와의 네트워크 지연 등이 문제가 될 수도 있겠다는 생각이었습니다. 하지만 앞서 점검했을 때 특별한 이상은 없었습니다.
그러다 한 가지 결정적인 단서를 발견했습니다. 로봇이 메일을 발송하는 시점에, 동시에 다른 시스템 프로세스가 과도한 리소스를 사용하고 있었던 것입니다. 정확히 어떤 프로세스인지는 특정할 수 없었지만, 해당 시점에 서버의 CPU나 메모리 사용량이 일시적으로 치솟는 것을 확인했습니다. 그리고 그 시점과 메일 발송 실패 로그가 기록된 시점이 거의 일치했습니다. 이것이 바로 ‘쓰레드 탐색 실패’ 오류의 원인이었던 것입니다!
왜 동시 리소스 사용이 문제를 일으켰을까?
UiPath 로봇이 메일을 보내기 위해 SMTP 프로토콜을 통해 메일 서버와 통신할 때, 내부적으로 네트워크 관련 스레드를 사용하게 됩니다. 그런데 다른 시스템 프로세스가 서버의 리소스를 과도하게 점유하게 되면, 로봇이 사용하는 네트워크 스레드에 대한 할당이나 접근에 문제가 발생할 수 있습니다. 마치 여러 사람이 동시에 좁은 통로를 지나가려고 할 때 병목 현상이 발생하는 것처럼 말이죠. 이로 인해 로봇은 메일을 보내기 위한 정상적인 스레드 탐색 및 제어에 실패했고, 결국 ‘쓰레드 탐색 실패’ 오류를 뱉어냈던 것입니다.
해결 과정: 리소스 관리와 재시도 로직 강화
원인을 파악했으니 이제 해결책을 찾아야 했습니다. 가장 근본적인 해결책은 역시 서버 리소스 관리였습니다. 불필요한 프로세스가 과도한 리소스를 사용하는 것을 방지하고, 로봇이 실행되는 동안에는 충분한 리소스가 확보되도록 시스템 환경을 최적화하는 것이 중요했습니다. 이를 위해 시스템 관리팀과 협력하여 서버 모니터링을 강화하고, 리소스 사용량이 특정 임계치를 넘어서면 경고를 보내도록 설정했습니다. 또한, 로봇이 실행되는 시간대를 조정하여 다른 시스템 프로세스와의 충돌 가능성을 줄였습니다.
하지만 시스템 환경을 완벽하게 통제하기는 어려운 부분도 있습니다. 예상치 못한 순간에 리소스 사용량이 늘어날 수도 있고, 네트워크 지연이 발생할 수도 있습니다. 그래서 저는 재시도 로직(Retry Logic)을 강화하는 방향으로 추가적인 개선을 진행했습니다.
UiPath에서는 ‘Retry Scope’ 액티비티를 사용하여 특정 작업이 실패했을 때 몇 번의 재시도를 할 수 있도록 설정할 수 있습니다. 저는 메일 발송 작업에 대해 이 Retry Scope를 적용했습니다. 메일 발송에 실패하면 즉시 오류를 발생시키는 대신, 몇 분 간격을 두고 3번까지 재시도하도록 설정한 것입니다. 이를 통해 일시적인 리소스 부족이나 네트워크 지연으로 인해 메일 발송에 실패하더라도, 잠시 후 다시 시도했을 때는 정상적으로 메일을 보낼 수 있을 확률을 높였습니다.
또한, 재시도 횟수를 초과하여 최종적으로 메일 발송에 실패했을 경우, 담당자에게 즉시 알림을 보내는 기능도 추가했습니다. 이를 통해 수동 개입이 필요한 상황을 빠르게 인지하고 대처할 수 있도록 했습니다. 이러한 조치 덕분에 이후 동일한 유형의 메일 발송 실패는 더 이상 발생하지 않았습니다.
RPA 운영, 디버깅은 필수 역량
이번 경험을 통해 다시 한번 RPA 운영에서 디버깅의 중요성을 절감했습니다. 자동화라는 편리함 뒤에는 예상치 못한 문제들이 숨어있을 수 있으며, 이러한 문제들을 해결하기 위해서는 꼼꼼한 로그 분석 능력과 시스템적인 사고방식이 필수적이라는 것을 깨달았습니다.
특히, ‘쓰레드 탐색 실패’와 같이 명확한 오류 메시지가 아니거나, 외부 요인에 의해 발생하는 문제들은 더욱 까다롭습니다. 이때는 단순히 에러 메시지만을 쫓을 것이 아니라, 로봇이 실행되는 전체 시스템 환경을 이해하고 다양한 가능성을 열어두고 접근해야 합니다. 마치 의사가 환자의 증상뿐만 아니라 생활 습관, 환경까지 종합적으로 고려하여 진단하는 것처럼 말이죠.
물론, RPA 엔지니어로서 저도 여전히 배우고 성장하는 과정에 있습니다. 앞으로도 현장에서 겪는 다양한 경험들을 솔직하게 공유하며, 더 많은 분들과 함께 성장해나가고 싶습니다. 혹시 여러분도 비슷한 경험을 하셨거나, 제가 놓친 부분이 있다면 언제든지 댓글로 알려주시면 감사하겠습니다.
감사합니다.