RPA POC 개발 경험과 자료 공유

안녕하세요. 사람인HR IT연구소 서비스인프라개발팀 김아라 입니다.  
저희팀에서 RPA POC를 진행하며, 조사했던 자료와 경험했던 것들을 공유하고자합니다.


RPA 란?

들어가기에 앞서 RPA 는 다음과 같이 정의 할 수 있습니다.

  • 비즈니스 프로세스를 사람이 아닌 S/W 로봇이 수행하도록 자동화 하는 것
  • 프로세스 처리를 위한 이기종 디지털 자원 간의 연동 자동화 시스템
  • 사람이 하는 저부가가치 업무를 자동화 처리함으로써, 고부가가치 업무 및 차별적인 비지니스 발굴 등의 창의적업무에 인력을 집중할 수 있도록 해줌

기능 단위 별 솔루션 분류

분류 설명
RDA (Robotic Desktop Automation) 개인 또는 소규모 조직의 다양한 업무를 자동화할 목적으로 별도의 소프트웨어 없이 일반 데스크탑에서 단독으로 구동 가능한 소프트웨어 로봇
POC 업무로 적합
RPA (Robotic Process Automation, RDA + Process management) 대규모 조직 업무를 위해 서버와 클라이언트 모두 설치가 필요한 소프트웨어 로봇으로 운영 규모에 따라 전문 관리 조직이 필요
IPA (Intelligent Process Automation, RPA + Ai) Ai, 머신러닝 등 신기술을 결합해 단순 반복 업무뿐만 아니라 사람의 판단이 필요한 업무까지도 확장


RPA 업무 분석 과정

RPA 도입시 제일 중요한 부분은 업무 분석과정입니다. 자동화 가능한 적합한 업무를 파악하고, 현업 담당자와 미팅을 통해 업무가 어떤 Rule에 의해 어떤 순서로 이루어지는 파악했습니다. 미팅 후 업무 프로세스 방식을 정리하고, 제대로 반영되었는지 확인 과정을 반복했습니다. 업무 프로세스 정리 후 RPA 솔루션 및 오픈소스등의 비교 검토 과정을 거쳤습니다.


RPA 도입을 위한 오픈소스 검토

RPA 도입시 아래의 기술 검토 항목을 고려 하였고, 해당 항목에따라 TagUI, UIPath, Robot Framework의 기능 및 사용법, 특징 등을 조사 하였습니다.

RPA 도입시 기술 검토 항목

  • Open Source + Easy Learning Curve
  • Reference 확보를 위한 다양한 개발자 / 사용자 층 보유
  • 기능 확장을 위한 다양한 언어 지원
  • 다양한 방식의 자동화 지원
  • 웹 액션의 Recording 기능 지원
  • 중앙 모니터링 방식 지원

TagUI

  • 크롬의 headless 방식 or 브라우저 구동 방식 자동화 가능
  • 웹사이트와 데스크탑의 visual 자동화 가능
  • 20개 이상의 휴먼 언어와 자바스크립트 지원
  • 웹 big data / AI / ML을 위한 R 과 Python 통합 지원
  • big data / AI / ML을 위한 R 과 Python 통합 지원

UIpath

  • studio, robot, orchestrator로 구성
    studio : 자동화 script를 작성하는 저작도구
    robot : 자동화 script를 실행 해주는 client
    orchestrator : 관리(사용자, robot, 머신, job, process 등)와 원격실행(비협업 process) 및 모니터링 기능을 제공해주는 웹 서비스
  • 자동화 script의 작성이 쉬움 (GUI 기반으로 작성 가능)
  • 자동화를 위한 다양한(약 300+) activity들이 존재 함
  • Official한 activity이외의 오픈소스 형태의 activity들이 다수 존재 함
  • 포럼 및 커뮤니티가 있어서 이슈 사항 해결시 도움이 됨

Robot Framework

  • python으로 기반으로 개발됨(python 2, 3 기반)
  • Jython(JVM), IronPython(.NET), PyPy 실행 가능
  • python과 java로 모듈을 확장 할 수 있음
  • v3.1 부터 공식적으로 RPA 지원이 되었음



TagUI 도입 배경

오픈 소스 비교 후 검토 항목에 적합한 Tagui를 선택하게 되었습니다. RPA POC 개발 방안이 솔루션 도입이 아닌 자체 스크립트 개발 하는 방안으로 결정 되기도 했고, 무료 오픈소스이며, browser에서 일어나는 작업에 대해서 자동화 해주는 기능의 Tagui를 선택하했습니다.

TagUI

  • Open Source + Easy Learning Curve
  • Reference 확보를 위한 다양한 개발자 / 사용자 층 보유
  • 기능 확장을 위한 다양한 언어 지원 : Python, Javascript, R
  • 다양한 방식의 자동화 지원 : URL, email, CLI, api, 스케줄러 지원
  • 웹 액션의 Recording 기능 지원 : Chrome 한정
  • 다양한 OS 환경 지원 : Window, macOS, Linux
  • 사용하기 쉬워 개발+배포가 빠름
  • 소스코드를 오픈 및 무료


TagUI 기능

TagUI 참고

  • 휴먼 언어를 지원하며 프로토타이핑 및 배포 유지관리가 가능
  • 스케쥴링, 명령행, API, 이메일 등을 통해 자동화 flow를 실행 할 수 있음
  • 브라우저 없이 백그라운드에서 작업이 가능
  • API or 명령행 호출은 다른 Application과 통합이 가능
  • CI / CD 통합은 CasperJS 프레임워크와 TagUI Chrome 통합으로 지원 가능
  • 자동화 flow에 javascript를 직접 작성 가능
  • 실시간 TagUI step이나 javascript검증을 위한 대화식 live mode 지원
  • silkui와 통합을 통해서 웹사이트/데스크탑의 시각적 자동화 지원
  • Browser에서 일어나는 작업들에 대해서 자동화 해주는 기능을 주로 가지고 있음

실행 component 구조

Steps 설명

클릭, 링크이동, 선택 등 웹 브라우져 event에 대해서 스크립트로 작성할 수 있습니다.

Basic Step Parameters (separator in bold) Purpose
http(s): // just enter full url of webpage (variable for variable) go to specified webpage
click element to click click on an element
rclick element to right-click right-click on an element
dclick element to double-click double-click on an element
hover element to hover move cursor to element
type element as text ([enter] = enter, [clear] = clear field) enter element as text
select element to select as option value ([clear] = clear selection) choose dropdown option
read element to read (page = webpage) to variable name fetch element text to variable
show element to read (page = webpage, ie raw html) print element text to output
save element (page = webpage) to optional filename save element text to file
snap element (page = webpage) to optional filename save screenshot to file
snap (pdf) page to filename.pdf (headless Chrome / PhantomJS) save webpage to basic pdf
load filename to variable name load file content to variable
echo text (in quotation marks) and variables print text/variables to output
dump text (in quotation marks) and variables to optional filename save text/variables to file
write text (in quotation marks) and variables to optional filename append text/variables to file
variable_name = value (for text, put in quotes, use + to concat) define variable variable_name
// (on new line) user comments (ignored during execution) add user comments
ask question or instruction for user (reply stored in ask_result) ask user for input
live try steps or code interactively for Chrome / visual automation enter live mode (Firefox not yet)


TagUI 기능 확장 및 추가 모듈 개발

RPA 업무 진행시에 메일 발송 모듈, 문서 이미지에서 필요한 텍스트 추출 기능, 스프레드시트 연동 등이 필요했습니다. Tagui에서는 해당 기능을 지원하지 않았고, 해당 기능 모듈을 파이썬을 통해 개발하여 Tagui에서 파이썬 모듈을 호출하는 방식으로 해결하였습니다.

  • Python 통합
    “py” 키워드를 이용하여 python 명령어를 사용 가능(v2, v3 모두 지원)하며 py 명령어로 python 명령어를 실행, py_result로 python에서 실행된 결과 정보를 받아 오게 됩니다.

    Python 통합 방법 예시
    
    // using py step to denote Python code, and getting back output from py_result
    py a=1;b=2
    py c=a+b
    py print(c)
    echo py_result
    
    // alternatively, you can use py begin and py finish to denote a Python code block
    // indentation of Python code is also supported, for example in conditions or loops
    py begin
    a=1;b=2
    c=a+b
    print(c)
    py finish
    echo py_result
    
    // an example of passing dynamically generated variables to Python integraton
    phone = 1234567
    name = 'donald duck'
    py_step('phone = ' + phone)
    py_step('name = "' + name + '"')
    
    py print(name)
    echo py_result
    py print(phone)
    echo py_result
    


  • Google Vision API 연동을 통한 OCR 기능
    OCR 처리는 Google Vsion API를 통해 개발 하였습니다. Google Vision API 연동 기능을 python 모듈을 이용하여 개발하고 tagui에서 py로 python 모듈을 호출 하여 처리 하였습니다.

    //sample Code
    
     py_step('file_path = "'+path+'"')
     py_step('py_path = "'+py_path+'"')
    
     js log_echo(test_mode, "debug", "OCR CALL START :::::: PYTHON MODULE")
     py exec(open(py_path + '/ocr/image_to_data.py', encoding='utf8').read())  // Ocr 처리 파이썬 모듈 연동
     js log_echo(test_mode, "debug", "OCR CALL END :::::: PYTHON MODULE :: " + py_result)
    
     //CON_3 : 증빙자료명 비교
    
     js con_echo(3, "증빙자료명 비교")
    
     js begin
    
     var temp_ocr_result = JSON.parse(py_result); // 파이썬 모듈 호출 응답 결과
     ocr_result = temp_ocr_result
     js finish
    


  • 메일 발송 기능
    메일 발송 처리는 사내의 메일 서버를 연동을 통해 메일 발송을 처리 했습니다. 연동 모듈을 파이썬을 통해 개발하고, python 모듈을 호출 하여 처리 하였습니다.

    //sample Code
    
    company_name = company_info_data.comNm
    
    // 파이썬 모듈 호출시
    py_step('reject_code ='+status_code)
    py_step('email = "'+email+'"')
    py_step('company_name = "'+company_name+'"')
    py_step('send_flag = "'+send_flag+'"')
    
    py_step('py_path = "'+py_path+'"')
    js log_echo(test_mode, "info", "call mail_interface.py python")
    
    py exec(open(py_path + '/mail/mail_interface.py', encoding='utf8').read())
    
    js log_echo(test_mode, "info", "exec result : "+py_result)
    


  • 실행 스크립트 스케쥴링 기능
    해당 업무 스케줄에 따라 RPA를 실행시키는 스케줄러가 필요했고, 해당기능을 Window 작업 스케줄러 기능을 사용 하여 처리하였습니다. 해당 스케줄러로 rpa가 실행되게 하려면 tagui 실행 스크립트를 작성해야합니다. 작업 스케줄러에의해 tagui 실행(*.cmd, *.bat) 스크립트 파일이 실행 되게 됩니다.

    //    
    @echo on
    c:
    cd C:\tagui\src  // Tagui 설치 경로
    tagui samples/1_yahoo chrome //tagui 파일
    



개발 및 실무 적용

대상 업무를 선택 기준에 따라 저희 개발팀에서는 2가지 업무를 선택하여 POC를 진행하였습니다.

대상 업무 선택 기준

  • 단순 반복 적인 업무
  • 정해진 규칙에 따른 처리 업무
  • 대량 업무 (예: 처리 건수 100건, 처리시간 1시간 이상) 처리
  • 동일한 데이터 처리
  • Digital Data 를 다루는 업무

대상 업무

  • 고객 지원팀 기업 인증 업무
    기업이 인증 불일치이거나 미인증일 때는 서비스 이용에 제한이 되는 경우가 있어, 고객센터로 인증 요청이 들어오게 되면 해당 기업에 대한 인증 신청 업무(매일 10 또는 20 분 주기 실행, 일 평균 80건 이상) 를 하고 있습니다.

  • 공고 관리팀 불량 기업 모니터링 업무
    불량 기업 제어 / 불량 공고를 올린 기업이나 불량 공고를 올리기 위해 가입한 기업들의 ‘기업 구분’ 정보를 ‘수시’로 변경(이용 제한)하는 업무를 하고 있습니다.

해당 업무들은 엑셀 문서 작성, 메일 작성, 상태 변경 등의 task가 있었으며, task를 수행하기 위해 웹 브라우져와 사람인 관리자 사이트 등을 이용하고, 문서 및 정보 비교 등의 작업을 해야 했습니다.

기업인증 업무의 경우

  1. 기업 인증 신청 목록 확인
  2. 인증 신청 기업의 등록된 대표자명, 회사명, 사업자 등록번호 등의 정보를 확인
  3. 등록된 사업자등록증 문서 열람
  4. 사업자등록증과 기업의 정보 비교
  5. 정보 일치 시 인증, 불일치 시 인증 보류 및 보류 이유 메일 피드백

업무를 처리했습니다.

해당 task를 Tagui를 통해 위와 같이 사람이 처리하는 event 기반으로 정의된 스크립트를 작성하였고, 스크립트에 따라 프로세스가 수행하게 됩니다.


RPA 업무 처리 이력 관리

RPA 처리 결과를 로그로 확인 할 수 있으나, 로그를 통해 이력 관리 및 모니터링의 어려움이 있었습니다. 그래서 스프레드시트 연동을 통한 시작/종료/처리 결과 등의 이력 관리를 위한 파이썬 스프레드시트 연동 모듈을 추가 개발하여 모니터링 및 이력관리를 하였습니다.

고객 지원팀, 공고 관리팀 에서는 스프레드시트에 추가된 이력을 통해 실패 건에 대해서만 추가로 처리하고 있습니다.

스프레드시트 이력 관리 예시

등록일 no 처리 결과 아이디 대표자명 회사명 기업 구분 정보 상태 정보 OCR 처리 결과 수행 시간
2019-05-22-14:40 13793 보류 saramin_id 김용환 (주)사람인HR 일반 사업자 등록증 유효 기간 만료 {“title”:”사업자등록증”,”regi_num”:”000-00-00000”,”company_name”:”사람인”,”owner_name”:”김용환”,”receive_date”:”2017-07-18 00:00:00”} 2019-05-22-14:41


RPA 적용 후

기업 인증 업무

  • 1일 처리 건수 및 상태별 통계
총 건수 인증 인증(오탐) 보류 보류(오탐) 실패(수동처리) PASS 기타(수동처리)
713 285 20 199 5 160 39 5
  39.9% 2.8% 27.9% 0.7% 22.4% 5.4% 0.7%

처리 시간 일 평균 2시간 > 30분 으로 단축 되었고, 대부분의 실패 처리는 OCR 처리 실패(이미지 화질 문제, 확장자 문제 등)로 인한 실패였습니다.

불량 기업 이용 제한 업무

  • 1일 처리 건수 및 상태별 통계
총 건수 ID 불량 ID 불량(오탐) 기업명불량 기업명불량(오탐) 공고불량 공고불량(오탐) 중복IP 중복IP(오탐)
42 18 4 0 0 0 2 0 18
  42.8% 9.5% 27.9% 0% 0% 4.7% 0% 42.8%

상시 처리하던 업무를 오탐에 대한 건수 1일 1회 처리로 단축 되었습니다.

PoC 기간 동안 지속적인 업데이트를 통해 실패율을 조금씩 줄여나갔으며, 기존 대비 업무 처리 시간 단축으로 현업 팀에서는 해당 업무 처리 시간에 조금 더 의미있는 작업을 할 수 있었습니다.

물론 개발을 진행하면서 문제점도 발생했습니다. alert/confirm 창에 대한 제어의 문제가 발생했고, popup으로 뜨는 페이지에 대한 처리가 불가능했습니다. 또한 OCR 처리에도 문제가 발생했습니다. 기업에서 문서 이미지와는 전혀 상관없는 이미지를 올린다거나, OCR 처리 시 text 추출 정확도가 100%가 아니었습니다. 이미지의 선명도 화질 문제 등으로 인한 오류율이 높았습니다. OCR 처리 중 Case by Case로 처리 가능한 부분은 OCR 텍스트 추출 후 처리하였으며, OCR 처리 중 오류 발생하는 비율은 약 10% 정도였습니다. RPA 진행 시 스크립트를 직접 작성하여 개발했으므로 업무 프로세스가 변경되거나, 관리자 사이트 기능 변경 시 스크립트를 수정해야 하는 이슈도 있었습니다.

현재 RPA POC 적용 이후 계속 운영 중이며, RPA 적용 후 고객지원팀, 공고 관리팀의 만족도도 높았습니다. 기대했던 것보다 좋은 결과를 얻었고, 새로운 기술을 경험해 볼 수 있었던 의미 있는 프로젝트였습니다.