NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    에디터 엔지엠 RPA 매크로 - 이벤트 액션에 대한 사용 가이드 및 동작 방식 이해. (매크로 구조와 흐름도)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 엔지엠 매크로에는 동기화된 스크립트 안에서 순차적으로 액션이 실행되는 방식을 사용하고 있습니다. 이런 방식은 모든 프로그래밍 언어와 동일한데요. 이렇게 순차적으로 어떤 동작을 수행하도록 하는게 사람이 가장 이해하기 쉬운 방식이기 때문입니다. 물론, 복잡한 시스템을 만드는 프로그래밍에서는 복잡한 개념들이 더 많이 등장하지만~ 이 부분은 논외로 하고 오늘의 주제에 대해서 알아보는게 좋겠네요^^ 아래 그림은 프로그래밍 또는 매크로를 만들 때 일반적인 구조를 나타내고 있습니다.

    XUu4ANS.png

     

     

    엔지엠 매크로에서 순차구조는 아래와 같습니다. 매크로가 시작되고 순차적으로 어떤 동작을 수행하게 됩니다.

    oHqJZAX.png

     

     

    위 순차구조는 직관적이고 프로그래밍하기가 쉽습니다. 문제가 발생하더라도 원인을 금방 찾을 수 있죠. 다만, 어떤 예상하지 못한 변수에 유연하게 대응하기가 쉽지 않습니다. 아니 불가능하죠. 그래서, 아래 그림과 같이 조건에 따라 행동하도록 스크립트를 작성해야 합니다. 프로그래밍에서는 [ if 조건문 ]을 사용하지만~ 엔지엠 매크로에서는 도구 상자의 조건 카테고리에 있는 액션들을 이용합니다.

    e680kzq.png

     

     

    아래 동영상처럼 스크립트에서 우클릭 후 "디자인 보기"를 클릭 해줍니다. 그리고, 조건 액션을 선택하면 참 또는 거짓에 대한 분기 이동이 어디로 가는지 쉽게 확인이 가능합니다.

    TGl7ar3.gif

     

     

    반복 구조는 [ 액션 이동 ]이나 [ For 반복 ]과 같은 액션을 이용하면 쉽게 만들 수 있습니다.

    a9S2YKy.png

     

     

    스크립트에서 우클릭 후 "디자인 보기"를 클릭하세요. 그리고, 액션 이동을 선택하면 어디로 이동하는지 쉽게 확인할 수 있습니다.

    8wI8r7m.png

     

     

    좀 더 복잡한 스크립트를 작성한다면 아래와 같은 호출구조를 이용할 수 있습니다. 프로그래밍에서는 서브 루틴, 함수, 펑션, 메소드등등... 다양한 이름으로 불리긴 하지만, 결국은 어떤 동작을 하나의 동작으로 묶어놓은 것을 의미합니다. 이는 여러가지 장점이 있는데요. 코드가 길어지는 것을 방지하고, 코드의 재사용성을 높여줍니다. 그리고, 디버깅을 쉽게 해줍니다. 물론, 이외에도 여러가지 방법론들이 존재하지만~ 이건 소프트웨어 공학쪽 이야기라서 자세하게 다루지는 않겠습니다.

    9iKTmHA.png

     

     

    엔지엠 매크로에서 호출구조는 도구상자의 조건 카테고리에 있는 [ 서브 스크립트 ]로 구현됩니다.

    bxj0Hpq.png

     

     

    서브 스크립트도 디자인 보기를 통해 호출구조의 흐름도를 쉽게 추적할 수 있습니다.

    pOH3xgC.gif

     

     

    구조적인 입장에서 약간 다른 내용이긴 하지만, 이벤트에 대해 알려면 병렬구조를 이해해야 합니다. 아래 그림과 같이 병렬구조는 좌측 시작에서 명령 1이 수행되면 비동기로 우측 시작이 실행됩니다. 좌측과 우측 실행이 동시에 동작되게 됩니다. 병렬구조는 시스템에 따라 멀티 프로세스, 멀티 스레드로 나뉘는데요. 설명하려면 복잡하니~ 2개의 동작이 동시에 실행된다고 이해하시면 쉬울듯 합니다.

    Ku8yJDT.png

     

     

    이벤트도 위의 병렬구조와 비슷합니다. 다만, 이벤트는 비동기로 동작하면서 이벤트로부터 콜백을 받을 수 있다는점이 다릅니다. 아래 그림은 동기(Synchronous)와 비동기(Asynchronous)의 프로세스 흐름을 잘 표현하고 있습니다. 동기 방식은 Process A(매인 스크립트)가 Process B(서브 스크립트)를 호출한 후 끝날때까지 멈춰있는 상태를 말합니다. 따라서 Process B가 무한 반복한다면 Process A는 실행될 수 없습니다. 서브 스크립트는 동작 방식을 동기와 비동기를 선택할 수 있습니다. 비동기는 Process A 입장에서 Process B가 언제 끝날지 알 수 없으므로 결과가 어떻게 되었는지 알 수 없습니다. 이 문제를 해결할 수 있는 방법이 이벤트입니다.

    idxmnvM.png

     

     

    여기까지 글을 정독했어도 대부분은 서브 스크립트의 비동기와 서브 스크립트 이벤트가 어떻게 다른지 잘 이해되지 않을겁니다. 앞서 말했듯이 서브 스크립트는 동기 또는 비동기로 동작할 수 있습니다. 그리고, 가장 핵심인 서브 스크립트에서 수행된 내용의 [ 결과를 변환 ]할 수 있습니다. 다만, 비동기의 경우에는 다소 복잡하게 [ 글로벌 변수 ]와 [ 비동기 서브 스크립트 ]를 사용해야 합니다. 기존 방식의 스크립트를 작성하기 어려운 부분들을 서브 스크립트 이벤트로 쉽게 처리할 수 있습니다. 테스트를 위해 아래와 같이 서브 스크립트를 하나 생성해줍니다.

    wx6uuHm.gif

     

     

    서브 스크립트는 [ 이미지 매치 ]와 [ 액션 이동 ] 그리고, [ 결과 반환 ]으로 간단하게 이루어져 있습니다. 좌측 그림판의 오랜지색 점이 나타나면 결과 반환 액션으로 이동하고, 이 스크립트는 완료됩니다. 만약, 오랜지색 점이 나타나지 않으면 액션 이동으로 무한 반복하게 됩니다. 물론, 반복 횟수나 시간을 정해놓고, 처리해도 됩니다. 아래는 매인 스크립트의 내용입니다. 서브 스크립트 이벤트가 실행되고, 그룹 (반복)과 액션 이동으로 무한 반복하게 됩니다. 이 부분에 다른 서브 스크립트나 또는 로직을 넣어서 매인 스크립트가 동작하게 됩니다. 스크립트가 동작하면서 서브 스크립트는 계속 무언가 처리하고, 조건에 맞으면(오랜지색 점을 찾으면...) 종료 액션으로 이동하고 매인 스크립트도 완료되게 됩니다.

    jVkt2lJ.png

     

     

    스크립트를 실행하면 서브 스크립트가 실행되고, 오랜지색 점이 나타날 때까지 반복 수행됩니다. 최소화했던 그림판을 활성화하면 오랜지색 점이 나타나게되고 서브 스크립트는 결과를 반환하면서 완료됩니다. 그리고, 매인 스크립트는 서브 스크립트의 결과에 따라 그룹(종료)로 이동한 후 스크립트가 완료됩니다.

    PpuLixB.gif

     

     

    이벤트를 사용하면 윈도우에서 발생되는 소리에 따라 비동기로 반응하는 매크로도 제작할 수 있습니다. 소리 크기 체크 이벤트의 기본 동작은 [ 소리 크기 체크 ] 액션과 동일합니다. 다만, 이벤트인만큼 스크립트 동작과는 별개로 개별적으로 수행되며, 조건에 만족하면 즉시 사용자가 설정한 아이디로 루틴이 이동됩니다. 유튜브 동영상을 PIP 모드로 띄워놓고, 소리 크기 체크 이벤트를 실행 했습니다. 스크립트를 실행한 후 동영상을 재생하면 사운드가 출력되기 때문에 이벤트에 등록한 "종료" 아이디로 이동하고 스크립트가 완료됩니다.

    vq5soJh.gif

     

     

    이 테스트를 수행하기 위해서는 이벤트를 추가한 후 아래와 같이 소리 크기 체크 액션의 속성을 설정하세요. 엔지엠 매크로에서 제공하는 모든 이벤트가 동일하지만, 속성에서 성능 옵션이 중요합니다. 이 값은 컴퓨터 성능에 좌우되므로 충분히 테스트 후 적절한 값으로 설정하세요. 단순히 예를 들어서, 소리 크기를 가져오는 일을 수행하는데 이 동작에 소요되는 시간이 100이라고 가정해봅시다. 이 때 성능 옵션을 10으로 주면 90만큼 성능을 따라가지 못해서 처리 시간이 90만큼 계속 지연되며 누적됩니다. 무한대로 이 값이 커지면 프로그램이 오작동하니 컴퓨터 성능에 따라 여유있게 설정해야 합니다.

     Zqx6nxr.png

     

     

    유튜브에서 사운드가 출력될 때까지 반복하면서 스크립트가 동작해야 하므로, 아래 그림과 같이 반복되는 루틴을 추가합니다. 그룹의 아이디는 "반복"이며 액션 이동에서 그룹의 "반복"으로 이동시킵니다. 이렇게하면 윈도우에서 사운드가 출력되지 않는한 계속해서 그룹과 액션 이동이 무한으로 순환하게 됩니다.

    m1flvnk.png

     

     

    화면에서 이미지를 주기적으로 찾으려면 [ 액션 이동 ] 또는 [ 액션 반복 ]을 사용해야 합니다. 이런 경우에는 다른 루틴을 실행하면서 체크할 수 없어서 비효율적인면이 존재합니다. 이벤트를 사용하면 실행중인 스크립트와 별개로 이미지를 찾으면 이벤트가 발동되고, 설정한 아이디로 바로 점프합니다. 또한, 예약 작업 이벤트를 통해 크론탭으로 설정한 시간에 원하는 스크립트를 실행시킬수도 있습니다. 이 기능은 매우 강력한 스크립트를 제작할 수 있도록 도와줍니다. [ 이미지 서 ]는 윈도우 화면에 사용자가 찾고 싶은 이미지가 출현하면 이벤트가 발생하고 원하는 루틴으로 이동할 수 있습니다.

    1. 이벤트 위치는 도구 상자 > 조건 > 이미지 서치 이벤트입니다.
    2. 더블 클릭 또는 드래그 앤 드롭으로 스크립트에 이벤트를 추가하세요.

    Lqj0Huc.png

     

     

    이미지 서치 이벤트를 테스트하려면 윈도우 화면에서 비교할 이미지를 먼저 만들어야 합니다. 아래 동영상을 참고하여 이미지를 캡쳐하세요.

    h8XsPbl.gif

     

     

    이미지 서치 이벤트를 테스트하려면 다음과 같은 시나리오가 필요합니다. 사용자가 설정한 이미지를 윈도우 화면에서 찾는 이벤트를 등록해줍니다. 그리고, 설정한 이미지가 화면에 출현할때까지 다른 로직을 수행하는 스크립트를 만듭니다. 여기에서는 [ 그룹 ]과 [ 액션 이동 ]으로 무한 반복하도록 했습니다. 사용자가 이미지 서치 이벤트에 설정한 이미지가 윈도우 화면에 출현하면 이벤트 트리거가 동작하고, 이벤트에 설정한 아이디로 이동됩니다. 이 예제에서는 종료 그룹으로 이동하기 때문에 스크립트는 완료됩니다. 아래와 같이 스크립트를 구성하세요.

    mcnkP7M.png

     

     

    그룹 액션들은 반복과 이벤트가 발생했을 때 스크립트를 종료하기 위한 아이디를 설정 해줍니다. 그룹에 각각 아이디를 "반복"과 "종료"로 설정하세요.

    bSz39zK.png

     

     

    액션 이동 ] 액션에서 그룹의 반복으로 이동시킵니다.

    ZP5w4zq.png

     

     

    이미지 서치 이벤트가 발생하면 "종료" 액션으로 이동하도록 설정했습니다. 따라서, 아래 동영상처럼 "반복" 액션으로 액션 이동이 되면서 무한 반복하다가 이미지가 출현하면 스크립트가 종료하게 됩니다. 캡쳐한 이미지가 안보이도록 창을 최소화하고, 스크립트를 실행하세요. 그리고, 창을 다시 복구하면 이미지를 찾았기 때문에 이미지 체크 이벤트가 발생하고 "종료" 액션으로 이동하면서 스크립트는 완료됩니다.

    tO0PrQN.gif

     

     

    이벤트도 액션과 동일하게 변수를 사용할 수 있습니다. 다만, 이벤트가 발생한 시점에 변수에 값을 넣어주고, 이동한 액션 아이디에서 이 값을 사용할 수 있습니다. 변수를 사용하기 위해 아래 그림과 같이 변수를 하나 추가하고, 이미지 서치 이벤트에서 이미지의 마우스 좌표를 변수에 저장해줍니다.

    ※ 아래 동영상은 이미지 체크 이벤트인데요. 이미지 서치 이벤트도 동일하니 똑같이 변수를 추가하시면 됩니다.

    mML9BDv.gif

     

     

    이벤트가 발생했다는건 사용자가 찾을 이미지가 화면에 출현했다는 뜻입니다. 그러므로 이미지의 좌표와 마우스 위치를 알 수 있습니다. 변수에 좌표 값이 제대로 저장되었는지 확인하기 위해 아래 동영상처럼 변수를 가져와서 값을 확인 해보세요.

    CU5Sgxq.gif

     

     

    결과를 확인 해보면~ 아래 그림과 같이 "종료" 액션의 설명에 좌표값이 표시되는걸 알 수 있습니다.

    APHJnCm.png

     

     

    변수의 값이 변경되는 시점도 알 수 있습니다. 변수는 처음 접하는 경우 어려운 개념입니다. 변수에 대해 이해하려면, [ 변수에 대한 이해 ]와 [ 글로벌 변수와 로컬 변수에 대한 이해 ]를 보시면 도움이 될겁니다. 처음 스크립트를 제작하는거라면 마음에 여유를 가지고, 천천히 개념을 정리해둬야 합니다. 중간 중간 건너뛰는게 더 빠를거 같지만, 기본기가 잘 갖춰져 있을수록 학습 속도도 빨라지게 됩니다. 결국은 처음엔 느린거 같지만~ 기본기가 탄탄할수록 구조도 잘 정리되고 불필요한 로직을 제거해서 더 아름다운 코드 또는 스크립트를 만들 수 있게 됩니다. 

     

    이 예제를 따라하려면, 아래 그림과 같이 좌측 함수 상자의 변수 카테고리에서 "변수 값 변경 이벤트"를 스크립트에 추가하세요. 변수 값 변경 이벤트는 말 그대로, 사용자가 선택한 변수에 값이 변경되면 이벤트가 발생되고 사용자가 원하는 액션으로 이동됩니다.

    V389Pl9.png

     

     

    변수의 값이 변경되는지 확인하기 위해 [ 변수 추가 ] 액션을 추가하고, 가장 위에 올려둡니다. 변수의 값이 변경될 때까지 수행할 루틴 또는 스크립트를 만듭니다. 아래 그림처럼 그룹과 액션 이동으로 무한 반복하도록 구성했습니다. 반복되는 루틴은 게임에서 자동 사냥을 하다가 필드에 보스몹이 뜨는 시간이 된다면 보스몹을 잡으러 가는 스크립트가 실행되어야 한다거나, 도착한 이메일을 다른곳으로 발송하다가 새로운 이메일이 오면 중지하고 관리자에게 알람을 보내야 하는 로직으로 대체할 수 있습니다. 물론, [ 서브 스크립트 ]를 이용해서 다양한 방법으로 사용이 가능합니다.

    iCOqUmh.png

     

     

    변수 값 변경 이벤트는 마지막 "종료" 액션으로 이동하도록 만듭니다. 그리고, 값이 변경되는 변수를 선택해주세요.

    IcJDdQo.png

     

     

    아래 동영상처럼 변수의 값을 변경 해주세요. 액션 이동은 반복될 때 마다 반복 횟수가 증가합니다. 이 값을 변수에 넣으면 처음 변수를 선언했을 때 값이 null(아무것도 없는)이었다가 액션 이동 후 1로 업데이트 됩니다. null에서 1로 변수의 값이 변경된거죠.

    3edpwxu.gif

     

     

    완성된 스크립트를 실행(Ctrl+Alt+F8) 해볼까요? 아래 동영상처럼 액션 이동을 만나면 무한 반복되는 구간을 벗어나서 스크립트가 완료됩니다. 그리고, 변수 값 변경 이벤트의 속성에서 이전 값과 현재 값을 보면 변수의 데이타가 어떻게 변경 되었는지 확인이 가능합니다.

    OvR4CMX.gif

     

     

    사용자 또는 다른 프로그램에서 마우스 클릭이나 키보드 입력에 대해 실시간으로 반응할 수 있습니다. 또한, 타임아웃 이벤트를 통해 설정한 시간에 원하는 스크립트를 실행시킬수도 있습니다. 이 기능은 매우 강력한 스크립트를 제작할 수 있도록 도와줍니다. 스크립트 제작자는 원하는 로직을 수행하면서 백그라운드에서 처리되는 타임아웃에 따라 정해진 시간에 원하는 액션으로 이동할 수 있습니다.

    1. 이벤트 위치는 도구 상자 > 시간 > 타임아웃 이벤트입니다.
    2. 더블 클릭 또는 드래그 앤 드롭으로 스크립트에 이벤트를 추가하세요.

    K7HVGDF.png

     

     

    타임아웃 이벤트를 테스트하려면 다음과 같은 시나리오가 필요합니다. 사용자가 설정한 시간이 경과한 후 발생시킬 이벤트를 등록해줍니다. 그리고, 설정한 시간이 경과할 때까지 다른 로직을 수행하는 스크립트를 만듭니다. 여기에서는 [ 그룹 ]과 [ 액션 이동 ]으로 무한 반복하도록 했습니다. 사용자가 타임아웃에 설정한 시간이 경과하면 이벤트 트리거가 동작하고, 이벤트에 설정한 아이디로 이동됩니다. 이 예제에서는 종료 그룹으로 이동하기 때문에 스크립트는 완료됩니다. 아래와 같이 스크립트를 구성하세요.

    igDzik0.png

     

     

    그룹 액션들은 반복과 이벤트가 발생했을 때 스크립트를 종료하기 위한 아이디를 설정 해줍니다. 그룹에 각각 아이디를 "반복"과 "종료"로 설정하세요.

    qJidK8G.png

     

     

    지연 ] 액션은 반복되는 구간을 1초 지연시킵니다. [ 액션 이동 ] 액션에서 그룹의 반복으로 이동시킵니다. 이렇게하면 해당 구간이 무한으로 반복됩니다.

    ZAPuNyW.png

     

     

    "타임아웃 이벤트"의 "액션 이동 아이디" 속성은 종료 그룹으로 선택 해줍니다. 사용자가 설정한 시간이 경과하면 이벤트가 발생되고, "종료" 아이디를 가진 마지막 그룹 액션으로 이동합니다. 그리고, 스크립트가 완료됩니다. 이 액션은 직접 테스트 해보면 결과를 확인할 수 있습니다. 아래 동영상처럼 3초의 시간을 설정하고 실행 해보세요. 그리고, 액션 이동의 반복 값을 확인해보면 3이 찍혀있는걸 알 수 있습니다. 이 의미는 1초 간격으로 반복하는 구간이 3번 실행되었다는 뜻입니다.

    81ifLUi.gif

     

     

    이외에도 여러가지 다양한 이벤트가 존재합니다. 엔지엠 엔터프라이즈 버전을 사용하신다면 디자이너와 프레임워크를 사용할수도 있는데요. 이 때에는 더 많은 이벤트를 사용할 수 있습니다. 이 내용은 개발자를 대상으로 작성되었으며, 학습하려면 [ 이 글 ]을 먼저 읽어보고 오셔야 합니다. 자~ 이전 글인 로그 기록을 학습하셨나요? 그러면 좀 더 파워풀하게 스크립트 플레이어를 제어할 수 있는 방법에 대해 알아보겠습니다. 아래와 같이 폼을 디자인하고 코드를 추가 해봅시다.

    0crqlb8.png

     

     

    액션의 정보는 실행 전 액션과 실행 후 액션을 가져올 수 있습니다. 이벤트를 둘다 추가해주세요.

    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace FrameworkTest
    {
        public partial class Form1 : Form
        {
            private Designer.Component.ScriptView sv = null;
    
            public Form1()
            {
                InitializeComponent();
                
                // isBackground 파라메터를 false로 명시하지 않으면 뷰를 생성하지 않고 백그라운드로 실행됩니다.
                sv = new Designer.Component.ScriptView(
                    new Designer.ComponentDefault.MainView(), 
                    Path.Combine(GetDefaultScriptPath(),
                    "웹테스트.ngs"), false);
    
                // 로그를 보려면 Output을 활성화 해야 합니다.
                sv.MainView.IsOutput = true;
                // 액션에서 로그를 기록할 카테고리를 설정합니다.
                sv.MainView.ShowApplicationOutput = true;
                sv.MainView.ShowConditionOutput = true;
                sv.MainView.ShowDebugOutput = true;
                sv.MainView.ShowDefaultOutput = true;
                sv.MainView.ShowFunctionOutput = true;
                sv.MainView.ShowHardwareOutput = true;
                sv.MainView.ShowKeyboardOutput = true;
                sv.MainView.ShowMemoryOutput = true;
                sv.MainView.ShowMouseOutput = true;
                sv.MainView.ShowTimeOutput = true;
                (sv.MainView as NGM.Interface.IExternalView).LogReceived += Form1_LogReceived;
                sv.Player.BeforeCurrentAction += Player_BeforeCurrentAction;
                sv.Player.AfterCurrentAction += Player_AfterCurrentAction;
            }
    
            private void Player_BeforeCurrentAction(object sender, NGM.Events.TreeNodeActionArgs e)
            {
                throw new NotImplementedException();
            }
    
            private void Player_AfterCurrentAction(object sender, NGM.Events.TreeNodeActionArgs e)
            {
                throw new NotImplementedException();
            }
    
            private void Form1_LogReceived(object sender, NGM.Events.LogWriteArgs e)
            {
                richTextBox1.Invoke((Action)delegate
                {
                    richTextBox1.AppendText($"{e.Message}{Environment.NewLine}");
                    richTextBox1.ScrollToCaret();
                });
            }
    
            private string GetDefaultScriptPath()
            {
                // 기본 폴더 위치를 만듭니다.
                return Path.Combine(
                    Environment.GetFolderPath(
                        Environment.SpecialFolder.MyDocuments), "NGM6", "Script");
            }
    
            private void button1_Click(object sender, System.EventArgs e)
            {
                try
                {
                    // 스크립트를 실행합니다.
                    sv.Play();
                }
                catch (Exception ex)
                {
                    // 실행중에 에러가 발생하면 사용자에게 메시지를 표시합니다.
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }

     

    이벤트 핸들러는 기본 생성자에 추가된 아래 내용입니다.

    sv.Player.BeforeCurrentAction += Player_BeforeCurrentAction;
    sv.Player.AfterCurrentAction += Player_AfterCurrentAction;

     

    액션 실행 전과 액션 실행 후 이벤트 처리기를 구현해야 하겠죠? 아래 내용은 액션에 아이디가 설정된 경우에만 로그를 기록하는 방법입니다. 만약, 조건 관련된 액션이 있다면 조건의 결과에 따라 로그를 처리하도록 할수도 있습니다. 이 내용은 아주 중요한 내용입니다.

    private void Player_BeforeCurrentAction(object sender, NGM.Events.TreeNodeActionArgs e)
    {
        var actionModel = e.ActionItem.Tag as NGM.Models.BaseModel;
    
        if (!string.IsNullOrEmpty(actionModel.ID))
        {
            richTextBox1.Invoke((Action)delegate
            {
                richTextBox1.AppendText($"{actionModel.ID}{Environment.NewLine}");
                richTextBox1.ScrollToCaret();
            });
        }
    }
    
    private void Player_AfterCurrentAction(object sender, NGM.Events.TreeNodeActionArgs e)
    {
        var actionModel = e.ActionItem.Tag as NGM.Models.BaseModel;
    
        if (!string.IsNullOrEmpty(actionModel.ID))
        {
            richTextBox1.Invoke((Action)delegate
            {
                richTextBox1.AppendText($"{actionModel.ID}{Environment.NewLine}");
                richTextBox1.ScrollToCaret();
            });
        }
    }

     

    우선, 실행한 결과를 볼까요? 스크립트를 에디터로 열어서 보면 2번씩 로그가 찍혀 있는걸 알 수 있습니다. 이는 실행 전과 실행 후가 동일한 로직으로 되어 있기 때문입니다.

    9RjhEwq.png

     

     

    예제는 간단하지만, 좀 더 기술적인 부분을 얘기 해봐야 합니다. 실행 전과 후 이벤트는 동기적으로 동작합니다. 그렇기 때문에 디버깅을 할 때 각각의 값을 확인하고 추가적인 로직을 알맞게 구성할 수 있는 막강한 방법을 제공합니다. 원래 기획은 단순히 모델만을 제공하려 했으나, 전체적인 구조를 가져올 수 있도록 했습니다. 중단점(Break Point)을 걸어보세요.

    zzCGiGw.png

     

     

    직접 실행창에서 아래와 같이 테스트 해보면 현재 실행중인 액션 이외에도 접근이 가능한걸 알 수 있습니다. 이 의미는 읽기, 쓰기 속성(Property)은 미리 처리하거나 값을 위변조 할 수 있다는 뜻입니다. 사용자가 서비스하는 제품과 엔지엠 RPA의 개별 동작을 유기적으로 결합해서 사용할 수 있는 강력한 방법을 제공합니다.

    FVy5el5.png

     

     

    대부분의 RPA 서비스 회사들은 대기업 위주로 서비스되고 있습니다. 공장 또는 공정 자동화도 대기업 위주였습니다. 이 부분은 이미 포화 상태라 더이상 비즈니스가 이루어지지 않고 있습니다. 유지보수로는 회사가 성장하는데 한계가 명확하거든요. 그래서, Office Automation으로 눈을 돌리게 되었고, 매크로에서 확장된 개념인 RPA가 나오게 되었습니다. 대기업을 바라보는 RPA 서비스들은 1년 라이센스가 1,000만원에서 3,000만원까지 다양합니다. 글로벌 대기업들이 뛰어들고 있는 분야죠. 하지만, 엔지엠 RPA는 개인 및 중소기업의 자동화에 집중하고 있습니다. 1년에 수천만원에 달하는 라이센스를 지불하면서 수익을 보전하기는 불가능합니다. 하지만, 엔지엠의 높은 품질과 가격은 가성비로 보면 충분히 경쟁력이 있다고 생각합니다.

     

    RPA는 아직도 개발되지 않은 많은 산업 분야가 존재합니다. 단순 반복적인 업무를 자동화하여 고용과 인력이 감소한다는 의미는 아닙니다. RPA는 단순 반복적인 업무를 컴퓨터에게 처리하도록 하고, 담당자는 좀 더 생산적이고 창의적인 업무에 시간을 할당할 수 있도록 도와줍니다. 모두에게 평등한건 주어신 시간뿐입니다. 이 시간을 얼마나 효율적으로 분배하고 사용하는지에 따라 차이가 발생합니다. 같은 1시간을 사용하더라도 생산적이고 창의적인 생각을 하는게 어떨까요?

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.