RPA 도입 및 강의 문의 : yogurtaa2@gmail.com
※ AA v11은 유지보수(EOM)가 2023년 3월 1일 종료 예정[기존에서 6개월 늘어남]
※ 서비스 종료(EOL) 예정일 : 2023.03.01
※ 현재(2021. 07. 기준) AA의 주력은 A2019 버전으로 아직 마이그레이션 초입 단계
※ 2021.03 기준 A2019는 Automation 360으로 이름 변경됨
※ 원래 삼성전자에서 써서 주목을 받았던 툴인데, 삼성에서 주도적으로 삼성 SDS의 툴인 BrityWorks로 전환중
※ Automation 360은 웹베이스의 가벼운 개발툴을 강점으로 현업 사용자 UI 부문 및 비지니스 PI 관련 현업과 개발자가 커뮤니케이션 하는 부분에 힘을 쏟고 있음. [현업에서 과제정의서만 만들어주는 게 아니라 대략적인 플로우를 웹에서 같이 보면서 논의하고 수정 가능] 개발자들 입장에선 툴이 웹베이스라 퍼포먼스도 떨어지고 개발 생산성도 떨어지는 것으로 느끼는 경우가 많음. 브라우저에서 개발하기 때문에 안 쓰는 브라우저로 개발해야 되는데 정작 크롬, IE를 주력으로 하고 있어서 난감한 부분이 있음.
2020. 09. 15 내용 최종수정
주의 : 한국어 버전 깔지 말 것(백그라운드의 특정 앱 때문에 매우 느려짐)
[느려지는 걸 떠나서도 번역이 별로 의미가 없고 헷갈림]
Automation Anywhere 클라이언트 설치(현 기준 11.3.5가 최신)
Task / Bot
과제의 단위라고 보면 됨
일반적으로는 MainTask - SubTask 구조로 돼있음
프로젝트 - 프로세스 - 태스크의 계층 구조에서는 의미가 구분됨
Commands
활용할 수 있는 내장 명령 기능들
커스텀 명령 기능들은 '메타봇'의 형태로 쓸 수 있다.
=========================
기능 설명에 앞서 안정성을 위한 팁
1. 봇 Running 환경의 해상도를 설정
2. 이미지 인식은 최후의 수단으로 활용[성능을 위해 활용되기도 함. 절대원칙은 아님.]
- 오히려 이미지 인식을 어떻게 견고하게 할 것인지 꼭 연구해야 함
3. 창은 가능한 경우 최대화 시켜서 작업
4. 브라우저는 IE를 활용[크롬으로 사용 시 플러그인 설치]
- 최신 버전들은 크롬에서 크게 문제가 없음
- 다만 탭 이동 등을 잘 고려해야 함
5. 클라이언트는 관리자 권한으로 실행[Target app도 관리자 권한 실행. Option에 있음]
6. Error handling과 flag 처리, Variables, IF, Loop + 주석을 잘 활용해야 함
- 자신만의 프레임워크를 한번 만들어보는 것이 좋음
- 논리적 설명 꼭 주석으로 달고 서로 공유
자주 쓰는 기능들 설명
Clipboard
클립보드를 비우거나 클립보드에 할당할 수 있음
엑셀과 관련된 작업 시 클립보드를 활용하게 되면 '클립보드를 비울 수 없습니다.'라는 메시지와 함께
에러가 나는 경우가 간혹 생김.
하나의 아이템을 붙여넣고 나면 무조건 클립보드를 비워줘야 함
[혹은 복사하기 직전에 클립보드를 비우기]
Text를 입력할 때, 입력기의 한/영 변환이 멋대로 되는 것을 막고자
클립보드에 보내서 ctrl+v를 입력해 붙여넣는 방식을 많이 쓴다.
Comment
주석달기
- 일반적으로 '=' 이나 '-' 을 이용해 라인을 구분하고 가독성을 높임
- 유지보수, 인수인계에 필수적이므로 최대한 자세하게 라인별로 작성
Database
DB접속 및 SQL 구문을 쓸 수 있음(접속 커맨드를 넣었을 시 접속해제도 같이 넣는 게 바람직)
SELECT, INSERT, DELETE, UPDATE 가능
SELECT의 경우 변수로 활용하기 위해선
Loop를 돌려 시스템 변수인 Dataset Column(index)를 활용해 해당 row의 컬럼 data를 뽑아야 함
엑셀을 DB로 연결해 사용하는 경우도 있음[퍼포먼스 때문에]
프로시져 Run도 가능
(ODBC, JDBC, MS ACCESS 등 맞는 접속앱을 깔았는지 확인)
Delay
작업 중 지연시간이 필요할 때 쓰는 기능
(은근히 Delay로 해결 되는 경우가 많다)
하드 딜레이기 때문에 퍼포먼스에는 별로 좋지 않다.
꼭 필요할 때만 사용(Xplatform같은 환경에선 필수적일 때가 많다. window창 인식문제)
Error Handling
에러가 났을 때 어떻게 할 것인지 설정
발생 시 task 중단 여부와 에러 스냅샷, 다른 태스크 실행, 로그 파일 만들기, 이메일로 보내기, 변수 할당 등을 선택할 수 있음
[보통 변수 할당은 vErrorFlag 같은 flag 형태의 변수에 Fail을 넣게끔 함]
활용 시 예외 및 로그처리를 한번에 할 수 있으므로 기능블록 단위나 태스크 단위로 묶음
(else 처리가 까다로울 때 에러가 나면 넘겨버리는 처리로도 활용)
블록 안에서 에러발생시 flag를 넘기고 flag의 상태에 따라 task 진행을 분기처리하는 방식으로 많이 쓰임
팁 - 에러핸들링 블록으로 묶고자 하는 라인들을 선택 후 우클릭해서 insert error handling하면 한번에 넣기 가능
Excel
스프레드시트에 관한 기능이 모여 있음
스프레시트 열기, 닫기, 저장, sheet 선택, cell값 가져오기, 넣기, cell로 가기, cell 삭제, 찾아 바꾸기
Excel의 데이터를 가져와서 loop로 활용하려는 경우 Get all cells를 한번 해야 인식
엑셀 매크로를 실행하는 것도 가능.
다른 솔루션과 달리 AA V11은 엑셀기능이 많이 약한 편이라 복잡한 작업에는 메타봇을 같이 활용
※ delete cell을 하는 경우 한번에 삭제하는 게 아니면 셀 주소가 바뀌기 때문에 주의
※ command내에 셀 input String은 255자를 넘길 수 없다.
따라서 삭제 등이 대량의 셀을 포함하는 경우 적절히 이를 고려해서 코딩해야 해야 한다.
Botstore에도 관련 메타봇을 받아 활용 가능[추가 포스팅 예정]
Files/Folders
파일 및 폴더의 복사, 이름바꾸기, 삭제, 생성, 압축, 압축풀기, 파일열기
바로가기 만들기, 파일 프린트 등이 있음
엑셀 등 템플릿 형태의 파일을 다른 이름 및 경로로 지정해 copy하는 형태로 많이 활용
(파일 이름 및 경로에 변수 지정 가능 => 파일 떨구기를 dynamic하게 활용 가능)
FTP/SFTP
FTP 서버에 관한 기능
FTP 서버에 접속해 폴더나 파일에 대한 기능을 수행할 수 있음
IF/ELSE
상황에 따른 분기
파일이나 폴더가 존재하는지, 윈도우 창이 존재하는지, 스크립트가 실행됐는지
Task가 성공했는지, ping이 잡혔는지, 해당 이미지가 존재하는지 등등 다양한 상황을 분기하는 게 가능
변수의 값에 대한 분기도 가능(가장 많이 씀)
Object Cloning에서 Property가 있는지 없는지로도 분기가 가능(자주 쓰임)
Insert keystrokes
키값을 입력
기능키의 경우 [ENTER] 같은 형태로 입력되고
[CTRL DOWN][CTRL UP] 형태로 눌렀다 떼는 것도 구분돼 있음
윈도우창이 뜨는 속도나 포커스가 변경되는 이벤트 등의 원인으로
안 먹는 경우가 종종 있어 딜레이를 잘 줘야 함
[간혹 딜레이가 0이어야만 입력이 되는 경우도 존재]
창이 Focus는 돼있으나 key를 입력받을 커서가 준비되지 않는 경우도 존재 => 이 경우 key가 씹히게 됨
따라서 Device 성능이 좋지 않아 key가 자주 씹힌다면 hard delay도 앞에 떨궈야 함
※ 키스트로크에 대한 이슈가 딜레이로 해결 되지 않는 경우 Message box를 주면 해결 되는 경우가 있다.
특히 복사 붙여넣기를 쓰는 경우는 주는 것을 추천한다. [엑셀작업이라면 VBS로 paste하는 게 안정적]
복사 작업 이전에 clipboard clear를 넣고 붙여넣은 후 다시 clear를 해주면 '클립보드를 비울 수 없습니다.'를
대부분 회피할 수 있다.
- 한글입력이 안 되는 경우 클립보드로 보내서 ctrl+v로 처리
Insert Mouse Click
Mouse Click 동작을 넣어줌. 좌클릭, 우클릭, 더블클릭 모두 가능
다만 좌표로 인식해 클릭하기 때문에 진행과정에서 변수가 생길 가능성이 짙음
웬만하면 최후의 수단으로 남겨두는 것이 좋다.
[그냥 안 쓴다 생각. 이걸 쓸 바엔 차라리 Image Recognition을 사용.]
IQ Bot
말 그대로 지능을 가진 Bot
[써보니 지능이 없다]
Cognitive data 인식률을 개선하기 위해 머신러닝을 도입한 것.
Invoice, 공공문서 등 pdf나 그림파일을 부분별로 학습시키고 인식률을 개선해 데이터를 가져올 수 있다.
RPA의 업무 영역을 확장시키는 데 핵심적인 기능이라 할 수 있다.
다만 아직은 리소스를 상당히 많이 요구하며 한글에 대한 인식률은 아직 생각보다 높지 않다.
[최소 서버 요구 RAM이 32GB에 CPU i7인데 이 정도여도 버벅거리고 hard disk 용량이 100GB 미만이면 작동이 멈춤]
기업 입장에서도 추가 라이센스 구입이 필요하고 들어가는 리소스도 많은데다
'실패 리스크가 적으면서 비정형적인' 업무에 특화돼있는 기능이다 보니 도입하기 쉽지 않다.
일반적인 과제들은 OCR이나 pdf 기능으로 type을 분기해서 IQ Bot을 쓰지 않고도 구현 가능하다.
이외 승인이나 판별 등의 인지기능, 절차적인 문제가 결부된 경우 IQ Bot은 더더욱 쓰지 않아야 한다.
Log to File
로그를 남길 수 있음
타임스탬프를 찍어 변수를 담아두면 이클립스에서 쓰던 로그처럼 남기는 것도 가능
에러핸들링 및 유지보수에 유리
※ Log to File에 대한 다른 활용으로 Script를 떨구는 방식이 있다.
특정 경로에 Script를 떨구고 Run script하는 방식으로
MS Office 변환 관련한 vba나 파일 확장자를 가져오는 javascript 등을 명시적으로 작성할 수 있다.
※ taskkill같은 경우 batch 파일로 떨궈야만 가능한 경우도 있었음.
- Windows10에서 간간히 에러가 나는 경우가 있음 => 특별한 에러가 아니니 Errorhandling으로 감싸주고 continue
- 뒤에 delay를 2~3초 정도 주지 않으면 다음에 open하는 프로그램까지 꺼버릴 수 있으니 주의
Loop
loop 블럭의 index는 Counter라는 시스템 변수로 정의됨
Times는 정해진 숫자나 변수값을 받아 그 값만큼 loop
List는 List의 아이템을 하나씩 꺼냄(loop에서 리스트변수는 해당 counter의 position에 있는 변수를 의미)
=> Times로 Loop를 돌리는 상황에서 리스트 변수를 부르면 해당 리스트의 Counter 위치에 있는 값을 불러옴
Condition은 if문이 합쳐진 형태(if - loop)
Each Row In An Excel Data (내장 객체인 Excel Column(index)으로 가져옴)
※ 엑셀 커맨드의 Get all cells를 먼저 써야 함을 잊지 말자. 시스템 변수로 해당 dataset을 할당해야 loop 활용 가능.
Each Row In A SQL Query Dataset(SELECT한 것을 Dataset Column(index)로 가져옴)
이외 기능도 폴더의 파일, 폴더의 폴더, csv나 text파일 메일메시지 등
리스트 형태의 것을 가져와 하나씩 뱉어주면서 돌아감
Folder를 돌리는 경우 FileName 변수와 Extension을 활용해 파일을 각각 컨트롤
csv나 text 파일은 filedata set으로 부름
End Loop(루프 끝)
Exit Loop(루프 탈출)
Continue Loop(이후 부분을 무시하고 루프 첫부분으로 가서 다음 Counter로 넘어감)
※ 11.3.3부터 loop 사용시 row를 가져오기 위해 어떤 변수를 쓰면 되는지 comment로 안내하고 있다.
Message Box
변수의 상태를 알아보거나 완료 메시지를 띄울 수 있음
Console.log나 System.out.print 같은 개념
딜레이 대신에 쓸 수도 있다.
실제 운영 시에는 꼭 필요한 경우가 아니면 빼고 진행 [pending시키지 않도록 유의]
※ 퍼포먼스를 신경쓰지 않아도 된다면 중요한 값들은 변수에 들어왔는지 체크할 수 있게 운영시에도 띄워놓을 수 있다.
※ 특히 주요 변수가 assign 된 길목에 디버깅을 위해 변수값들을 띄워준다면 운영관점에서 편하다.
Object Cloning
구조적인 텍스트 혹은 웹데이터에 대해서 정확도가 높음
캡쳐, 경로규칙, 조건을 넣어 Object를 가져와 Action을 지정할 수 있다.
망원경 표시를 끄고 켜서 검색조건을 선택
DOM Path, Inner Text, Class, Id 등에 변수를 넣어 규칙적으로 가져오게 할 수도 있음
(이미지나 좌표로 가져올 수도 있으나 덜 쓰는 것을 권장함)
※ Object Cloning이 안 되는 경우 record를 했을 시 먹힐 수 있다. (Xplatform같은 특수 형태인 경우)
- Record했을 때 먹는 이유는 창이름 기준으로 잡기 때문으로 보인다. 어떤 걸 클릭했을 때 나오는 live view 창들은 그 시점에서 멈추지 않고서야 창을 잡아내기 어렵기 때문이다. [안타깝게도 AA v11에는 멈춰서 object를 잡는 기능이 없다.]
※ Object Cloning이 특정 시스템에서 DRM 등으로 인해 느릴 수 있다.
이 경우 MetaBot으로 화면을 잡는 건 비교적 빠르기 때문에 거기서 Creteria 정보를 가져오는 게 빠르다.
※ 어떤 환경에서는 OC를 했을 때 해당 app이 응답없음 상태가 되며 한참 후에 잡히는 경우가 있다. 이 경우 그냥 해당 app을 강제종료하면 workbench가 돌아온다.
※ parent나 child dom path를 가져와 컨트롤 하려는 object를 찾는 것도 가능하다.
※ div[last()] 또는 a[text()='test'] 같은 형태로 creteria를 좀 더 dynamic하게 쓸 수 있다.
PDF Integration
PDF는 저장 시 이미지로 저장된 것이 있고 텍스트 형태로 저장된 것이 있는데
이미지로 저장된 경우 OCR 성능에 의존할 수 밖에 없다.
Extract From Fields는 영역을 지정해서 영역내 데이터를 추출해 변수에 담는다.
파일을 복사해서 loop를 돌려도 같은 값을 가져오는 것으로 보아 영역 좌표는
파일이 바뀌어도 그대로 유지하는 것으로 보인다.
[다른 파일로 하면 해당 영역에 데이터 없어서 null값이었음. 오류는 안 남]
Exctract Text는 모두 긁어서 텍스트 파일로 저장
※ OCR성능은 생각보단 나쁘지 않다. 다만 0이랑 O를 구분하는 케이스가 나오는 과제라면 할 수 없다고 하는 게 맞다.
[생각보다라는 기준은 과제의 실패 리스크에 따라 달라진다. 웬만하면 이미지인 경우 어렵다고 봐야 한다.]
[PDF 작업이 나오면 과제 수행 가능성을 보수적으로 보고 접근해야 한다.]
※ 텍스트를 가져와 String Operation을 이용해 변수를 나누고 작업을 할 수 있다.
[보통 before-after를 쓰게 됨]
REST Web Service
API를 불러와 받은 Response에서 필요한 값을 변수에 담을 수 있음
반대로 Workload에 올려진 것들을 받아와 작업 성공시 API를 보내기도 가능
요컨대 RESTful API 통신 서비스
Postman으로 접속되는지 확인하고 json형태로 데이터를 주고 받으면서 쓰는 게 일반적
※ 과제에서 많이 쓰이진 않지만 Queue 작업에 관해 AA가 제공하는 API 서비스가 간혹 사용된다.
※ 간혹 공공데이터 포털 등에서 API로 쏴주는 것들을 쌓아달라는 요청도 있다. 이 경우 api 운영계정을 신청해 일일 트래픽을 확인해야 한다. 또, 연결 실패 시 message 등도 고려해 task를 구성할 필요가 있다.
Run script
스크립트에 파라미터를 던지고 리턴을 받을 수 있음
스크립트 형식은 VBS(비쥬얼 베이직 스크립트), JS(자바스크립트)
JS의 경우 Wscript를 통해 파라미터를 주고 받고 반복문을 이용해 리스트도 활용가능
- 프로젝트에서 자주 활용되는 방식
SAP에서 GUI Record기능을 활용해 VBS로 떨군 다음 VBS를 실행시키거나
VBS를 log to file로 생성한 다음 그걸 실행시키는 방식으로 많이 쓰임.
※ 다만 script를 실행하면 실패했을 때 script host의 에러메시지가 뜬다. 즉, AA에서 컨트롤 할 수 없고 run script를 실행하는 과정에서 device가 pending이 된다. 써야 되는 경우 내부에서 exception처리를 잘 하고 AA에 flag를 넘겨주자.
Send Email
간단히 이메일을 보내기 위한 기능
메일 계정에서 SMTP/POP3/IMAP을 설정하면 메일을 보낼 수 있음
※ 보통 회사 내부 windows authentification으로 메일서버를 관리하느라 SMTP/POP3/IMAP에 관한 정보가 없이 OUTLOOK만 쓰는 회사가 즐비하다. 그러다보니 메일링을 구축할 때는 OUTLOOK MetaBot을 이용하는 경우가 더 많아 보인다. 다만 이 기능이 사용 가능한 경우 굳이 외부환경을 이용할 필요없이 이 커맨드를 적극 활용하자.
String Operation
문자열에 대한 기능. 문자열을 나누고 자르고 선택하거나 길이를 뽑아낼 수 있음.
Trim, Lower, Upper 기능도 가능
before-after 커맨드는 다른 솔루션에 비해 변수 조작에 대해 강점을 가진다 할 수 있다.
find의 경우 정규표현식도 가능하며 정합성 체크를 해야 되는 경우 정규표현식이 아주 유용해진다.
split은 보통 구분자로 쌓은 String을 리스트에 할당할 때 쓴다.
특이한 점은 list의 경우 최초 크기를 설정한 후 assign하는 형태로 쓰면 최초 크기를 초과한 index를 할당할 수 없지만
split을 통해 할당하면 크기가 dynamic하게 늘어난다.
따라서 리스트 변수를 제대로 사용하기 위해서는 구분자를 통해 row를 나눠놓은 String을 가져오고 이를 split으로 list에 넣는 형태를 가져가야 한다.
Task
Task를 실행하거나 일시정지, 멈춤을 할 수 있음
Run Task의 경우 다른 Task를 실행시키게 되는데
다른 task와의 변수 Mapping이나 속도, 반복을 정할 수 있음
(Task간 변수 이름이 같을 시 quick mapping으로 자동 mapping됨)
※ Main과 Sub task로 잘 나눠야 디버깅이 쉽고 다른 사람이 코드를 볼 때도 한 눈에 알아볼 수 있다.
다만 엑셀 등의 세션은 공유가 되지 않기 때문에 Excel Open은 작업이 이뤄지는 Task에서 하도록 하자.
최신 버전(11.3.4.0)에서는 Open SpreadSheet에서 Share session 옵션을 선택해 session을 공유할 수 있게 됐다.
Terminal Emulator
Terminal을 다루는 Command
잘 못 가져오는 경우 Putty를 활용
Variable Operation
변수에 값을 할당.
txt 파일로부터 value를 가져오는 변수의 경우 txt파일에 '변수이름=value' 형태로 할당해두고 값을 가져올 수 있다.
해당 과제의 정보를 txt 파일에 담아두는 경우 굳이 클라이언트를 켜지 않고도 task에 쓰이는 정보를 변경할 수 있어 운영 측면에서 이점이 있다. [네트워크 공유폴더에 담아두는 방식]
다만 실제 운영 과제에서 그렇게 가져갈 것이냐는 판단이 필요하다.
보안 측면에서 결정권자의 판단에 따라 문제가 있을 수 있기 때문이다.
※ 메모장에 DRM이 걸려있는 경우 다른 편집기를 써서 저장하는 등 DRM을 회피해야 AA에서 해당 메모장의 정보를 제대로 읽어올 수 있다.
※ 매핑시키는 변수의 경우 txt에서 가져오면 안 뜨는 경우가 있다. 매개가 되는 변수를 중간에 지정해주어야 함.
ex) vMailTo를 txt에서 가져오는데 SubTask_Send_Email에 매핑시켜야 하는 경우 vMailTo를 txt에서 값을 가져온 후
vMailTo2에 다시 담고 매핑
Wait
Wait은 Delay와 달리 명시적으로 어떤 이벤트를 기다림
(특정 창이 뜨는지, 창이 어떤 image로 변하는지)
최대 기다리는 시간 설정
Web Recorder
웹의 정보들을 가져오는 데 필요한 기능
브라우저 열기, 닫기, 파일 다운로드 등등이 있음
테이블을 가져오는 경우 Extract Table이 OC로 각각 가져오는 것보다 훨씬 빠름
URL을 입력해서 써야 되다 보니 거의 잘 쓰이지 않고
요새 추세가 table 태그를 안 쓰고 div로 다 쌓아 버리다보니 점점 활용도가 떨어지고 있다.
심지어 최근 버전에서는 Object Cloning에서 아예 table을 잡으면 csv로 export 하도록 기능을 제공하고 있어
Web Recorder는 제한적으로 사용되는 편이다.
Window Actions
창크기 변경이나 활성화 등이 가능
팝업이 여러 종류가 뜨는 경우 get active window title로 title을 가져와 각각에 맞는 분기처리를 할 수도 있다.
title로 구분이 안 되는 경우는 property를 가져와 비교해야 되기 때문에 병렬처리가 힘들다.
[AA의 강한 단점 중 하나는 병렬처리가 명시적으로 존재하지 않는다는 점이다. 다만 솔루션 유저의 능력으로 퍼포먼스 로스를 최대한 줄이면서 어느 정도 우회가 가능한 측면도 존재한다.]
WorkLoad
큐기반으로 task를 짤 때 insert하기 위해서 많이 쓴다.
schedule bot으로 queue item을 insert하고 MainTask는 DP에서 돌아가게 하는 아키텍쳐가 보통.
client workbench 우측 하단에 queue category를 선택하지 않으면 의미가 없다.
queue 카테고리 연결 시 workitem 이라는 시스템 변수를 사용할 수 있으며 큐에 지정된 컬럼명으로 값을 가져올 수 있다.
[Queue category name는 Control Room에서 Queue를 만들 때 지정. 큐를 지워도 Category name 이력이 남음.]
v11의 큐는 현재 AA에서도 포기한 수준이 됐다.
큐 형태의 구성이 필요하다면 Task를 계층구조로 DB부터 짜는 게 일반적이고 이 정도면 대기업 수준이어야 한다.
XML
XML session에 연결 혹은 해제
XML 데이터를 가져오거나 update, insert할 수 있음. 유효성 검사도 가능.