변수는 정보를 저장할 수 있는 공간의 이름을 뜻하는 프로그래밍의 중요한 개념입니다. 다양한 유형의 데이터를 저장하는 상자로 생각하면 쉽습니다.
이 상자에는 다양한 유형의 데이터를 넣을 수 있으며, 데이터의 유형에 따라 이 상자(변수)의 이름을 정할 수 있습니다. UiPath RPA에서도 이러한 변수는 작업을 자동화하는 데 매우 중요한 역할을 합니다.
컴퓨터에서 사용하는 변수는 다양한 유형이 있습니다. 간단히 말하면, 문자는 '스트링(String)', 숫자는 '인테저(Integer)', 배열은 '어레이(Array)', 표 데이터는 '데이터테이블(DataTable)', 시간은 '데이트타임(DateTime)' 등으로 표현합니다. 이렇게 각 변수에 적절한 유형의 데이터를 할당하는 것이 프로그래밍의 기초 중 하나입니다. 아래 표는 자주 사용되는 변수 유형이니 참고하시기 바랍니다.
변수유형
변수유형 |
설명 |
불리언 (Boolean) |
주로 조건문에서 사용하며, 참(True)과, 거짓(False)입니다. |
인테저(Integer) (Int32 / Int64) |
숫자이며, 소수점을 가지는 숫자는 Double입니다. |
스트링 (String) |
문자열이며 문자 한 개는 Character로 표현합니다. |
어레이 (Array Of [T]) |
배열이며 여러가지 데이터를 담을 때 사용합니다. Split을 하거나 {"A", "B"} 같은 형태로 입력가능합니다. |
데이트타임 (DateTime) |
시간 데이터입니다. |
데이터테이블 (DataTable) |
표 데이터이며 엑셀이나 테이블에서 사용합니다. |
딕셔너리 (Dictionary) |
사전 데이터이며 특정한 값에 특정한 값을 연결시켜줍니다. |
제네릭밸류 (GenericValue) |
UiPath에서 제공하는 다양한 형식을 포함한 자료유형입니다. |
변수를 사용 할 때 주의사항
적절하지 않은 유형의 변수에 적절하지 않은 데이터를 할당하면 오류가 발생할 수 있습니다. 예를 들어, 숫자 유형의 변수에 텍스트를 넣는 것은 허용되지 않습니다. 또한, 숫자형 변수(Integer)는 계산에 사용할 수 있지만, 문자열 변수(String)은 계산에 사용할 수 없습니다. 이 경우, 필요에 따라 변수의 유형을 변환해야 할 수도 있습니다.
UiPath에서 변수사용하기
UiPath RPA에서도 변수는 중요한 역할을 합니다. 여러 작업 간에 데이터를 전달하거나, 특정 작업의 결과를 저장하거나, 조건에 따라 다른 작업을 수행하는 등의 목적으로 변수를 사용합니다. 변수의 이해는 UiPath RPA를 효과적으로 사용하는 데 필수적입니다. 어떤 값이 여러 작업에서 반복적으로 사용되거나 변경되어야 하는 경우, 그 값을 변수에 저장하면 효율적인 작업 수행이 가능합니다.
문자열 메소드란 문자열 데이터를 조작하거나 정보를 가져오는 데 사용되는 기능을 말합니다. 문자열은 많은 프로그래밍 언어에서 기본 데이터 타입 중 하나로, 이에 따라 다양한 문자열 메소드들이 제공됩니다.
UiPath에서도 프로그래밍 언어에서 일반적으로 사용하는 여러 문자열 메소드를 사용할 수 있습니다. 이러한 메소드들은 문자열을 조작하는데 도움이 됩니다. 아래에는 UiPath에서 사용 가능한 일부 문자열 메소드를 소개하겠습니다:
형변환 (Type Conversion)
형 변환(Type Conversion) 또는 타입 캐스팅(Type Casting)이란, 한 데이터 타입을 다른 데이터 타입으로 변경하는 과정을 말합니다. 프로그래밍 언어에서는 변수의 데이터 타입을 변환할 수 있는 기능을 제공합니다.
String타입의 데이터를 Int타입으로 변환 하거나 Int타입의 데이터를 String타입 으로 변경하는 걸 볼 수 있습니다. Stirng타입 에서의 연산은 문자가 합쳐지기 때문에 Int타입으로 바꿔서 진행합니다.
A변수에는 150이라는 데이터를, B변수에는 250이라는 데이터를 넣겠습니다. A+B라는 식이 있다고 가정했을 때 A변수가 String, B변수가 String 이라면 결과값은 “150250”, a변수가 Int, B변수가 Int 이라면 결과값은 “400”이 나올 것 입니다.
연산을 할 때 변수 유형이 다르다면 오류가 발생하여 연산이 불가능합니다.
형변환
메소드(Method) |
예제(변수) |
설명 |
cstr() |
cstr(변수) |
String 타입으로 변환 |
cint() |
cint(String숫자변수) |
int 타입으로 변환 |
Cdate() |
Cdate(String날짜형식변수) |
Date 시간 타입으로 변환 |
UiPath에서 사용하는 대표적인 문자열 메소드
UiPath에서는 VB.net Method를 활용하여 다양하게 데이터를 가공 할 수 있습니다. 아래 메소드 말고도 다양한 메소드들이 있으니 검색하여 활용하시기 바랍니다.
실행했을 때 System.String[]과 같은 출력 값이 나온다면 메소드를 잘못 처리 한 것입니다.
Method
메소드(Method) |
예제(변수) |
설명 |
Substring |
String변수.Substring(A,B) String변수.Substring(A) |
A부터 시작해서 B만큼 데이터 추출 혹은 뒤에서 A만큼만 추출하기 (공백포함) |
Length |
String변수.Length |
변수의 문자수의 개수를 추출 |
Array.Count |
Array변수.count |
Array나 list에 있는 요소의 개수를 파악 |
IndexOf |
String변수.indexOf(A) |
변수에서 A의 값을 찾아 인덱스값을 추출 |
Trim |
String변수.Trim |
앞 뒤 공백을 제거 |
Replace |
String변수.Replace(A,B) |
변수에서 A로 되어있는 문자를 B로 변경 |
Contains |
String변수.Contains(A) |
변수에 A가 포함되어 있는지 여부 확인 |
Equals |
String변수.Equals(A) |
변수에 A와 동일한지 여부 확인 |
IsNumeric |
String변수.IsNumeric |
변수가 숫자인지 확인 (string타입도 가능) |
Split |
String변수.Split("A".toCharArray)(B) 변수.Split("A"C)(B) |
변수에서 A를 기준으로 배열로 저장 |
StartsWith |
String변수.StartsWith(A) |
변수의 시작이 A로 시작되는지 여부 |
EndsWith |
String변수.EndsWith(A) |
변수의 끝이 A로 시작되는지 여부 |
ToUpper |
String변수.ToUpper |
영문 대문자로 변환 |
ToLower |
String변수.ToLower |
영문 소문자로 변환 |
Join |
String변수.join("A",Array변수명) |
Array안에 있는 요소를 보고싶을 때 A를 기준으로 한 구분자를 String으로 변경 |
Remove |
String변수.Remove(A) 변수.Remove(A,B) |
A부터 B만큼 지우거나 A만큼 제거하기 |
Environment.NewLine |
String변수 + Environment.NewLine +String변수 |
문장 String 변수 라인내리기 기능 |
VbLf |
String변수 + VbLf +String변수 |
개행 (줄바꿈, Enter) |
String.IsNullorEmpty |
String변수.IsNullorEmpty(변수) |
변수가 NuLL 이나 비어 있는지 확인 |
String.IsNullOrWhiteSpace |
String변수.IsNullOrWhiteSpace(변수) |
여러가지 공백값과 탭, 공백문자등이 포함되어 있는지를 확인 판단된다면 True 없다면 False |
IsNothing |
IsNothing(String변수) |
변수가 초기화되었는지 확인하는 데 사용되는 메소드, Nothing은 변수가 초기화되지 않았음을 의미합니다. / 출력(True, False) |
Space() |
Space(숫자) |
어떤 변수에 빈 칸만 입력하고자 할 때 |
new System.Net.NetworkCredential(string.Empty, secureStr).Password |
new System.Net.NetworkCredential(string.Empty, Secure변수).Password |
Password를 Plain Text로 변경 |
new System.Net.NetworkCredential(string.Empty, Password).SecurePassword |
new System.Net.NetworkCredential(string.Empty, String변수).SecurePassword |
Plain Text를 password로 변경 |
System.Environment.UserName |
System.Environment.UserName |
Windows 계정명 가져오기 (User명) |
System.Windows.FormsClipboard.GetImage |
System.Windows.FormsClipboard.GetImage |
이미지변수에 할당하여 Save Image 액티비티를 사용하여 클립보드에 있는 이미지를 특정위치에 저장할 수 있음 |
추가적인 메소드
메소드(Method) |
설명 |
VbLf |
개행 (줄바꿈, Enter) 라인내리기기능 |
Environment.NewLine |
개행 (줄바꿈, Enter) 라인내리기기능 |
String.IsNullorEmpty |
공백과 Null값이 있는지 판단 있다면 True 없다면 False / String.lsNullORempty(변수명) / String.lsNullORempty(“값”).tostring |
String.IsNullOrWhiteSpace |
여러가지 공백값과 탭, 공백문자등이 포함되어 있는지를 확인 판단된다면 True 없다면 False |
IsNothing |
변수가 초기화되었는지 확인하는 데 사용되는 메소드, Nothing은 변수가 초기화되지 않았음을 의미합니다. / 출력(True, False) / IsNothing(변수명) |
System.Environment.UserName |
Windows 계정명 가져오기 (User명) |
System.Windows.FormsClipboard.GetImage |
이미지변수에 할당하여 Save Image 액티비티를 사용하여 클립보드에 있는 이미지를 특정위치에 저장할 수 있음 |
Directory.GetFiles("폴더경로") |
폴더 안의 파일을 가져오기 |
Path.GetFileName(item.Tostring) |
For Each를 사용하여 item변수에 폴더 한개씩 가져올 수 있음 “ Main.xaml “ 이름을 모두 가져올 수 있음 |
Path.GetFileNameWithoutExtension(item.Tostring) |
For Each를 사용하여 item변수에 폴더 한개씩 가져올 수 있음 “ Main “이름을 모두 가져올 수 있음 |
Path.GetFileNameExtension(item.Tostring) |
For Each를 사용하여 item변수에 폴더 한개씩 가져올 수 있음 “ .xaml “ 이름을 모두 가져올 수 있음 |
데이트타임(DateTime)의 개요
데이트타임(DateTime)은 날짜와 시간을 관리하는데 사용하는 데이터 형식입니다. 이는 일자(년, 월, 일)와 시간(시, 분, 초) 정보를 모두 담고 있어서 날짜와 시간에 관련된 정보를 쉽게 저장하고 관리할 수 있게 해줍니다.
데이트타임을 사용하는 이유
데이트타임 데이터 형식을 사용하면 날짜와 시간에 관련된 다양한 계산과 조작을 수행할 수 있습니다. 이런 데이터 형식은 많은 시스템이나 응용 프로그램에서 사용하는 표준 형식이기 때문에 널리 호환됩니다.
예를 들어, 특정 시간을 더하거나 빼거나, 날짜 간의 차이를 계산하거나, 날짜를 특정 형식으로 출력하는 것 등이 가능합니다. 매 월 첫 영얼일에 처리를 하거나 매주 월요일, 홀 수 시간 등 시간과 관련된 업무는 우리 주변에 많이 있습니다.
데이트타임의 처리방식
데이트타임 데이터는 특별한 방식으로 저장되고 처리됩니다. 이 데이터 형식은 일자와 시간 정보를 담고 있는 별도의 필드를 가지고 있습니다. 이 필드는 년, 월, 일, 시, 분, 초 등의 요소를 관리합니다.
또한, 데이트타임은 다양한 메소드를 제공합니다. 이 메소드들을 이용하면 데이트타임 데이터를 쉽게 조작하거나 비교하거나 형식화 할 수 있습니다. 예를 들어, AddDays 메소드를 사용하면 특정 날짜에 일 수를 더할 수 있고, Subtract 메소드를 사용하면 두 날짜 간의 차이를 계산할 수 있습니다.
UiPath에서 데이트타임을 사용하는 방법
UiPath에서 데이트타임을 사용하는 방법은 간단합니다. 먼저, 날짜와 시간을 저장할 변수를 만들고 그 변수의 타입을 DateTime으로 설정합니다. 그런 다음, DateTime.Now와 같은 내장된 데이트타임 메소드를 사용하여 현재 날짜와 시간 정보를 얻을 수 있습니다.
DateTime.Now는 시스템의 현재 날짜와 시간을 반환합니다. 또한, 데이트타임 변수는 다양한 메소드를 사용하여 조작하거나 계산할 수 있습니다. DateTime.AddDays(7)과 같은 코드를 사용하면 데이트타임 변수에 7일을 더할 수 있습니다.
데이트타임 변수는 문자열로 변환하여 출력할 수도 있습니다. 이를 위해 ToString 메소드를 사용하고, 원하는 날짜와 시간 형식을 지정할 수 있습니다. 예를 들어, DateTime.ToString("MM/dd/yyyy")와 같은 코드를 사용하면 데이트타임 변수를 "월/일/년" 형식의 문자열로 변환할 수 있습니다.
다양한 데이트타임 메소드와 기능들을 활용하면, UiPath에서 날짜와 시간 관련 작업을 효율적으로 처리할 수 있습니다.
기준값(22년 2월 7일 21시 17분 26초)
포맷형태 |
설명 |
결과 |
DateTime변수.Day |
날짜 |
7 |
DateTime변수.DayOfWeek |
요일 |
Monday |
DateTime변수.DayOfYear |
1년중 경과날 |
38 |
DateTime변수.Date |
시분초 |
02/07/2022 00:00:00 |
DateTime변수.Hour |
시간 |
21 |
DateTime변수.Minute |
분 |
17 |
DateTime변수.Second |
초 |
26 |
DateTime변수.Month |
월 |
2 |
DateTime변수.tostring("M") |
1부터 12까지의 월 |
2 |
DateTime변수.tostring("MM") |
01부터 12까지의 월 |
2 |
DateTime변수.tostring("d") |
1부터 31까지의 일 |
7 |
DateTime변수.tostring("dd") |
01부터 31까지의 일 |
7 |
DateTime변수.tostring("HH") |
01부터 23까지의 시간 |
21 |
DateTime변수.tostring("hh") |
01부터 12까지의 시간 |
9 |
DateTime변수.tostring("ss") |
00부터 59까지의 초 |
26 |
DateTime변수.tostring("yyyy/MM/dd") |
yyyy/MM/dd 형태로 변환 |
2022/02/07 |
DateTime변수.tostring("yyyy") |
yyyy 형태로 변환 |
1905 |
DateTime변수.tostring("hh:mm:ss") |
Hh:mm:ss 형태로 변환 |
21:17:26 |
DateTime변수.addYears(-3).ToString("yyyy-MM-dd HH:mm:ss") |
3년 전 |
2019-02-07 21:17:26 |
DateTime변수.addMonths(-3).ToString("yyyy-MM-dd HH:mm:ss") |
3달 전 |
2021-11-07 21:17:26 |
DateTime변수.addDays(1).ToString("yyyy-MM-dd HH:mm:ss") |
1일 후 |
2022-02-08 21:17:26 |
DateTime변수.addHours(-1).ToString("yyyy-MM-dd HH:mm:ss") |
1시간 전 |
2022-02-07 20:17:26 |
DateTime변수.addMinutes(1).ToString("yyyy-MM-dd HH:mm:ss") |
1분 후 |
2022-02-07 21:18:26 |
DateTime변수.addSeconds(1).ToString("yyyy-MM-dd HH:mm:ss") |
1초 후 |
2022-02-07 21:17:27 |
DaysInMonth(“yyyy”,”MM”) |
특정 달의 마지막 날짜를 반환 |
|
DateDiff(“d”,날짜1,날짜2) |
날짜1과 날짜2의 차이를 출력형식으로 반환 |
|
String to DateTime
포맷형태 |
설명 |
CDate("yyyy/MM/dd") |
지정된 날짜 형식에 대해서만 변환 가능 |
Convert.ToDateTime("yyyy/MM/dd") |
|
DateTime.Parse("yyyy/MM/dd") |
|
DateTime.ParseExact(Str날짜, "날짜형식", Nothing) |
날짜 형식에 제한이 없음 |
DataTable
데이터테이블은 구조화된 데이터를 담는 그릇으로 이해할 수 있습니다. Excel의 시트를 생각하면 쉽습니다. Excel 시트에는 행(row)과 열(column)이 있고, 각 셀에는 특정한 값이 들어있습니다. 이처럼 데이터테이블도 행과 열의 구조를 가지고, 각 셀에는 여러 종류의 데이터를 저장할 수 있습니다.
데이터테이블을 사용하는 이유
데이터테이블을 사용하면 대량의 데이터를 효과적으로 관리할 수 있습니다. 특히, RPA에서는 업무 프로세스 중에 발생하는 다양한 형태와 규모의 데이터를 효율적으로 처리하기 위해 데이터테이블을 활용합니다.
데이터테이블은 일반적인 프로그래밍 언어에서 제공하는 배열이나 리스트와 달리, 행과 열로 구성된 2차원 구조를 가지고 있어서 복잡한 데이터를 쉽게 조직하고 관리할 수 있습니다. 또한, 데이터테이블의 각 열은 서로 다른 타입의 데이터를 저장할 수 있어, 테이블 형태의 데이터를 다루는 데 매우 유용합니다.
인간과 컴퓨터의 데이터 테이블 인식
우리가 일상에서 데이터 테이블을 사용하면서 주로 1부터 숫자를 세는 경향이 있습니다. 예를 들어, 표의 첫 번째 행이나 열을 지칭할 때 "1번 행", "1번 열"이라고 부릅니다. 그러나 컴퓨터는 이와 달리 0부터 숫자를 세기 시작합니다. 이는 컴퓨터의 메모리 주소 계산이 0부터 시작하도록 설계되었기 때문입니다.
그렇기에, 데이터 테이블에서 데이터를 읽을 때에는 이 차이를 항상 염두에 두어야 합니다. 즉, 컴퓨터에서는 첫 번째 행이나 열을 "0번 행", "0번 열"로 지칭합니다. 따라서, 데이터를 가져오거나 수정할 때 행과 열의 위치를 지정하는 인덱스 번호에 주의해야 합니다. 이는 데이터 테이블의 정확한 이해와 효율적인 사용에 중요한 부분입니다.
데이터테이블의 처리방식
데이터테이블은 대량의 데이터를 효율적으로 관리하고 정렬하는 구조입니다. 이 구조는 행과 열로 이루어져 있으며, 이 덕분에 다량의 데이터를 명확하게 정리하고 쿼리할 수 있습니다.
특히, 엑셀과 같은 프로그램을 이용해 직접 데이터를 입력하는 것보다는, 데이터를 먼저 데이터테이블에 입력하고 일괄 처리한 후, 그 결과를 다시 엑셀에 넣는 것이 훨씬 효율적일 수 있습니다. 이런 방식을 통해, 프로그램의 입력과 출력에 대한 부하를 줄이고 메모리 내에서 더욱 신속하게 데이터를 처리할 수 있습니다.
데이터테이블은 행과 열을 통해 데이터를 구조화합니다. 이때 각 행은 DataRow 객체로 표현되며, 이 DataRow 객체는 테이블의 열 수에 따른 ItemArray를 가집니다. 이는 각 행의 데이터를 효율적으로 저장하고 접근하는 방식입니다. 따라서 데이터테이블의 각 행은 해당 테이블의 구조에 따라 값을 저장하게 되며, 이를 통해 필요한 데이터를 빠르게 찾아 활용할 수 있습니다.
이러한 처리방식으로 데이터테이블을 사용하면 기존 방식보다 좋은 효율성과 반복작업의 처리속도, 접근성, 확장성을 가집니다.
※ DataRow: DataRow는 데이터테이블의 행을 나타내는 .NET 클래스입니다. 각 DataRow 객체는 데이터테이블의 한 행의 데이터를 담고 있습니다. 이 클래스는 다양한 메소드와 속성을 가지고 있어 행의 데이터를 읽거나 수정할 수 있습니다. 예를 들어, 'Item' 속성을 사용하면 행에서 특정 열의 데이터에 접근할 수 있습니다.
※ ItemArray: ItemArray는 DataRow 클래스의 속성 중 하나로, 해당 행의 모든 열 데이터를 포함하는 객체 배열을 반환합니다. 이 배열은 데이터테이블의 열에 따라 정렬된 값들을 가지며, 이를 통해 전체 행의 데이터에 쉽게 접근하고 조작할 수 있습니다.
UiPath의 데이터테이블 액티비티
UiPath에서는 'Build Data Table' 액티비티를 사용해 데이터테이블을 만들 수 있습니다. 이 액티비티를 사용하면 열의 이름과 데이터 타입을 정의할 수 있습니다.
데이터테이블에 값을 추가하려면 'Add Data Row' 액티비티를 사용할 수 있습니다. 'ArrayRow' 속성에 값을 넣어 해당 행에 데이터를 추가할 수 있습니다. 관련된 액티비티는 부록의 참고 액티비티 항목을 확인하시기 바랍니다.
데이터테이블에서 데이터를 읽거나 수정하려면 'For Each Row Data Table' 액티비티를 사용해 각 행을 순회하면서 필요한 처리를 수행할 수 있습니다.
이 외에도 UiPath에서는 데이터테이블을 필터링하거나 정렬하는 액티비티들을 제공합니다. 'Filter Data Table', 'Sort Data Table' 등의 액티비티를 사용해 데이터테이블의 데이터를 원하는 방식으로 가공할 수 있습니다.
UiPath에서 반복문을 활용하여 데이터테이블 사용하기
UiPath에서는 데이터테이블을 다루는 다양한 방법이 제공되지만, For Each Row in Data Table
액티비티를 사용한 반복문은 가장 기본적이면서도 강력한 도구입니다. 이 반복문을 사용하면 데이터테이블의 모든 행을 순회하면서 원하는 작업을 수행할 수 있습니다.
데이터테이블의 변수명은 일반적으로 DT_변수명
형식으로 지정합니다. 이 변수를 통해 데이터테이블의 데이터에 접근하며, 특정 행의 특정 열의 데이터를 가져오려면 DT_변수명.Rows(행번호).Item(열번호)
나 DT_변수명.Rows(행번호).Item("열이름")
의 형식을 사용합니다. 이 때 행번호와 열번호는 0부터 시작한다는 점을 주의해야 합니다.
반복문을 사용하여 데이터테이블의 각 행에 대해 작업을 수행하려면 For Each Row
액티비티를 사용하고, 반복문 내에서 현재 행의 데이터에 접근하려면 CurrentRow(열번호)
나 CurrentRow("열이름")
의 형식을 사용합니다.
또한, 데이터테이블의 전체 행 수나 열 수를 알아내려면 DT_변수명.Rows.Count.ToString
이나 DT_변수명.Columns.Count.ToString
을 사용하면 됩니다. 이를 통해 데이터테이블의 크기에 대한 정보를 얻을 수 있습니다.
메소드(Method)
메소드(Method) |
예제(변수) |
설명 |
Select |
Datatable변수.Select("[컬럼명] = , <> like %% ' ' ") |
데이터테이블 특정 컬럼열에서 특정 행을 추출 |
Rows.Count |
Datatable변수.Rows.Count |
데이터테이블의 행 개수 추출 |
Columns.Count |
Datatable변수.Columns.Count |
데이터테이블의 열 개수 추출 |
Columns().Ordinal |
Datatable변수.Columns("컬럼명").Ordinal |
데이터 테이블의 컬럼 index를 추출 |
Rows().item() |
Datatable변수.Rows(행인덱스번호).item("컬럼명") |
데이터테이블의 특정 좌표 데이터 추출 |
액티비티(Activity)
액티비티 |
예제(변수) |
설명 |
For Each Row in Data Table |
CurrentRow("컬럼명") |
해당 컬럼, 열 수행되는 루프 인덱스의 값 추출 |
For Each Row in Data Table |
CurrentRow(열번호) |
해당 컬럼, 열 수행되는 루프 인덱스의 값 추출 |
Build Data Table |
|
새로운 데이터 테이블을 생성하고 컬럼 데이터를 지정 가능 |
Add Data Column |
|
데이터 테이블에 새로운 컬럼 생성 |
Add Data Row |
|
데이터 테이블의 기존 데이터 값에 새로운 Row 값 추가 |
Remove Data Row |
|
데이터 테이블의 기존 데이터 값 Row 삭제 |
Filter Data Table |
|
데이터 테이블의 특정 컬럼을 지정하고 값을 필터링(제거 및 유지) |
Generate Data Table |
|
구분자를 설정해 테이블을 만들 수 있음 |
DataTable 제어 C# 함수
함수 |
설명 |
dt.Select("[colName]='값'") |
데이터 테이블에서 조건에 부합하는 결과를 DataRow 형식으로 반환한다 (=, <, >, <>, like) |
dt.Copy |
데이터 테이블의 컬럼, 행, 행의 상태를 복사 |
dt.Clone |
데이터 테이블의 컬럼(Column)을 복사 |
dt.Columns(index).ColumnName |
컬럼의 이름을 반환 좌변 입력시 우변의 값으로 컬럼이름을 변경 가능 |
dt.Columns("colName").DataType |
컬럼의 데이터 형식을 반환 |
dt.rows.IndexOf(dataRow) |
데이터 테이블에서 특정 행의 인덱스를 반환 |
dt.defaultView.totable(True, "ColName") |
데이터 테이블에서 원하는 컬럼의 데이터만 추출 가능 (True: 중복제거 / False: 컬럼 그대로 호출) |
dt.defaultView.sort=("[colName] ASC/DESC") |
데이터 테이블 정렬 |
dt.AsEnumerable.Union(dt2.AsEnumerable) |
두개의 테이블을 수직으로 결합 |
dt.AsEnumerable.Reverse() |
데이터 테이블의 행을 역순으로 변경 |
딕셔너리의 정의
딕셔너리(Dictionary)는 'Key'와 'Value'를 한 쌍으로 가지는 데이터 구조입니다. 이는 사전에서 단어를 찾듯이, 'Key'를 통해 해당 'Value'를 찾아내는 것이 가능합니다. 이 때 'Key'는 고유한 값이어야 합니다.
딕셔너리를 사용하는 이유
딕셔너리는 데이터를 효율적으로 저장하고 찾아내는데 유용합니다. 'Key'를 통해 직접 데이터에 접근하기 때문에, 리스트나 배열과 달리 데이터를 찾아내는데 걸리는 시간이 일정합니다. 또한 여러 데이터를 하나의 딕셔너리에 저장하여 관리하면 변수를 줄일 수 있습니다. 이는 코드의 복잡성을 줄이는 데 도움이 됩니다.
딕셔너리의 처리방식
딕셔너리는 'Key'-'Value' 쌍의 데이터를 내부적으로 해시 테이블로 관리합니다. 이는 'Key'값을 해시 함수를 통해 변환하여 그 결과를 인덱스로 사용하여 'Value'를 저장하는 방식입니다. 따라서, 'Key'를 통해 'Value'를 빠르게 찾아낼 수 있습니다.
UiPath에서 딕셔너리를 사용하는 방법
1. 먼저, 변수 또는 인수를 생성합니다. 이 때, 유형은 Dictionary<Tkey,Tvalue>를 선택합니다.
2. 생성된 딕셔너리 변수에 데이터를 할당하려면, Assign 액티비티를 사용하고, new Dictionary(Of Key자료형, Value자료형) From { {Key1, Value1}, {Key2, Value2}, … }
의 형태로 입력합니다.
3. 딕셔너리의 데이터를 찾아내려면, Dictionary변수("key값")
의 형태로 입력합니다. 이렇게 하면, 해당 'Key'에 연결된 'Value'가 반환됩니다.
4. 딕셔너리는 많은 데이터를 효율적으로 관리하고, 찾아내는 데 유용한 도구입니다. 이를 활용하여 UiPath에서 로봇 개발을 더욱 효과적으로 진행할 수 있습니다.
5. new Dictionary(Of Key자료형, Value자료형) From {Key1, Value1}, {Key2, Value2}, …
형태로 입력 할 수 있습니다.
6. 예를 들어 실제로는 new Dictionary(Of String, String) From {{"RPA","로보틱자동화"},{"IE","Internet Explorer"}}
처럼 입력 할 수 있고 실제 사용 할 때에는 아래와 같이 출력하여 사용 할 수 있습니다.
입력 |
출력 |
Dictionary변수(“key값”) |
Value값 |
Dictionary변수(“RPA”) |
로보틱자동화 |
Dictionary변수(“IE”) |
Internet Explorer |
조건문의 정의
조건문은 프로그래밍에서 특정 조건이 충족될 경우 특정 작업을 수행하도록 하는 기본적인 구조입니다. 이것은 코드의 흐름을 제어하며, 우리의 일상 생활에서 상상할 수 있는 많은 시나리오에 적용될 수 있습니다. 해당 데이터를 처리할지 아닐지 판단하고, 이에 따라 업무를 계속 진행하거나 종료하는 것과 같은 조건상황에서 사용됩니다.
UiPath의 조건문
UiPath는 다양한 액티비티를 제공하는데, 이 중에는 프로그래밍에서의 조건문과 비슷한 역할을 하는 'IF 액티비티'가 있습니다. 조건 액티비티는 다음과 같이 세 가지 주요 구성 요소로 구성되어 있습니다.
- 조건(Condition): 이 부분은 Boolean 값, 즉 참(True) 또는 거짓(False)을 결과로 생성하는 조건을 정의합니다. 이는 프로그래밍에서의 조건문의 '조건' 부분과 비슷합니다.
- Then 분기: 이 부분에는 조건이 참(True)인 경우에 수행되는 액티비티가 배치됩니다. 이는 프로그래밍에서의 조건문에서 'if' 이후에 오는 코드 블록과 비슷합니다.
- Else 분기: 이 부분에는 조건이 거짓(False)인 경우에 수행되는 액티비티가 배치됩니다. 이는 프로그래밍에서의 조건문에서 'else' 이후에 오는 코드 블록과 비슷합니다.
조건문 사용 시 주의사항
조건문은 프로그래밍의 기본적인 구조 중 하나로, 특정 조건에 따라 다른 작업을 수행하도록 하는 역할을 합니다. UiPath에서는 이러한 조건문의 역할을 수행하는 '조건 액티비티'를 제공하며, 이를 통해 특정 조건에 따라 다른 작업을 수행하는 로직을 구성할 수 있습니다. 이때, 복잡하고 많은 조건문을 많이 사용하면 프로세스가 복잡해질 수 있으므로, 최소한의 조건문만 사용하는 것이 좋습니다.
비교연산자
비교 연산자는 두 값이나 변수를 비교하는 데 사용되며, 그 결과는 참(True) 또는 거짓(False)입니다. 주로 사용되는 비교 연산자는 다음과 같습니다.
항목 |
비교연산자 |
예 |
설명 |
같다 |
= |
A = B |
A와 B는 같다. |
같지 않다 |
<> |
A <> B |
A와 B는 같지 않다. |
크다 |
> |
A > B |
A가 B보다 크다. |
크거나 같다 |
>= |
A >= B |
A가 B보다 크거나 같다. |
작다 |
< |
A < B |
A가 B보다 작다. |
작거나 같다 |
<= |
A <= B |
A가 B보다 작거나 같다. |
논리연산자
논리 연산자는 주로 Boolean(참 또는 거짓) 값을 비교하거나 조합하는 데 사용되며, 주로 사용되는 논리 연산자는 다음과 같습니다.
항목 |
논리연산자 |
예 |
설명 |
모두 만족 |
and |
A and B |
A와 B 모두 만족해야 됨. |
이중에 하나만 만족 |
or |
A or B or C |
A와 B와 C중 하나이상 만족하면 됨. |
부정 |
Not |
Not A |
A는 아니다. |
반복문의 정의
반복문은 프로그래밍에서 굉장히 중요한 개념입니다. 컴퓨터를 사용하는 주요한 이유 중 하나는 일련의 작업을 반복적으로, 그리고 빠르게 수행하기 위함 입니다. 반복문을 통해 동일한 코드를 여러 번 실행하거나, 일정한 패턴을 가진 작업을 쉽게 처리할 수 있습니다.
UiPath의 반복문
UiPath에서는 여러 가지 반복문 액티비티를 제공합니다.
- While 액티비티: 주어진 조건이 참일 동안 작업을 반복합니다.
- Do While 액티비티: 조건 식이 참인 경우, 반복 작업을 계속합니다.
- For Each 액티비티: 배열이나 컬렉션의 각 요소에 대해 액티비티를 반복합니다. For Each는
Enumerable.Range
와 같이 범위를 지정하여 반복할 수도 있습니다. 예를 들어, Enumerable.Range(시작값, 반복횟수)
나 {“FDX”,”NET”,”Works”}
데이터가 있다면 For Each를 통해 배열의 길이만큼(3개) 출력 할 수 있습니다. 출력 할 때에는 item 명을 적어주면 됩니다.
- Repeat Number Of Times 액티비티: 주어진 횟수만큼 액티비티를 반복합니다.
반복문 사용 시 주의사항
반복문을 사용할 때는 주의할 점이 몇 가지 있습니다. 무한 루프에 빠지지 않도록 반복문의 종료 조건을 명확히 설정해야 합니다. 또한 반복 작업 중에 예외가 발생할 수 있으므로, 예외 처리 방법을 알고 있어야 합니다.
데이터테이블에서 반복문 사용하기
For Each Row 액티비티를 사용하면, 데이터테이블의 각 행에 대해 작업을 반복할 수 있습니다. 이 액티비티는 Excel 데이터 등에서도 사용할 수 있습니다.
데이터테이블의 행은 CurrentRow("열이름")
또는 CurrentRow(열번호)
로 참조할 수 있습니다.
또한, 데이터테이블변수명.Rows(행번호).Item(열번호).ToString
또는 데이터테이블변수명.Rows(행번호).Item("열이름").ToString
을 통해 특정한 위치의 값을 가져올 수 있습니다.
이렇게 해서, 반복문을 사용하여 원하는 작업을 여러 번, 또는 특정 조건을 만족할 때까지 실행할 수 있습니다. 이를 통해 UiPath RPA의 성능을 극대화할 수 있습니다.
Selector
UI Explorer는 Selector에 대하여 상세한 정보들을 제공하는 도구로서 UI Explorer Selector 편집기에서 다루지 못했던 부분을 정교하게 다룰 수 있음. Selector에 상세 조건을 줄 때 용이합니다.
상단메뉴: 유효성검사/ 앨리먼트 표시/ 앵커표시/ 복구/ 강조표시/ 옵션
- 유효성 검사: 지정한 Selector가 올바른 형태인지 확인하는 기능. 총 네 개의 상태가 있음.
이미지 |
설명 |
| Selector가 지정되지 않은 상태
|
|
올바른 형태의 Selector |
|
지정한 Selector가 실행되어 있지 않거나, 찾지 못하는 상태 |
|
지정한 Selector가 올바른 형태인지 아닌지 알 수 없는 상태 |
- 엘리먼트 표시: Selector를 변경하고자 할 때 사용하는 기능. 원하는 Selector를 지정
- 복구: 유효성 검사를 통해 올바르지 못한 Selector로 판별될 때 이 기능을 통해 다시 Selector를 지정하는 기능
- 강조 표시: 사용자가 지정한 Selector 영역을 표시
- 앵커 표시: 지정한 Selector를 기준으로 앵커를 선택. 해당 Selector의 위치를 알려주기 위한 좌표 역할을 하는 기능
- 옵션: UI 프레임워크, 지연 복원, 트리거 선택기가 있음
시각적 트리: UI 계층을 트리 구조로 표현한 패널. 최상단은 데스크톱이며 아래에는 지정한 Selector의 응용 프로그램으로 해당 응용프로그램에 대한 모든 Selector를 나타냄.
속성 탐색기: 시각적 트리에서 선택한 것에 대한 모든 속성과 값을 표시. Get Attribute 액티비티를 이용해 속성값을 가져올 때 사용하면 유리
Selector 편집기: Selector가 표시된 영역을 XML로 표시하는 부분. 속성 편집기에서 변경한 내용이 자동으로 적용되고, XML을 직접 수정하여 Selector를 변경할 수 있음.
정규표현식
정규표현식은 레귤러 익스프레션(Regular Expression)으로 불리며 레직스(regex)라고 줄여 불리기도 합니다. 불규칙한 자연어를 통해 주어지는 문제들을 파악해서 필요한 부분을 찾아 불규칙해 보이는 데이터에서 규칙성(패턴)을 찾아야 되는 경우가 많습니다. 이런 방법을 해결하기 위해서 무분별한 조건문(IF)나 메소드(Method)가 사용 될 수 있는데 코드가 복잡해지고 리소스가 낭비되는 단점이 있습니다.
정규표현식은 이 작업을 조금 더 편하게 작업 할 수 있도록 도와주는 보조 기능이며 다양한 프로그래밍언어에서 사용할 수 있습니다. 그 밖에 이메일 형태의 데이터, 전화번호 형태의 데이터, 년, 월, 일 데이터의 검증이 필요한 경우 등 패턴이 존재하는 모든 경우에서 정규표현식을 사용할 수 있습니다. 아래의 사용 예제는 정규식을 이용해서 원하는 값을 가져오는 예시입니다.
정규식 |
의미 |
^ |
문자열의 시작 |
[\w] |
알파벳+숫자+_ 을 포함 |
@ |
@를 의미 |
[\w\.] |
알파벳+문자+_ 뒤에 .을 포함 |
+ |
And를 의미 |
. |
앞에 .으로 시작하는 영문자 포함 |
[A-Za-z]{2,3} |
2글자 혹은 3글자를 포함 |
$ |
문자열의 마지막 |
정규표현식은 웹사이트( https://regex101.com )에서 미리 체험해볼 수 있는데, 정규식에 (?<=이름 : ).+
을 입력하고 아래 표 문자를 사이트에 넣으면 정규식 패턴에 해당하는 값을 찾습니다.
항목 |
값 |
이름 |
한영석 |
나이 |
30 |
전화번호 |
010-0000-0000 |
이름 |
김병영 |
나이 |
20 |
전화번호 |
010-0001-0002 |
UiPath에서 정규표현식 사용하기
적용 예시의 1번은 UiPath에서 정규식 사용방법이고 2번은 “안녕하세요12345” 라는 Var 변수가 있다면 해당 형태로 작성하면 한글을 모두 숫자로 변경해줄 수 있습니다. 3번은 아래 이미지처럼 가져오기에서 System.Text.RegularExpressions를 미리 입력해놓으면 다음부터는 Regular만 가져와서 정규식을 사용 할 수 있습니다.
1) system.Text.RegularExpressions.Regex.Methods()
2) system.Text.RegularExpressions.Regex.Replace(Var,"[가-힣]","1").ToString
3) Regex.Replace(Var,"[가-힣]","1").ToString
에러 핸들링과 디버깅
에러 핸들링(Error Handling)은 프로그램이 에러를 감지하고 이에 대응하는 과정을 의미합니다. 에러 핸들링을 통해 시스템은 예상치 못한 문제에 대응하고 복구할 수 있습니다.
디버깅(Debugging)은 프로그램의 오류나 결함을 찾아내고 수정하는 과정입니다. 디버깅은 프로그램이 의도한 대로 작동하지 않을 때 그 원인을 찾는데 사용됩니다.
에러 핸들링과 디버깅을 사용하는 이유
에러 핸들링과 디버깅은 모두 프로그램의 안정성과 신뢰성을 유지하는 데 중요합니다. 에러 핸들링 없이 프로그램은 에러가 발생했을 때 불안정하게 작동하거나 중지될 수 있습니다. 에러 핸들링을 사용하면 프로그램은 에러를 적절히 처리하고, 필요한 경우 사용자에게 알릴 수 있습니다.
디버깅은 프로그램 개발 과정에서 필수적입니다. 디버깅을 통해 개발자는 코드에서 버그를 찾고 수정할 수 있으며, 프로그램의 기능과 성능을 향상시킬 수 있습니다.
에러와 예외처리의 차이점
구분 |
에러(Error) |
예외처리(Exception) |
상황 |
시스템 레벨 발생, 네트워크나 물리적이거나 OS단 이상의 문제 |
로직/프로세스에서 발생, 프로그램/데이터오류 발생, 사람에 의해 발생 |
대응가능여부 |
대체로 대응 불가능(대체로 예방불가능) |
대체로 대응 가능(예방가능) |
대처방법 |
RPA 최 상단 업무(단위의 에러대응처리) |
소규모 단위의Try Catch |
RPA에서의 에러사례
RPA의 에러는 대체로 통제하기 어려운 물리적이나 시스템 적인 문제로 인해 발생합니다. 이러한 문제들에 대응하기 위해 프로젝트별로 대응 프로그램을 제작하는 경우도 있습니다.
RPA를 유지 보수하는 담당자들은 일반적으로 일반 업무 시간(09시~18시)에만 모니터링을 수행합니다. 그렇기 때문에 새벽시간에 에러가 발생하면, 하나의 업무에서 문제가 발생하는 것이 아니라 여러 업무에서 동시에 문제가 발생하게 됩니다.
이러한 문제를 방지하기 위해 RPA 서버를 이중화 하거나 운영 PC에 UPS(무정전 전원 장치)를 설치하는 등의 방법을 사용합니다. 또한, OS 업데이트를 강제로 중지하도록 설정하거나 보안 예외 처리를 적용하는 등의 대책을 마련하기도 합니다. RPA운영실(운영 PC가 모여 있는 공간)은 항상 쾌적한 환경을 유지하도록 항온항습기를 설치하고, 주기적으로 서버와 DB를 점검합니다.
에러 사례
[00홈쇼핑]
RPA가 Internet Explorer에서만 작동하는 업무시스템과 상호작용하다가 일정 확률로 응답 없음 상태에 빠지는 경우. 이 문제를 해결하기 위해, Python을 이용해 응답 없음 상태가 되면 자동으로 RPA 프로그램과 Internet Explorer를 종료하는 'Task Kill' 프로그램을 개발하였습니다.
[00생명]
RPA가 DB 테이블에서 데이터를 조회하다가 멈추는 문제. RPA 내부에 있는 타임아웃 기능을 사용했지만, 문제가 계속 발생했습니다. 이에 대처하기 위해 업무의 최대 수행 시간을 계산하고, 그 시간이 지나면 RPA 프로그램을 강제로 종료하는 bat 파일을 만들었습니다.
RPA에서의 예외사례
예외는 대부분 RPA 로직, 프로그램 오류, 혹은 사용자의 실수로 인해 발생합니다. 이러한 예외상황에 대처하기 위해서는 프로젝트와 시스템에 대한 깊은 이해가 필요합니다.
이러한 예외 처리는 프로젝트의 시간 제약 등을 고려하여 효율적으로 진행해야 합니다. 모든 예외를 처리하는 것은 실용적이지 않으며, 발생 가능한 예외와 실제 발생한 예외에 대해서만 처리하는 것이 일반적입니다.
예외 사례
- 담당자가 매일 오전 8시 이전에 오는 메일을 처리하도록 설정되어 있지만, 메일 제목에 정해진 키워드가 아닌 다른 단어가 포함된 경우
- 정해지지 않은 주기로 시스템에서 오류창이 발생하는 경우
- 웹 페이지의 테이블이나 태그 값이 일정하지 않은 경우
- 특정한 조건에서 오류가 발생하는 경우
- 개발 시 조건문에서 예외상황에 대한 처리를 하지 않은 경우
- 프로그램의 변경으로 인해 RPA 프로그램이 대응하지 못한 경우
- 사전에 정의된 날짜 양식 형태가 yyyy-MM-dd였는데, yy-MM-dd 형태로 변경된 경우
- 웹 사이트의 창 이름이 변경된 경우
- 시간 변화를 고려하지 못한 경우 (시간, 일자, 년도 등이 변경되었을 때를 고려하지 않았을 경우)
예외처리 - 비즈니스 에러(Business Exception)
비즈니스 에러는 데이터 무결성 문제와 프로세스 정합성 문제에 관련됩니다. 이것은 "Business Rule Exception"으로도 알려져 있습니다. 즉, 데이터가 규칙을 준수하지 않거나 프로세스가 예상대로 실행되지 않는 경우에 발생합니다.
우리가 예상한 데이터 형식이 아니거나 필요한 데이터가 누락된 경우, 비즈니스 예외가 발생합니다. 이러한 경우, UiPath는 이를 Business Exception으로 간주하고, 사용자에게 오류를 알리며 해당 프로세스를 중단합니다.
비즈니스 에러 유형
- 잘못된 데이터 형식
시스템이 날짜를 YYYY-MM-DD 형식으로 기대하지만, 실제 입력 데이터는 MM-DD-YYYY 형식인 경우, 이것은 비즈니스 에러로 간주됩니다.
- 누락된 필수 데이터
특정 필드가 비어 있을 경우 이는 비즈니스 예외를 일으킬 수 있습니다. 예를 들어, 주문 시스템에서 주문 정보가 누락된 경우, UiPath는 이를 비즈니스 예외로 간주하고 작업을 중지할 수 있습니다.
- 예상치 못한 데이터 값
신용 카드 번호를 입력할 때 16자리 숫자를 기대하지만, 실제 입력 데이터는 15자리인 경우 이것은 비즈니스 에러로 간주됩니다.
예외처리 - 시스템 에러(Application Exception)
시스템 에러는 프로그램에서 예상치 못한 문제로 발생하는 에러로, "Application Exception" 또는 "System Exception"으로 불립니다. 이러한 문제는 대개 시스템 자원이 고갈되거나 외부 시스템에 접속할 수 없는 등의 기술적인 문제에 기인합니다.
UiPath에서는 이러한 시스템 에러가 발생하면 정해진 횟수만큼 작업을 재시도합니다. 그러나 문제가 계속되면, UiPath는 작업을 중지하고 사용자에게 이러한 오류에 대해 알립니다.
Application Exception은 특정 시스템이 점검 등의 이유로 접속되지 않는 것을 어떤 특정 값으로 확인할 수 있는 경우에도 사용됩니다. 세션이 종료되면 작업이 불가능해 고의로 에러를 발생시키고 새롭게 시도를 해야 하는 경우에도 사용됩니다.
시스템 에러 유형
- 네트워크 문제
UiPath 작업이 외부 서버에 연결해야 하는데, 네트워크 연결이 끊어진 경우 시스템 예외가 발생합니다.
- 리소스 부족
시스템 메모리가 부족하거나 디스크 공간이 부족한 경우, 이것은 시스템 예외로 간주됩니다.
- 시스템 점검/다운타임
UiPath 작업이 데이터베이스에 액세스해야 하는데, 데이터베이스가 점검 중인 경우, 이것은 시스템 예외로 간주됩니다.
Debugging
이 기능을 통해 전체 프로젝트를 디버깅할 수 있습니다. 디버깅은 프로젝트 내의 오류를 찾아내는 과정이며, '디버그' 버튼을 클릭하면 디버깅이 시작됩니다.
버튼 및 단축키 |
기능 |
디버그 (F5) |
전체 프로젝트에 대한 디버그 실행, 출력패널 에 에러메시지와 오류발생 액티비티에 빨간색 테두리가 발생합니다. |
실행 (Ctrl+F5) |
전체 프로젝트를 실행합니다. 에러가 발생하면 에러메시지를 팝업창으로 띄우고 에러발생 액티비티로 이동합니다. |
파일디버그 (F6) |
현재 파일에 대한 디버그 실행, 출력패널에 에러메시지와 오류발생 액티비티에 빨간색 테두리가 생깁니다. |
파일실행 (Ctrl+F6) |
현재 파일을 실행합니다. 에러 발생하면 에러메시지를 팝업창으로 띄우고 에러발생 액티비티로 이동합니다. |
중지 (F12) |
디버깅을 하거나 실행 중에 있을 때 중지합니다. |
■ 한 단계씩 코드실행(Step Into)
이 기능은 한 번에 하나의 액티비티 단위로 디버깅을 진행하게 해줍니다. 이를 통해 프로젝트의 각 부분이 어떻게 작동하는지 세밀하게 관찰할 수 있습니다.
■ 프로시저 단위실행(Step Over)
이 기능은 현재 컨테이너를 열지 않고 다음 액티비티를 디버깅합니다. 이 기능은 큰 컨테이너의 분석을 건너뛸 때 유용합니다.
■ 프로시저 나가기(Step Out)
현재 컨테이너의 수준에서 실행을 일시 중지하기 위해 사용됩니다.
■ 재시도(Retry)
이 기능은 이전 액티비티를 다시 실행하며, 같은 예외가 다시 발생하면 예외를 던집니다.
■ 무시(Ignore)
이 기능은 발생한 예외를 무시하고 다음 액티비티부터 실행을 계속하는 데 사용됩니다.
■ 재시작(Restart)
이 기능은 디버깅 과정을 프로젝트의 첫 액티비티부터 다시 시작하는 데 사용됩니다.
■ 브레이크포인트(Breakpoints)
브레이크포인트는 디버깅이 일시 중지되어야 하는 특정 지점을 설정하는 데 사용됩니다.
■ 느린 단계(Slow Step)
디버깅 과정을 느리게 하여 액티비티가 어떻게 실행되는지 세밀하게 관찰할 수 있게 해줍니다.
■ 실행 후행(Execution Trail)
디버깅 도중 어떤 경로로 프로세스가 실행되었는지 명확하게 보여주는데 유용합니다. 이 기능이 활성화되면, 디자이너 패널에서 각 활동이 강조되어 실행 경로를 시각적으로 표시합니다. 즉, 실행된 활동은 초록색으로 표시되며, 예외가 발생한 활동은 빨간색으로 표시됩니다.
■ 엘리먼트 강조표시(Highlight Elements)
디버깅 중에 UI 요소를 강조표시 합니다. 정규 디버깅과 단계별 디버깅에 모두 사용할 수 있습니다.
■ 예외 발생 시 계속(Continue on Exception)
예외가 발생할 때 디버깅을 중지하지 않고 계속 진행할지를 결정하는 기능입니다. 기본적으로 이 기능은 비활성화되어 있으며, 예외가 발생하면 실행 오류를 발생시키고 디버깅을 중지합니다. 하지만 이 기능을 활성화하면, 예외는 출력 패널에 기록되지만 실행은 계속됩니다.
■ PIP (Picture in Picture)
Picture in Picture 기능은 프로세스 또는 라이브러리를 별도의 세션에서 실행하거나 디버깅할 수 있게 합니다. 이 기능을 활성화하면, 'Run' 또는 'Debug'를 선택할 때마다 프로세스가 별도의 세션 또는 가상 데스크톱에서 시작됩니다.
■ 원격 디버깅(Remote Debugging)
원격 디버깅을 사용하면 모든 실행 및 디버그 작업을 로컬에 설치된 로봇 대신 지정된 원격 로봇에서 수행할 수 있습니다. 이를 통해 다양한 환경에서 자동화를 테스트할 수 있습니다.
■ 프로필 실행(Profile Execution)
이 기능은 파일을 디버깅함으로써 워크플로우에서 성능 병목 현상을 식별할 수 있게 합니다. 프로세스의 어떤 부분이 느리게 작동하는지, 어떤 활동이 가장 많은 시간을 소모하는지 등을 알 수 있습니다.
■ 로그 열기(Open Logs)
'Open Logs'를 클릭하면 로그가 로컬 파일 탐색기에서 열립니다. 로그 파일에는 작업의 실행 관련 세부 정보가 포함되어 있습니다. 이 정보는 오류를 진단하거나 프로세스 실행 세부 정보를 검토하는 데 사용할 수 있습니다.
로컬 패널(The Locals Panel)
활동의 속성이나 사용자 정의 변수와 인수를 보여줍니다. 디버깅하는 동안에만 보이며, 변수, 인수, 현재 실행 중인 활동의 속성을 오른쪽 클릭하여 보기패널에 추가하고 디버깅 과정에서 그것의 실행을 모니터링할 수 있습니다. 디버깅이 일시 중지되면, 현재 활동의 속성과 변수, 인수의 값을 수정할 수 있습니다.
출력 패널(Output Panel)
출력 패널은 실행 중이거나 완료된 워크플로우에서 로그 메시지, 오류 메시지, 디버깅 정보, 추적 메시지를 표시합니다. 이는 실행 중인 프로세스의 진행 상황을 실시간으로 파악하거나, 문제 해결을 위해 이전의 실행 상황을 검토하는 데 유용합니다.
호출 스택 패널(The Call Stack Panel)
디버깅이 일시 중지될 때 실행될 다음 활동과 그 부모 컨테이너를 표시합니다. 디버깅 모드에서 실행 중일 때 표시되며, Step Into, Break, Slow Step를 사용하거나 오류나 중단점 때문에 실행이 일시 중지된 후에 채워집니다.
브레이크 패널(The Breakpoints Panel)
브레이크포인트는 실행 문제를 발생시킬 수 있는 활동에서 디버깅 과정을 의도적으로 일시 중지하는 데 사용됩니다. 브레이크포인트를 토글하기 위해선 단일 활동이 선택되어야 합니다. 그러나 필요한 만큼 많은 브레이크포인트를 토글할 수 있습니다. 브레이크포인트가 설정된 후 워크플로우의 활동 순서가 변경되지 않도록 주의해야 합니다. 설정된 브레이크포인트는 자동화 프로젝트를 다시 열 때도 유지됩니다. 브레이크포인트는 런타임에는 유지되지 않고, 디버깅할 때만 유지됩니다.
구분 |
브레이크 패널 |
|
활성화 된 브레이크 포인트 (Enabled) |
|
비 활성화 된 브레이크 포인트 (Disabled) |
조건분기를 활용한 예외처리
RPA로 인터넷 브라우저를 사용해 정보를 검색하려고 할 때, 원하는 웹페이지가 로딩되지 않았다면 어떻게 될까요? 이런 경우를 위해 조건 분기를 활용할 수 있습니다. Element Exists 액티비티를 사용하여 웹 페이지가 완전히 로드되었는지 확인하고, 만약 로드되지 않았다면 Delay 액티비티를 사용해 몇 초간 기다렸다가 다시 하는 방법으로 로봇이 웹페이지가 완전히 로딩 될 때까지 기다리는 동작을 반복하게 만드는 식으로 조건 분기를 만들 수 있습니다.
Try Catch 액티비티 사용을 활용한 예외처리
Try Catch 액티비티는 코드가 예상치 못한 문제를 만났을 때 프로그램이 강제로 종료되는 것을 방지합니다. 예를 들어, 로봇이 파일을 열려고 했지만 해당 파일이 없거나 접근이 불가능할 수 있습니다. 이런 경우, 로봇은 "Try" 섹션에서 오류를 발생시키고, "Catch" 섹션에서 예외를 처리하게 됩니다. 이는 로봇이 오류를 안전하게 처리하고 프로그램을 계속 실행할 수 있게 합니다.
Try
여기에는 오류가 발생할 가능성이 있는 액티비티를 배치합니다. 이 섹션에서 오류가 발생하면, 실행 흐름은 Catches 섹션으로 이동합니다. 또한 이 섹션에서는 액티비티가 자동으로 예외를 발생시키는 경우와 사용자가 명시적으로 Throw 액티비티를 사용하여 예외를 발생시키는 경우를 구분할 수 있습니다.
Catches
여기에는 오류가 발생했을 때 수행될 액티비티를 배치합니다. 또한, 예외의 유형을 정의합니다. 여러 유형의 예외를 정의하고 각각에 대한 처리를 수행할 수 있습니다. 예를 들어, 모든 오류를 구분하지 않고 동일하게 처리하려면 System.Exception을 추가하여 오류 처리를 구성할 수 있습니다. 비즈니스 예외와 그 외의 모든 오류를 구분하여 처리하려면 Business Rule Exception과 System.Exception을 추가할 수 있습니다.
Finally
이 섹션에 배치된 액티비티는 오류의 발생 여부에 상관없이 실행됩니다. 이는 마무리 작업이나 필요한 정리 작업을 수행하는 데 유용합니다.
ContinueOnError속성 - True사용
액티비티의 속성에서 Continue On Error 항목을 활용합니다. (기본값 False) 액티비티 속성의 공통-ContinueOnError 항목은 오류 발생 시 실행을 계속 할지 여부를 지정하는 항목입니다. 해당 항목이 True가 설정되면 범위 내에 다른 활동에서 발생하는 모든 오류도 무시 됩니다. 데이터 스크래핑을 하는 동안이나 단순히 활동자체에 실행의미를 둘 때 사용하는 등 특정한 상황에서 사용합니다.
Throw를 활용한 예외처리
Throw 액티비티는 특정 조건을 만족할 때 의도적으로 예외를 발생시키는 데 사용됩니다. 예를 들어, 워크플로우에서 예상치 못한 상황이 발생하거나, 특정 비즈니스 규칙이 준수되지 않았을 때 Throw 액티비티를 사용하여 예외를 발생시킬 수 있습니다. 이 예외는 그 다음에 오는 Catch 블록에서 잡아낼 수 있습니다.
다음과 같은 구문을 사용하여 예외를 발생시킬 수 있습니다.
1. 일반적인 예외: new Exception(“에러 메시지")
2. 비즈니스 규칙 예외: new BusinessRuleException("비즈니스 에러메시지")
이렇게 발생시킨 예외는 후속 Catch 액티비티에서 처리될 수 있습니다.
ReThrow 를 활용한 예외처리
일반적으로, Catch 블록에서 예외를 처리하면 그 예외는 더 이상 "던져지지" 않습니다. 즉, 예외가 발생했던 원래의 위치에서 워크플로우가 계속 진행됩니다. 그러나, 경우에 따라 이런 방식이 원하는 바가 아닐 수 있습니다.
로그에 예외를 기록하거나 특정 리소스를 정리한 후에 예외를 다시 발생시키고 싶을 수 있습니다. 이런 상황일 때 ReThrow 액티비티를 주로 사용합니다.
ReThrow 액티비티는 Catch 블록에서 처리된 예외를 다시 발생시킵니다. 이는 Catch 블록 바깥으로 예외를 "다시 던지는" 효과를 가지며, 이를 통해 상위 레벨의 예외 처리 루틴에서 해당 예외를 다시 잡아낼 수 있습니다. 이렇게 하면 Catch 블록 내에서 어떤 처리를 한 후에도 예외를 계속 보존할 수 있습니다.
마지막으로, ReThrow 액티비티는 예외 처리 블록(Catch) 내에서만 사용할 수 있습니다. 예외 처리가 아닌 곳에서 ReThrow를 사용하면 워크플로우 실행 중에 오류가 발생합니다.
Retry Scope 액티비티를 활용한 예외처리
Retry Scope 액티비티는 특정 액티비티 또는 시퀀스에 대해 정의된 조건이 충족될 때까지 재시도를 수행하는 데 사용됩니다. 이 액티비티는 처리 중에 예외가 발생할 경우, 재시도를 통해 해당 과정을 성공적으로 완료하려는 의도로 사용됩니다. 이 액티비티는 두 부분으로 구성됩니다.
1. 액션(Action): 재시도를 원하는 액티비티나 시퀀스를 배치하는 곳입니다. 이는 예외가 발생할 가능성이 있는 곳입니다.
2. 조건(Condition): 재시도를 결정하는 조건을 정의하는 액티비티를 배치하는 곳입니다. 일반적으로 Element Exists, Image Exists 등과 같이 Boolean 값을 반환하는 액티비티를 사용합니다.
3. 설정에서는 재시도 횟수와 각 재시도 사이의 대기 시간을 지정할 수 있습니다.
주의할 점은 Retry Scope 액티비티를 사용할 때 재시도를 통해 성공할 가능성이 있는 작업만을 시퀀스에 추가해야 합니다. 이를 통해, 일시적인 네트워크 문제나 애플리케이션 응답 지연 등의 일시적인 문제로 인해 실패한 작업을 성공적으로 완료할 수 있습니다.
Take Screenshot 액티비티를 활용한 예외처리
이 액티비티는 로봇이 작업 중인 화면의 스크린샷을 캡처하는 데 사용됩니다. 예를 들어, 웹 스크래핑 작업 중 오류가 발생한 경우, 로봇은 Take Screenshot 액티비티를 사용해 오류가 발생한 시점의 화면을 캡처할 수 있습니다. 이는 디버깅 과정에서 매우 유용합니다.
예외(Exception) 관련 메소드
예외(Exception)는 프로그램 실행 중에 발생할 수 있는 여러 가지 오류 상황을 나타내는 객체입니다. 예외 객체는 예외가 발생한 상황과 원인에 대한 정보를 포함하고 있으며, 이 정보는 프로그래머가 오류를 분석하고 대응할 수 있게 도와줍니다.
.NET에서 제공하는 Exception 클래스는 여러 가지 메서드와 속성을 가지고 있습니다. UiPath도 .NET 기반 언어인 VB.NET을 사용하기 때문에, 이들 메서드와 속성을 UiPath에서도 사용할 수 있습니다.
- ■ Message : 예외에 대한 설명을 담고 있는 문자열입니다. 이 속성은 예외가 발생한 이유에 대한 정보를 제공합니다.
- ■ StackTrace : 예외가 발생한 시점의 호출 스택을 나타내는 문자열입니다. 호출 스택은 메서드 호출이 이루어진 순서를 나타내며, 이 정보를 통해 예외가 발생한 코드 위치를 파악할 수 있습니다.
- ■ InnerException : 현재 예외를 발생시킨 이전 예외를 나타내는 Exception 객체입니다. 이 속성은 예외가 여러 단계에 걸쳐 발생한 경우에 유용합니다.
- ■ GetType : 예외의 타입을 반환하는 메서드입니다. 이 메서드를 통해 예외의 실제 클래스를 파악할 수 있습니다.
- ■ ToString : 예외의 문자열 표현을 반환하는 메서드입니다. 이 메서드는 예외의 Message, Name, StackTrace 등을 포함한 정보를 문자열 형태로 제공합니다.
이외에도 Exception 클래스는 Data, HelpLink, TargetSite 등의 속성을 제공합니다. 이들 속성은 예외 처리를 좀 더 상세하고 유연하게 할 수 있도록 도와줍니다.
Exception 항목 |
설명 |
NullReferenceException |
설정값이 없는 변수를 사용 할 때 발생 |
IndexOutOfRangeException |
개체의 인덱스가 컬렉션 제한을 벗어날 때 발생 |
ArgumentException |
메소드 호출 후 전달 인수 중 하나 이상이 호출 된 메소드의 매개 변수 사양을 충족하지 않을 때 Throw |
SelectorNotFoundException |
시간 내 대상 앱의 활동에 대해 지정된 선택기를 찾을 수 없는 경우 발생 |
ImageOperationException |
시간 내에 이미지를 찾을 수 없는 경우 발생 |
TextNotFoundException |
시간 내 텍스트를 찾을 수 없는 경우 발생 |
ApplicationException |
응용 프로그램 문제와 같은 기술적인 문제에 기인한 오류 |
BusinessRuleException |
비즈니스 예외로 하는 오류 발생 시 Throw 정의하는 예외 |
IO.FileNotFoundException |
대상 파일을 찾을 수 없는 경우 Throw |
TimeoutException |
지정된 대기 시간에 요소를 찾을 수 없는 경우 Throw |
Exception |
모든 에러를 예외로 하여 Throw |
로그메시지 활용하기
오류가 발생 했을 때 로그 레벨(Log Level)에 맞게 로그를 작성합니다. Log Message 액티비티를 사용하여 에러레벨을 아래 기준으로 설정하여 필요한 정보를 기록 할 수 있습니다. 5가지 레벨로 설정이 가능합니다.
로그레벨
로그레벨 |
설명 |
Fatal (치명적 오류) |
치명적인 오류를 뜻함, 업무를 중지 할 만큼의 심각한 오류일 때 사용 |
Error (오류) |
오류발생으로 액션이 필요할 때 사용 Try Catch의 Catches에 배치 |
Warn (경고) |
정상실행에는 실패했으나 자동으로 회복이 가능한 경우 사용
Retry Scope에서 재시도 가능할 경우 배치, 추가확인이 필요한 경우에도 사용 |
Info (정보) |
워크플로우나 시퀀스의 시작, 정보, 종료 등을 기록
( 조회건수, 조회성공여부, 처리결과 등 ) |
Trace (추적) |
액티비티의 실행, 정보, 종료 등을 기록 (로그인, 화면접속 등 기본로그) |
Exception 속성
Exception 속성 |
설명 |
exception.Message |
예외로 정의되어 있는 메시지 |
exception.Source |
오류가 발생한 프로그램이나 액티비티의 이름 |
exception.StackTrace |
에러에 오기까지 액티비티가 실행되는 행동을 포함한 상세한 정보 |
LINQ의 정의와 개념
LINQ는 Language Integrated Query의 약자로, C# 등 .NET 언어에서 다양한 데이터 소스에 대해 SQL과 유사한 쿼리 구문을 사용하여 데이터를 검색하고 조작할 수 있는 기능을 제공합니다. LINQ를 사용하면 데이터베이스, 컬렉션, XML 문서 등 여러 데이터 소스와 호환되며, 일관된 방식으로 데이터를 처리할 수 있습니다. 쉽게 말해, C#에서 데이터에 대해 질문을 하고, 해당 질문을 통해 데이터를 찾아가는 방식으로 이해할 수 있습니다.
LINQ의 장점과 기본 구문
LINQ의 주요 장점은 코드의 가독성을 높이고 유지보수를 용이하게 한다는 점입니다. 데이터베이스에서 SQL 구문을 사용해 데이터를 질의해본 경험이 있는 개발자라면 LINQ를 쉽게 이해하고 사용할 수 있을 것입니다. 예를 들어, 컬렉션에서 특정 조건을 만족하는 요소를 찾는 작업을 LINQ를 통해 한 줄의 코드로 간단히 표현할 수 있습니다. 기본 LINQ 구문은 from 임의요소 변수 in 데이터소스 변수, where 조건, select 데이터
의 형식을 따릅니다.
LINQ 예제
var linqExperts = from p in programmers
where p.IsNewToLINQ
select new LINQExpert(p);
위 예제는 C#에서 LINQ를 사용하여 'programmers' 컬렉션에서 'IsNewToLINQ' 조건을 만족하는 요소를 찾아 'LINQExpert' 객체로 변환하는 코드를 보여줍니다. 이처럼 LINQ를 사용하면 데이터 소스에서 간단한 구문으로 데이터를 검색하고 조작할 수 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다.
LINQ 식 예제
구분 |
LINQ 식 |
설명 |
Array |
Array변수.OrderByDescending(Function(x) x).ToArray() // Array변수.OrderBy(Function(x) x).ToArray() |
List에서 Sort |
Datatable |
( From row In Datatable변수.AsEnumerable Group row By k = row("컬럼명1") Into grp=Group Select dt_test.LoadDataRow({k, grp.Sum(Function(gr) CDbl(gr("컬럼명2")))}, True) ).CopyToDataTable
|
해당 컬럼명1에 대한 컬럼명2 피벗테이블 |
Datatable |
Datatable변수1.AsEnumerable().Where(Function(row) Not Datatable변수2.AsEnumerable().Where(Function( r ) r(“컬럼명1”).ToString.Equals(row(“컬럼명1”).ToString )And r(“컬럼명2”).ToString.Equals(row(“컬럼명2”).ToString) And r(“컬럼명3”).ToString.Equals(row(“컬럼명3”).ToString )).Any).CopyToDataTable
|
두 데이터 테이블 주어진 컬럼명에서 겹치지 않는 데이터 행에 대한 값을 가져옴 |
Datatable |
Datatable변수1.AsEnumerable().Where(Function(row) Datatable변수2.AsEnumerable().Where(Function( r ) r(“컬럼명1”).ToString.Equals(row(“컬럼명1”).ToString )And r(“컬럼명2”).ToString.Equals(row(“컬럼명2”).ToString) And r(“컬럼명3”).ToString.Equals(row(“컬럼명3”).ToString )).Any).CopyToDataTable
|
두 데이터 테이블 주어진 컬럼명에서 겹치는 데이터 행에 대한 값을 가져옴 |
Datatable |
Datatable변수.AsEnumerable().Select(Function(x) x("컬럼명").ToString ).ToArray() |
데이터테이블 특정 컬럼의 데이터를 배열Array로 변환 |
Datatable |
(From row in Datatable변수.AsEnumerable() Select Convert.Tostring(row"컬럼명"))).ToList()
|
데이터테이블 특정 컬럼의 데이터를 배열List로 변환 |
Datatable |
Datatable변수.AsEnumerable().Take(500).CopyToDataTable() |
500줄로 제한하는 코드이다(맨 윗줄부터 500줄) |
Datatable |
(From r In Datatable변수.AsEnumerable Let ra = r.ItemArray.Select(Function (x) x.ToString.Trim.Replace("AAA","")).toArray() Select testDT.Rows.Add(ra)).CopyToDataTable()
|
데이터테이블 특정 행 값을 replace하고 싶을 때 |
Datatable |
Datatable변수.Asenumerable.Tolist.Findindex(Function(r) r("컬럼명").Tostring.Equals("특정값")) |
특정 값이 첫번째로 있는 index를 반환 (값이 없을 시 -1) |
Datatable |
Datatable변수.AsEnumerable.OrderBy(function(x) Cdbl(x("컬럼명").ToString)).CopyToDataTable |
데이터 테이블을 정렬 Cdbl , Cstr 형식으로 변환가능 |
Datatable |
Datatable변수.AsEnumerable.Where(Function(r) r.Item("컬럼명").ToString.Equals("찾을단어")).CopyToDataTable |
데이터테이블 컬럼 특정단어 필터 |
REFramework의 정의
REFramework은 Robotic Enterprise Framework의 약자로 State Machine (상태머신)기반으로 하는 프로젝트 템플릿입니다. UiPath에서 공식적으로 로깅, 예외처리, 애플리케이션 초기화에 관하여 모범 사례에 맞게 만들어졌습니다. 해당 템플릿에는 애플리케이션 초기화, 입력 데이터 검색, 처리 및 트랙잭션 종료를 위해 미리 만들어진 여러 상태 컨테이너가 포함되어 있습니다. 이러한 모든 상태는 표준화된 자동화 시나리오의 요구 사항을 충족하고 효율적이며 안정적으로 업무를 처리 할 수 있도록 도와줍니다.
VB 및 C# 프로젝트 모두에서 사용 할 수 있으며, 기본 종속성은 UiPath.Excel.Activities, UiPath.System.Activities 및 UiPath.UIAutomation.Activities 입니다.
사용 목적은 자동화 프로세스 구현을 위한 템플릿 제공과 기본적인 자동화 코드 초안 제공, 설정 파일 읽기 및 저장하는 방법의 제공, 견고한 예외처리 방안 제공, 처리에 따른 이벤트 및 관련 트랜잭션 정보 로깅 방안 제공에 있습니다.
프레임워크란?
프레임워크란 소프트웨어 어플리케이션이나 솔루션의 개발을 수월하게 하기 위해 소프트웨어의 구체적인 기능들에 해당하는 부분의 설계와 구현을 재사용 가능하도록 협업화된 형태로 제공하는 소프트웨어 환경을 말합니다.
REFramework의 구성
REFramework(Robotic Enterprise Framework)은 크게 Initialization(초기화 설정), Get Transaction Data(데이터 가져오기), Process Transaction (프로세스 처리), End Process(프로세스 종료) 4단계로 구분 할 수 있습니다. REFramework 프로세스를 만들면 자동으로 아래의 플로우 형태로 만들어지는 것을 볼 수 있습니다. 또한 기본적으로 프로젝트 탭에 여러 개의 폴더와 파일이 만들어 지는 것 또한 확인 할 수 있습니다.
State Machine 액티비티 안에서 사용하는 State 액티비티는 Entry, Exit, Transaction(s) 3가지의 영역이 있습니다.
- Entry: state가 입력될 때 수행될 액티비티들을 포함한 영역
- Exit: state가 종료될 때 수행될 액티비티들을 포함한 영역
- Transaction(s): 해당 state가 다른 state와 어떠한 관계를 갖는지 나타내는 영역
REFramework의 구성 - 프로젝트
REFramework로 프로세스를 만들면 프로젝트 탭에 기본적으로 다양한 폴더와 .xaml파일들이 생성되는 것을 볼 수 있습니다.
아래와 같은 폴더를 중점적으로 볼 필요가 있습니다.
- Data폴더의 Input (입력파일 저장용 폴더)
- Data폴더의 Output (출력파일 저장용 폴더)
- Data폴더의 Temp폴더 (임시파일 저장용 폴더)
- Data폴더의 Temp폴더의 Config.xlsx (REFramework설정파일)
- Framework폴더 (관련 xaml파일 집합)
REFramework의 xaml 구성요소
구성요소 |
State 액티비티 |
설명 |
Main.xaml |
|
메인 |
InitAllSettings.xaml |
Initialization |
초기화 설정 |
KillAllProcesses.xaml |
Initialization |
관련된 응용프로그램 강제 종료(구현 필요) |
InitAllApplications.xaml |
Initialization |
필요한 응용프로그램 실행(구현 필요) |
GetTransactionData.xaml |
Get Transaction Data |
업무 처리에 필요한 데이터 획득 |
Process.xaml |
Process Transaction |
업무 처리 수행(구현 필요) |
SetTransactionStatus.xaml |
Process Transaction |
업무 처리 상태 변경 |
TakeScreenshot.xaml |
Process Transaction |
전체화면 캡처 |
CloseAllApplications.xaml |
Process Transaction |
재시작을 위한 응용프로그램 종료(구현 필요) |
KillAllProcesses.xaml |
Process Transaction |
관련된 응용프로그램 종료(구현 필요) |
CloseAllApplications.xaml |
End Process |
종료를 위한 응용프로그램 종료(구현 필요) |
KillAllProcesses.xaml |
End Process |
관련된 응용프로그램 강제 종료(구현 필요) |
REFramework의 전역변수
변수명 |
타입 |
변수가 쓰이는 곳 |
변수를 읽는 곳 |
TransactionItem |
QueueItem |
GetTransactionData.xaml |
"Process.xaml, SetTransactionStatus.xaml" |
TransactionData |
DataTable |
GetTransactionData.xaml |
GetTransactionData.xaml |
SystemError |
Exception |
Main.xaml |
"Main.xaml, SetTransactionStatus.xaml" |
BusinessRuleException |
BusinessRuleException |
Main.xaml |
"Main.xaml, SetTransactionStatus.xaml" |
TransactionNumber |
Int32 |
SetTransactionStatus.xaml |
GetTransactionData.xaml |
Config |
Dictionary(x:String, x:Object) |
InitAllSettings.xaml |
"InitAllApplications.xaml, GetTransactionData.xaml, Process.xaml, SetTransactionStatus.xaml" |
RetryNumber |
Int32 |
SetTransactionStatus.xaml |
SetTransactionStatus.xaml |
REFramework의 로깅(logging)
Message |
WorkFlow |
Log Level |
in_Config("LogMessage_ApplicationException").ToString + "Max number of retries reached." + in_SystemError.Message + "at Source:" + in_SystemError.Source |
SetTransactionStatus.xaml |
Error |
in_Config("LogMessage_ApplicationException").ToString + " Retry: " + io_RetryNumber.ToString + ". " + in_SystemError.Message + " at Source: " + in_SystemError.Source |
SetTransactionStatus.xaml |
Warn |
in_Config("LogMessage_ApplicationException").ToString + in_SystemError.Message + " at Source: " + in_SystemError.Source |
SetTransactionStatus.xaml |
Error |
"Take screenshot failed with error: " + exception.Message + " at Source: " + exception.Source |
SetTransactionStatus.xaml |
Warn |
"CloseAllApplications failed. " + exception.Message + " at Source: " + exception.Source |
SetTransactionStatus.xaml |
Warn |
"KillAllProcesses failed. " + exception.Message + " at Source: " + exception.Source |
SetTransactionStatus.xaml |
Warn |
"Screenshot saved at: " + io_FilePath |
TakeScreenshot.xaml |
Info |
Closing applications… |
CloseAllApplications.xaml |
Info |
Killing processes… |
KillAllProcesses.xaml |
Info |
Initialization(초기화 설정)
이니셜리제이션(Initialization) 단계는 전체 단계 중 초기화 설정을 하는 단계로 관련된 프로그램을 종료하는 역할을 합니다. First run 시퀀스의 경우 첫 시작일 경우에 InitAllSettings.xaml 파일을 열어 공통으로 쓰는 설정이나 변수 Asset 등을 지정해주는 일을 합니다. 해당 값은 Data 폴더 안의 Config.xlsx 파일 안의 “Settings”, “Constants” 시트에 있는 내용을 읽어 전역 변수인 out_Config에 저장하고 “Assets” 시트에는 Orchestrator Asset에서 데이터를 읽어옵니다. 이후 KillAllProcesses.xaml 파일을 통해 업무 시작 전 모든 프로그램을 종료하는 작업을 합니다. (사용자가 직접 액티비티나 bat 파일 등을 사용하여 종료하는 작업을 지정해줘야 됩니다.)
Data 폴더의 Config.xlsx 파일은 Settings, Constants, Assets 시트로 구성된 엑셀파일입니다. Setting은 설정 내용, Constants는 변수 내용, Asset은 Orchestrator Asset에서 가져올 내용을 작성. 작업에 범용적으로 사용될 변수를 Config 파일에 작성하여 Dictionary로 사용한다. (예. 작업 폴더 경로 등)
InitAllSettings.xaml
지정된 설정 파일로부터 변수/설정 값을 읽어 Config 변수에 저장합니다. 이 변수는 전체 프로세스에서 사용됩니다. (재시작 시에서는 호출되지 않습니다.)
변수 타입 및 이름 |
전달방식 |
변수 값 |
String: in_ConfigFile |
Input |
"Data\Config.xlsx" |
String[]: in_ConfigSheets |
Input |
{"Settings", "Constants"} |
Dictionary(x:String, x:Object): out_Config |
Output |
Config |
InitAllApplication.xaml
업무 처리에 필요한 어플리케이션을 초기화(혹은 실행함)합니다.
구성요소 |
전달방식 |
변수 값 |
String: in_Config |
Input |
Config |
Initialization 상태전이
상태전이는 Transition(s)으로 표시되며 특정 조건 시 전이 대상으로 전이 됩니다.
- System Error: 초기화 상태에서 오류가 발생 시 End Process 상태로 이동
- Success: 초기화 상태에서 오류가 없다면 Get Transaction Data 상태로 이동
전이명 |
조건 |
전이대상 |
Success |
SystemError is Nothing |
Get Transaction Data(State) |
System Error |
SystemError isNot Nothing |
End Process |
Entry
Workflow 이름 |
작업 내용 |
InitAllSettings.xaml |
초기 설정이나 작업 전반적으로 사용되는 변수, Asset을 지정 |
KillAllProcesses.xaml |
작업 전 필요하지 않은 응용프로그램을 종료해 작업 환경 정리 |
InitAllApplications.xaml |
작업에 필요한 응용프로그램을 실행하는 단계 |
※ InitAllSettings.xaml: 패키지 내 Data\Temp\Config.xlsx 파일을 Dictionary 형식의 변수로 읽어서 출력 인수 out_Config로 반환
Process Transaction (프로세스 처리)
프로세스 트랜잭션(Process Transaction) 단계는 실제 업무를 처리하는 단계로, 이전까지는 전후 설정 단계를 지정해줬다면 Process Transaction 단계에서는 실제 업무 프로세스를 개발하여 진행하면 됩니다. Process Transaction 단계를 시작할 때 아무 오류가 없다면 Process.xaml를 실행하고, Process.xaml를 실행한 뒤 오류를 체크하는 Set Transaction Status.xaml 단계를 거치게 됩니다. 여기서 Exception이 발생하면 Exception 변수를 Exception으로 지정합니다.
Process.xaml에서 BusinessRuleException이 발생하면 BusinessException 변수를 Exception으로 지정하고, Set Transaction Status.xaml에 진입하게 됩니다. 여기서 Exception이 발생하면 Exception 변수를 Exception으로 지정합니다. Process.xaml에서 Exception이 발생하면 SystemException 변수를 Exception으로 지정하고, Set Transaction Status.xaml에 진입하게 됩니다. 여기서 Exception이 발생하면 Exception 변수를 Exception으로 지정합니다.
Entry
Workflow 이름 |
작업 내용 |
Process.xaml |
실제로 RPA가 실행되고자 하는 프로세스를 개발하는 부분 |
SetTransactionStatus.xaml |
Process에서 작업을 마친 Transaction의 상태를 변경하는 부분 |
※ Entry의 Process.xaml는 Try-Catch의 Try 안에서 호출되고, Peocess.xaml에서 Business Exception이나 SystemException이 발생되면 Catch에서 Assign으로 에러를 각 변수에 저장하고 Finally를 통해 SetTransactionStatus.xaml를 호출합니다.
※ SetTransactionStatus는 각 조건에 따라 작업이 완료된 Transaction상태를 설정. Success/ Business Exception/ SystemException 세 가지로 설정되며, SystemException 시퀀스에서는 현재 Transaction을 재시도 할 수 있도록 설정 및 에러 상태 캡처, 모든 응용프로그램 종료를 합니다.
Set Transaction Status.xaml
Set Transaction Status.xaml은 Process.xaml을 실행 후 Transaction의 상태를 변경하는 파일입니다. 첫 시작에서 in_BusinessException is Nothing and in_SystemException is Nothing (비즈니스 오류나 시스템 오류가 없다면 정상) 조건이 True라면 [Success]로 넘어가고 성공 여부를 로그에 기록하게 됩니다. 그 다음 [Increment transaction index and reset retries]로 넘어가서 io_TransactionNumber를 +1, io_RetryNumber을 0, io_ConsecutiveSystemExceptions을 0으로 설정하고 다음 작업을 처리합니다.
첫 시작에서 in_BusinessException is Nothing and in_SystemException is Nothing (비즈니스 오류나 시스템 오류가 있다면) 조건이 False라면 다시 한 번 해당 오류가 in_BusinessException isNot Nothing (비즈니스 오류 여부)인지 확인하고, 비즈니스 오류라면 True로 [Business Exception]으로 넘어가고 로그를 기록합니다. 그 다음 [Increment transaction index and reset retries]로 넘어가서 io_TransactionNumber를 +1, io_RetryNumber을 0, io_ConsecutiveSystemExceptions을 0으로 설정하고 다음 작업을 처리합니다.
첫 시작에서 in_BusinessException is Nothing and in_SystemException is Nothing (비즈니스 오류나 시스템 오류가 있다면) 조건이 False라면 다시 한 번 해당 오류가 in_BusinessException isNot Nothing (비즈니스 오류 여부)인지 확인하고, 비즈니스 오류가 아니라면 [System Exception]으로 넘어가고, 그 다음 로그와 스크린샷으로 기록하게 됩니다. io_ConsecutiveSystemExceptions를 +1 증감시키고, Retry Current Transaction.xaml 파일을 실행시킵니다.
Process Transaction 단계에서 [System Exception]일 경우에는 Initialization 단계로 이동하고, Initialization 단계에서 [System Exception]이 있는 경우 End Process 단계로 이동하여 REFramework를 종료합니다. Process Transaction 단계에서 [Business Exception]이나 [Success]라면 Get Transaction Data 단계로 이동하게 됩니다.
Retry Current Transaction.xaml
Retry Current Transaction.xaml 파일은 에러 상황이 발생했을 때, 재수행 여부를 확인하는 파일입니다. 첫 번째로 Convert.ToInt32(in_Config("MaxRetryNumber")) > 0 조건을 통해 Config.xlsx의 파일의 Constants 시트의 MaxRetryNumber 항목의 재수행 횟수 값이 1 이상인지를 확인합니다. (MaxRetryNumber 기본값은 0)
MaxRetryNumber의 값이 0이라면 io_TransactionNumber의 값을 1 증감시키고 Retry Current Transaction.xaml을 종료하고 다시 System Exception으로 돌아와 CloseAllApplications.xaml을 실행시켜 프로그램을 모두 종료시키고 Process Transaction 단계에서 Initialization 단계로 이동합니다.
MaxRetryNumber의 값이 1 이상이고 현재 에러 값이 설정한 재수행 에러 값보다 큰지 여부를 확인할 때, io_RetryNumber >= Convert.ToInt32(in_Config("MaxRetryNumber")) 크다면, io_RetryNumber의 값을 0으로, io_TransactionNumber의 값을 +1 증감시키고 Retry Current Transaction.xaml을 종료하고 다시 System Exception으로 돌아와 CloseAllApplications.xaml을 실행시켜 프로그램을 모두 종료시키고 Process Transaction 단계에서 Initialization 단계로 이동합니다.
MaxRetryNumber의 값이 1 이상이고 현재 에러 값이 설정한 재수행 에러 값보다 큰지 여부를 확인할 때, io_RetryNumber >= Convert.ToInt32(in_Config("MaxRetryNumber")) 작다면 in_QueueRetry의 값을 확인하고 있다면 io_TransactionNumber의 값을 +1 증감시키고 다시 System Exception으로 돌아와 CloseAllApplications.xaml을 실행시켜 프로그램을 모두 종료시키고 Process Transaction 단계에서 Initialization 단계로 이동합니다.
MaxRetryNumber의 값이 1 이상이고 현재 에러 값이 설정한 재수행 에러 값보다 큰지 여부를 확인할 때, io_RetryNumber >= Convert.ToInt32(in_Config("MaxRetryNumber")) 작다면 in_QueueRetry의 값을 확인하고 없다면 io_RetryNumber의 값을 +1 증감시키고 다시 System Exception으로 돌아와 CloseAllApplications.xaml을 실행시켜 프로그램을 모두 종료시키고 Process Transaction 단계에서 Initialization 단계로 이동합니다.
Process.xaml
Get Process Data 상태에서 처리할 데이터가 있는 경우 호출됩니다. TransactionItem의 내용에 맞는 처리 부분은 구현하면 됩니다. 추가로 필요한 매개변수가 있는 경우 매개변수를 추가하거나, Config를 이용해서 전달할 수 있습니다.
변수 타입 및 이름 |
전달방식 |
변수 값 |
Dictionary(x:String, x:Object): in_Config |
Input |
Config |
SetTransactionStatus.xaml
예외 발생 시 오류(System Exception, BusinessRuleException) 내용을 반영합니다. 재시작이 설정된 경우 최대 재시작 횟수만큼 재시작을 시도합니다.
변수 타입 및 이름 |
전달방식 |
변수 값 |
Dictionary(x:String, x:Object): in_Config |
Input |
Config |
Exception: in_SystemError |
Input |
SystemError |
BusinessRuleException: in_BusinessRuleException |
Input |
BusinessRuleException |
QueueItem: in_TransactionItem |
Input |
TransactionItem |
Int32: io_RetryNumber |
Input/Output |
RetryNumber |
Int32: io_TransactionNumber |
Input/Output |
TransactionNumber |
TakeScreenshot.xaml
전체 화면을 캡처하여 프로세스가 실행된 위치 폴더를 만들고 저장합니다.
변수 타입 및 이름 |
전달방식 |
변수 값 |
String: in_Folder |
Input |
in_Config("ExScreenshotsFolderPath").ToString |
String: io_FilePath |
Input/Output |
|
Process Transaction 상태전이
상태전이는 Transition(s)으로 표시되며 특정 조건 시 전이대상으로 전이됩니다.
- Success : Exception이 발생하지 않는 경우
- Rule Exception : 비즈니스 룰 예외가 발생한 경우 (비즈니스 룰 예외는 입력 데이터가 올바르지 않는 경우, 재시작해도 해결되지 않습니다.)
- Error : 구현한 프로세스가 정상 동작하지 않거나, 실행한 어플리케이션이 기대한 동작을 하지 않는 경우 (재시작을 하면 해결될 수 있음)
전이명 |
조건 |
전이대상 |
Success |
BusinessRuleException is Nothing AND SystemError is Nothing |
Get Transaction Data |
Rule Exception |
BusinessRuleException is Not Nothing |
Get Transaction Data |
Error |
SystemError is Not Nothing |
Initialization |
Get Transaction을 Orchestrator의 Queue에서 가져오는 상황을 가정하고, Orchestrator에 쌓여 있는 Queue가 10000개라 가정하고 빠른 처리를 위해 5대의 PC가 있다고 가정하겠습니다. 1개의 Queue당 특정 데이터를 조회한다고 하면 Init All Application 부분에서는 브라우저 열기 - 로그인 - 메뉴 이동, Get Transaction에서는 수행해야 할 Queue 데이터 존재 유무 확인, Process.xaml에서는 검색 조건 입력 및 조회를 합니다. 이렇게 하면 결과가 3가지입니다.
- Success : 성공, 데이터 조회도 성공이 되며 다음 Transaction으로 넘어가게 됩니다. (다음 데이터 처리)
- SystemException : 예상 불가능한 오류, 사이트 접속 불가, 내부 망 접속 막힘 등입니다. 설정이 되어 있다면 다시 한 번 시도해 볼 수 있지만 연속으로 특정 횟수 연속으로 발생하게 된다면 작업 자체를 종료하는 의미를 가집니다.
- BusinessException : 예상 가능한 오류, 조회 완료했는데 조회 결과가 없는 경우, 조회할 번호 양식이 알맞지 않는 경우, 프로세스 설계할 때 현업 담당자가 미리 말해 준 설계상 로직이 정상 수행되더라도 발생할 수 있는 예외 사항 등을 말합니다. 단순히 예외 상황이기 때문에 다음 Transaction으로 넘어가게 됩니다. (다음 데이터 처리)
사용되는 인수(변수) 안내
- MaxRetryNumber: 한 Transaction당 SystemException 발생하더라도 시도할 횟수 지정
- Io_ConsecutiveSystemExceptions: 연속으로 SystemException 발생하면 프로그램 종료
전이명 |
조건 |
전이대상 |
SystemException |
SystemException IsNot Nothing |
Initialization |
Business Exception |
BusinessException is Not Nothing |
Get Transaction Data |
Success |
SystemException Is Nothing and BusinessException Is Nothing
|
Get Transaction Data |
※ SystemException이 있을 경우 Initialization 상태로 전이되어 작업이 처음부터 다시 시작되고 BusinessException이나, Success일 경우 Get Transaction Data 상태로 전이되어 다음 Transaction을 받아 작업을 진행합니다.
Get Transaction Data(데이터 가져오기)
겟 트랜잭션 데이터(Get Transaction Data) 단계는 업무에 필요한 데이터를 가져오는 단계입니다. 전 단계의 Config 파일에서 설정된 파일에서 설정된 큐(Queue)로부터 큐 아이템(Queue Item)을 가져와 데이터를 가져옵니다. 처리할 데이터가 없거나 Orchestrator에서 중지로 설정된 경우 End Process로 상태 전이하여 업무를 중지하게 됩니다.
Entry
Workflow 이름 |
작업 내용 |
getTransactionData.xaml |
Get TransactionData 액티비티로 TransactionItem을 저장 |
GetTransactionData.xaml
in_TransactionNumber = 1 일 경우 만 실행, Orchestrator에 Stop으로 설정된 경우 End Process로 이동하게 됩니다.
변수 타입 및 이름 |
전달방식 |
변수 값 |
Int32: in_TransactionNumber |
Input |
TransactionNumber |
QueueItem: out_TransactionItem |
Output |
TransactionItem |
Datatable: io_TransactionData |
Input/Output |
TransactionData |
GetTransactionData.xaml
in_TransactionNumber = 1 일 경우 만 실행, Orchestrator에 Stop으로 설정된 경우 End Process로 이동하게 됩니다.
- No Data: 처리할 데이터가 없거나, Orchestrator에서 Stop으로 설정된 경우
- New Transaction: 처리할 데이터가 있는 경우
전이명 |
조건 |
전이대상 |
No Data |
TransactionItem is Nothing |
End Process |
New Transaction |
TransactionItem isNot Nothing |
Process Transaction |
※ New Transaction 트랜젝션 아이템이 존재하면 대상인 Process Transaction 으로 전이되고, No Data 로 트랜젝션 아이템이 존재하지 않으면 End Process로 전이됩니다.
End Process (프로세스 종료)
앤드 프로세스(End Process) 단계는 모든 업무가 끝나고 프로세스를 종료하는 단계입니다. CloseAllApplications.xaml 파일을 통해 업무 종료 후 모든 프로그램을 종료하는 작업을 합니다. (사용자가 직접 액티비티나 bat 파일 등을 사용하여 종료하는 작업을 지정해줘야 됩니다.) CloseAllApplications.xaml에서 오류가 발생할 경우 KillAllProcesses.xaml을 실행시켜 강제로 종료하게 할 수 있도록 추가적으로 지정을 해야 합니다.
Entry
Workflow 이름 |
작업 내용 |
CloseApplication.xaml |
작업에 사용한 모든 응용프로그램을 종료하는 부분 |
※ Entry의 CloseApplication.xaml는 Try-Catch의 Try 안에서 호출되고, 이 작업에서 오류가 발생할 경우 Catch에서 KillAllProcess.xaml를 호출하여 프로그램을 강제 종료합니다.
Assets
Assets은 일반적으로 다른 자동화 프로젝트에서 사용할 수 있는 공유 변수 또는 자격 증명을 나타냅니다. 로봇이 쉽게 액세스할 수 있도록 특정 정보를 저장할 수 있습니다. 또한 여기에 저장된 자격 증명 유형의 모든 자산이 AES 256 알고리즘으로 암호화되므로 추가 보안 수준이 제공됩니다. 프로세스를 설계할 때 RPA 개발자가 호출할 수 있지만 해당 값은 숨길 수 있습니다.
Assets 페이지에서 새 Assets을 생성할 수 있습니다 . 또한 편집하거나 삭제할 수 있는 이전에 생성된 모든 Assets을 표시합니다. Studio에서 사용 되는 Assets 가져오기 및 자격 증명 가져오기 활동은 제공된 AssetName
에 따라 Orchestrator에서 특정 자산에 대한 정보를 요청합니다 . Studio에서 제공 한 AssetName
이 Orchestrator 데이터베이스에 저장된 자산의 이름과 일치하고 로봇에 필요한 권한이 있는 경우 자동화 프로젝트를 실행할 때 로봇에서 자산 정보를 검색하여 사용합니다.
Assets으로 사용할 수 있는 유형
- Text - 문자열만 저장합니다(따옴표를 추가할 필요는 없음).
- Bool - True 또는 False 값 지원
- Integer - 정수만 저장
- Credential - 로봇이 SAP 또는 SalesForce에 대한 로그인 세부 정보와 같은 특정 프로세스를 실행하는 데 필요한 사용자 이름과 암호를 포함합니다.
https://cloud.uipath.com/ 에 접속하여 오케스트레이터(Orchestrator)항목에 접속합니다. 접속할 때 프레퍼런시즈(Preferen ces, 환경설정)에서 언어 및 테마를 설정 해줄 수 있습니다. [My Workspace]의 [Asset]의 [새 자산 만들기]버튼을 눌러 Asset이름을 정하고 형식을 자격증명(Credential)으로, 사용자 이름과 암호를 지정해줍니다.
Assets에서 비밀번호 가져오기
액티비티 검색에서 Get Credential
액티비티를 가져오고 속성의 입력란의 Asset Name
에 사전에 설정한 Asset의 이름을 넣고 출력란의 Password와 Username항목에 ID값과 PW변수를 넣어 출력해줍니다. 이때 ID는 String으로, PW는 SecureString타입으로 변수유형이 설정되는데(표현은 보통 SStr_변수명
으로 합니다. 메시지박스나 로그메시지로 출력하여도 개발자는 이 비밀번호를 확인 할 수 없습니다. (아래스크린샷의 System.Security.SecureString으로 출력이 됩니다.) 하지만 아래의 변환코드를 사용하면 시큐어스트링(SecureString)타입의 알수없는 비밀번호를 알수도 있습니다. 고객사에서 사용하면 보안에 큰 문제가 발생 할 수 있어 웬만하면 사용하지 않는 걸 권장합니다.
String타입의 변수를 하나만들고, Assign
액티비티를 통해 To에는 String변수를 Value에는 아래 코드를 입력합니다. 그리고 해당 String변수를 출력하면 비밀번호를 확인 할 수 있습니다.
New System.Net.NetworkCredential(String.Empty, 암호화된변수명).Password
아래처럼 반대로 String을 SecureStirng유형으로 변경할 수도 있습니다.
New System.Net.NetworkCredential(String.Empty, 암호화할변수명).SecurePassword
StorageBuckets
스토리지 버킷은 RPA 개발자가 자동화 프로젝트를 생성하는 데 활용할 수 있는 폴더 별 스토리지 솔루션을 제공합니다. 지정된 폴더 범위 내에서 저장소 버킷이 생성되므로 폴더 기능의 세분화된 권한 및 역할 할당 모델을 사용하여 이러한 저장소 버킷 및 해당 콘텐츠에 대한 액세스를 필요한 계정에 대해서만 제어할 수 있습니다.
필요한 권한이 있는 사용자는 구성된 스토리지 버킷의 콘텐츠를 찾아보고 원하는 대로 파일을 업로드하거나 다운로드할 수 있습니다. Storage Buckets 페이지에는 현재 구성된 버킷 이 표시되며 필요한 만큼 추가 스토리지 버킷을 생성할 수 있습니다. https://cloud.uipath.com/ 에 접속하여 오케스트레이터(Orchestrator)항목에 접속합니다. [My Workspace]의 [스토리지 버킷]의 [스토리지 버킷 추가]버튼을 스토리지 버킷 이름을 정하고 만들어줍니다. 이후 이름을 클릭하면 파일을 업로드 할 수 있습니다.
Studio에서 액티비티에 Storage를 검색하여 관련된 기능을 사용할 수 있습니다. 예를 들어 Download Storage File
액티비티를 사용하면 스토리지 버킷으로 업로드 한 파일을 특정한 위치에 다운로드 받을 수 있습니다. 속성에서 path는 스토리 버킷 파일의 이름을, 스토리지 버킷 이름은 스토리지 버킷 이름을 작성하면 됩니다.
License
별도의 라이선스를 구매하지 않는다면 60일 동안 Orchestrator를 사용할 수 있으며 라이선스는 cloud.uipath.com에 접속하여 Orchestrator탭의 [테넌트]항목의 [라이선스] 페이지에서 확인이 가능합니다. 자동화 클라우드에서 라이선스 관리 버튼을 클릭하면 좀 더 상세한 내역을 확인할 수 있습니다. (Attended 라이선스, Developer 라이선스 등)
기타 팁
1) 실행중인 프로그램은 System.Diagnostics.Process.GetProcessesByName("EXCEL")
메소드로 가져올 수 있음. 반환 값은 process[]
으로 카운트로 확인
2) UiPath-1 Office2013 Excel확장 설치이슈 Extension 설정 - UiPath Excel 추가 기능을 작동하려면 Visual Stuio 2010 Tools for office Runtime v10.0.50325 이상이 필요합니다. 링크를 사용하여 수동으로 설치하여 다시 시도하십시오 https://www.microsoft.com/ko-kr/download/details.aspx?id=105671 해당페이지에서 다운로드 후 설치, 재부팅
3) 셀렉터 잡을 때 F4눌러서 모드 바꿔가면서 인식하기
4) DRM걸린 문서는 workbook(x) Excel Application Scope(o)