NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET Core 인공지능 RPA 매크로 프로그램 만들기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 차세대 인공지능 자동화 솔루션(AI RPA Solution)을 개발하기 위해 프로젝트를 생성했습니다. 앞으로 1년동안~ 뚝딱 뚝딱 만들어야 할거 같은데요. 지금도 잘 사용하고 있는 NGM 매크로가 있는데 차세대 RPA 매크로를 만드는지 궁금하실거 같네요. 우선 크게 아래와 같은 이유가 있어서 새롭게 만들어야 합니다.

    • .NET Framework를 .NET Core로 업그레이드
    • 액션 모델의 추상화로 디자인 기능 강화
    • NGM 매크로 엔진의 복잡한 코드 리팩토링
    • 최신 딥러닝 기능 추가 (.NET Framework 미지원으로 .NET Core로 업그레이드)
    • 멀티 스레딩 및 멀티 프로세싱 개선
    • 스크립트 제작 및 사용 편의성 개선
    • 솔루션 용량 최적화

     

    현재 .NET Framework로 만들어진 엔지엠 매크로는 딥러닝 및 인공지능을 적용하기에 한계가 있습니다. 최신의 기술들이 모두 .NET Core에서 동작하기 때문입니다. 참고로, 엔지엠 매크로의 딥러닝은 .NET Core로 만든 라이브러리를 외부에 참조하도록 되어 있습니다. 그렇다보니 중간 변환 단계를 한번 더 거쳐야 해서 100프로의 성능을 낼 수 없는 문제가 있습니다. 이외에도 다양한 문제들로 인해 업그레이드해야 합니다.

     

    기본적인 디자인 및 구조는 엔지엠 6과 동일합니다. 다만, 스크립트 편집기를 WPF로 만들어야 할지 고민중에 있는데요. 이 부분은 차차 결정하기로 하고, 일단은 에디터를 먼저 디자인 해야 합니다. 물론, 프로젝트는 .NET Core를 사용해야 합니다. Visual Studio Community를 실행하고 새로운 솔루션을 만들었습니다. 솔루션의 이름은 NGM2025인데요. 어떤 이름을 사용할지 1시간 고민한거 같습니다. 딱히 좋은 이름이 떠오르질 않아서... 제품명은 NGM 7이 될거 같기도 하네요^^

    2q3g2a9.png

     

     

    기존에 사용하던 GUI 프레임워크 Krypton을 업그레이드 해야 합니다.

    QrKTJ2b.png

     

     

    모든 프로젝트를 업그레이드한 후 빌드하면 에러가 발생합니다. 크립톤 GUI 프레임워크는 상당히 잘 만들어진 솔루션입니다. 에러가 몇개 없더라고요. 아무튼, .NET Framework는 윈도우에서만 작동하기 때문에 큰 문제가 없지만, .NET Core는 크로스 플랫폼이라서 윈도우 전용 라이브러리들은 사용할 수 없습니다. 업그레이드하면서 많은 문제가 발생할줄 알았는데요. 생각보다 문제가 없었습니다.

     

    모든 업그레이드를 마치고, BinaryFormatter와 관련된 모든 코드를 수정했습니다. 관련 내용을 찾아보니 보안 문제로 더이상 지원하지 않는다고 합니다. 그리고, 마이크로소프트의 공식 사이트에서 BinaryFormatter를 제거하기 위한 세부 일정이 공개되어 있었어요. BinaryFormatter를 제거하고, 다른 직렬화 모듈을 사용해야 합니다. 어떤걸 사용할지는 각자의 환경에 따라서 다를겁니다. 참고로, Formatter와 IFormatter도 같이 제거됩니다. Formatter 대신 JsonSerializer 또는 XmlSerializer를 사용하세요.

     

    이제 매인 프로젝트를 하나 생성해야 합니다. 제 경우 솔루션 폴더를 미리 만들어놓고 물리적인 위치도 이와 동일하게 구성했습니다.

    iyguVIQ.png

     

     

    물리적인 파일들은 아래와 같습니다. 솔루션 폴더는 논리적인 개념이라서 비슷하게만 만들어두면 됩니다. 이런식으로 솔루션을 구성하는 이유는 간단합니다. 논리적인 구조와 물리적인 구조를 일치시킴으로써 구조 분석을 쉽게 하기 위함입니다. 이 부분은 프로젝트 구조를 잡는 프로젝트 매니저 또는 개발자 취향이라서 딱히 정답이라고 할건 없습니다. 엔터프라이즈급 프로젝트의 경우엔 경험적으로 아래와 같이 구성하는게 분석하는데 좋았습니다.

    G4mB5jh.png

     

     

    프로젝트 추가는 아래 그림과 같이 Windows Forms 앱을 선택해야 합니다. Windows Forms 앱(.NET Framework)는 사용하지 않습니다.

    t8kfWT9.jpg

     

     

    프레임워크는 .NET 8.0 (장기 지원)을 사용합니다. 최신 딥러닝을 사용하려면 어쩔 수 없는 선택입니다^^;

    OBAGcQ9.jpg

     

     

    매인 프로젝트에서 GUI 프레임워크인 크립톤 프로젝트를 모두 추가해줍니다.

    LfTcp17.jpg

     

     

    엔지엠 매크로의 디자이너를 사용해본 분들은 쉽게 따라할 수 있을겁니다. 엔지엠 디자이너 프레임워크는 매크로에 특화되어 있지만, 개발 프레임워크인건 동일합니다. 대부분의 GUI 프레임워크들이 비슷한 구조를 가지고 있기 때문에 딱히 어려운 부분은 없을거예요.

    bRNULg7.jpg

     

     

    도구 상자에 디자이너 콘트롤처럼 크립톤 콘트롤들이 추가된 것을 확인할 수 있습니다.

    wyUIK81.jpg

     

     

    MainView의 디자인입니다. 리본 메뉴를 상단에 고정시키고, 하단에는 스테이터스 스트립을 붙였습니다. 그리고, 중앙에는 컨트롤을 붙일 수 있는 도킹 매니저를 추가해야 합니다. 엔지엠 매크로에 보면 각각의 독(Dock)들과 페이지들을 떼었다가 붙일 수 있는데요. 이런 기능을 제공해주는 컨트롤이 Dock Manager입니다.

    j3J2nfe.jpg

     

     

    이제 간단하게 좌측과 우측에 독을 하나씩 붙여 볼께요. 독을 붙이기 위해서는 워크 스페이스(Work Space)가 필요합니다. 워크 스페이스 컨트롤을 Dock Manager 위에 추가 해주세요. 그리고, Docks 폴더를 프로젝트에 추가 했습니다. 상하좌우에 위치할 독들은 모두 이 폴더 안에서 구현할겁니다. 지금은 도구 상자(ToolDock)와 속성창(PropertyDock) 2개만 추가되어 있습니다. 나머지 독들은 도구 상자와 유사합니다.

    iU4ie7u.jpg

     

     

    도구 상자에는 검색창과 트리뷰 그리고, 라벨 컨트롤을 위에서부터 하나씩 배치 했습니다.

    lvWC3qF.jpg

     

     

    속성창도 비슷하지만, PropertyGrid 컨트롤을 사용해서 구현해야 합니다.

    K5SWEib.jpg

     

     

    이제 MainView에서 각각의 독들을 왼쪽과 오른쪽에 붙여줘야 합니다. 여기서부터 개발자들의 고민이 시작됩니다. 각각의 컨트롤들을 관리하는 매인에서 인터페이스를 어디까지 허용해야할지 어느 수준까지 추상화해야 할지를 말이죠. 앞서 엔지엠 매크로를 6 버전까지 만들면서 겪어왔던 문제점들을 하나씩 해결할건데요. 도구 상자와 함수 상자 그리고, API등등... 대부분 동일한 구조를 가지고 있습니다. 그리고, 독의 텍스트와 아이콘, 설명이 공통으로 필요하다는것도 알고 있죠.

     

    기존에는 이런 것들이 리소스 매니저와 함께 하드코딩 되어 있었습니다. 그리고, 엔지엠 매크로 GUI의 가장 큰 문제점이었던 공통 부분이 중복되는 문제도 해결해야 합니다. 그래서, 에디터와 플레이어의 GUI를 공통으로 관리해줄 프로젝트를 하나 추가 했습니다. 이렇게 하는 이유는 엔지엠 매크로의 경우 커뮤니티, 얼티밋, 엔터프라이즈등등... 유사한 프로젝트가 많기 때문입니다. 동일한 기능들을 제품 등급에 따라 분류만 하고, 공통적인 내용들은 하나의 모듈로 처리하는게 관리 측면에서 훨씬 더 효율적입니다. 아래와 같이 공통적으로 적용되어야 할 내용들을 관리할 프로젝트를 추가하세요.

    OroVhlv.jpg

     

     

    앞으로는 프레임워크에 있는 코어에서 인터페이스를 상속 받아서 구현만하면 누구나 에디터와 플레이어를 쉽게 만들 수 있도록 할겁니다. 그렇게 하기 위해서는 엔지엠 6에서 종속성을 가지는 인터페이스를 전부 끊어내고 독립적으로 기능을 수행할 수 있게 만들어야 합니다. 사실, 엔지엠 6을 만들 때는 너무도 시간이 촉박했기 때문에 급하게 대충 처리한 것들이 많이 있습니다. 그리고, 급하게 만들다보니 종속성을 해치는 디자인과 설계로 인해 성능이 저하되는 부분도 있는데요. 여러곳에 분산되어 있는 로직을 순환 참조하거나 호출하는 부분들이 대표적인 문제점들입니다.

     

    DockManager 클래스를 만들고, 아래와 같이 코드를 추가 해줍니다.

    using ComponentFactory.Krypton.Docking;
    using ComponentFactory.Krypton.Navigator;
    
    namespace Fw.Client.Editor
    {
        public class DockManager
        {
            public static List<KryptonPage> AttachDocks(KryptonDockingManager dockManager, Ai.Model.Editor.PageModel[] pageModels, string workspace = Ai.Core.Definition.Workspace.DefaultWorkspace, DockingEdge edge = DockingEdge.Left)
            {
                List<KryptonPage> pages = new List<KryptonPage>();
                foreach (var page in pageModels)
                {
                    KryptonPage p = new KryptonPage
                    {
                        Name = page.Name,
                        Text = page.Text,
                        TextTitle = page.TextTitle,
                        TextDescription = page.TextDescription,
                        ImageSmall = page.ImageSmall,
                        UniqueName = page.UniqueName
                    };
    
                    page.View.Dock = DockStyle.Fill;
                    p.Controls.Add(page.View);
                    pages.Add(p);
                }
    
                var ws = dockManager.AddDockspace(workspace, edge, pages.ToArray());
                return pages;
            }
        }
    }

     

     

    이제 매인에서 2개의 독 컨트롤을 추가해야겠죠? 매인뷰의 코드는 아래와 같습니다.

            private void MainView_Load(object sender, EventArgs e)
            {
                KryptonDockingWorkspace workspace = kryptonDockingManager.ManageWorkspace(kryptonDockableWorkspace);
                kryptonDockingManager.ManageControl(kryptonPanel, workspace);
                kryptonDockingManager.ManageFloating(this);
    
                DockManager.AttachDocks(kryptonDockingManager, new Model.Editor.PageModel[] 
                { 
                    new Model.Editor.PageModel 
                    {
                        Name = Ai.Core.Definition.Dock.Tool,
                        View = new Docks.ToolDock()
                    } 
                });
    
                DockManager.AttachDocks(kryptonDockingManager, new Model.Editor.PageModel[]
                {
                    new Model.Editor.PageModel
                    {
                        Name = Ai.Core.Definition.Dock.Property,
                        View = new Docks.PropertyDock(),
                    }
                }, edge: DockingEdge.Right);
            }

     

     

    이제 실행 해봅시다. 화면이 정상적으로 떠야 할텐데요. 긴장 되는군요~

    vQ8avis.jpg

     

     

    오~ 성공입니다. 기존 .NET Framework에서 .NET Core로 업그레이드가 정상적으로 되었네요. 이제 해야할일들이 참 많은데요. 올해안에 신제품을 출시할 수 있었으면 좋겠습니다. 마음에 여유를 가지고 하나씩 튜닝하면서 품질을 높여야 할거 같아요. 그리고, 오래된 패키지들도 업그레이드할께요. 가장 시급한 문제는 일단 딥러닝과 텔레그램입니다. 텔레그램도 오래된 API를 제거하고 있는데요. 그렇다보니 업그레이드를 할 수 없는 문제가 있습니다. 하나씩 하다보면 언젠가는 끝나겠죠^^

     

    다음 글도 기대 해주세요!

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.