프로젝트 구조
architecture
front-end
프론트엔드는 이 프로젝트의 주요 특징 중 하나인 "Drag & Drop으로 간단한 시나리오 구축"을 잘 나타내기 위하여 단일 페이지 웹 어플리케이션을 구성할 수 있는 React JS로 개발을 진행하고 있습니다.
그리고, 다양한 플랫폼을 네이티브 지원하는 Electron 프레임워크로 구성하여 파일과 같은 기능을 잘 지원할 수 있도록 설계하고 있습니다.
UI 는 작업 목록과 시나리오 공간을 서로 그리드 UI 형식으로 분리하여 사용자가 드래그를 할 수 있다는 점을 직관적으로 나타내려 노력하고 있습니다.
back-end
백엔드는 Python 3 기반의 Flask 프레임워크로 마이크로서비스 형태를 지향하며 개발하였습니다.
별도의 ADB 서버에 연결된 서비스와 이미지 처리 서비스, 변수 관리 서비스는 각자 프로세스가 분리되어 있으며, 각 서비스의 주요 기능 코드는 Pypi 패키지로 분리되어 추상화되어 있으므로, 언제든지 개선하거나 새로운 기능을 추가할 수 있습니다.
주요 동작
사용자가 스튜디오 클라이언트에서 작업 항목을 마우스로 끌어서 시나리오 공간에 놓으면, 이벤트 리스너로 인하여 내부 API 가 호출되어 체인에 연결하게 됩니다.
작업 체인이 완성되어 사용자가 시나리오를 실행한다면, 작업에 따라 이미지 처리 및 변수 관리 서바스를 거쳐서 안드로이드 에이전트에 명령이 전달되게 됩니다.
에이전트에 연결된 안드로이드 스마트폰으로 명령이 순서대로 진행되면서 화면으로 피드백을 받게 됩니다.
서버의 관점으로 보면, 클라이언트에서 POST 요청으로 작업명과 작업 속성을 전송하면 API 서버에서 받아서 안드로이드 스마트폰과 직접 연결된 AGENT 모듈로 알맞은 명령을 전달합니다.
작업을 스케줄러에 등록하기 위해 서버로 수신받을 때는 GET, POST, DELETE 호출을 구분하여 설계했습니다.
시나리오를 직접 실행하거나 제어하는 명령은 GET 호출로 진행하고, 사용자가 드래그 & 드롭하여 시나리오를 작성하는 순간 이루어지는 함수 등록 동작은 작업명과 속성 값을 포함하여 POST 호출하게 됩니다.
Sub packages
다음과 같이 서브 패키지로 구성되어 있습니다.
- f-scheduler
함수 스케줄러 패키지로서, 기본 오퍼레이터, 반복 함수 오퍼레이터, 분기 오퍼레이터에 의해서 파이썬 함수를 순서대로 실행합니다.
각 오퍼레이터는 반환 값을 조회하거나, 반복 횟수를 제어할 수 있으며, 추가로 분기 오퍼레이터는 참 거짓 값에 따라서 실행을 중단시킬 수 있습니다.
스케줄러는 베이스 클래스를 중심으로 각자 상속받아서 추가적으로 실행 메소드만 구현하면 되도록 설계하였습니다.
각 작업 오퍼레이터를 순서대로 연결했으면, DAG 객체에 작업을 등록하고 run 메소드로 첫 작업부터 실행할 수 있습니다.
- easy_adb
ADB (안드로이드 디버그 브릿지) 제어하는 패키지로서, 바이너리를 내려받고 서버를 실행하게 도와줍니다.
그리고 명령어 모듈로 물리 안드로이드 기기에 명령어를 보내거나 파일을 가져오는 작업을 진행하게 됩니다.
ADB 서버로 다양한 안드로이드 동작이나 입력 이벤트를 처리하고 있습니다.
ADB 명령어를 보내는 객체는 싱글톤 패턴으로 작동되어 중복 실행을 방지하고 있으며, 이번 프로젝트에서는 하나의 물리 기기에 하나의 시나리오만 처리 분석한다는 전제 조건으로 진행되었습니다.
- q-logger-py
로그 시스템을 구성하기 위한 패키지로서, 표준 입출력 외에 파일 로그 처리를 빠르게 하기 위해서 대기열에 일정 부분 쌓고, 워커가 한 번에 입력을 처리하여 IO 속도로 인해 성능이 저하되는 현상을 제거하고자 의도했습니다.
표준 출력과 파일 로그 모듈이 공통으로 사용하는 메소드는 베이스 클래스로 정의하고, 서로 다른 기능만 개별 구현했습니다.
대기열 객체는 로그를 담을 자료구조만 생성하고, 베이스 핸들러의 필수 메소드인 emit 메소드만 구현했습니다.
빠른 파일 로깅을 목적으로 진행하여, 해당 로그 패키지로 로그를 발생시켰을 때 얼마나 성능이 개선되었는지 측정했습니다.
비교할 표준 파일 핸들러는 구현한 파일 핸들러와 방식이 가장 유사한 rotating file 핸들러로서, 하나의 파일에 5만 바이트를 기록하면 최대 5개 로그 파일까지 로그를 남겨 만 개의 로그부터 십만 개의 로그까지 측정했습니다.
테스트한 환경이 일부분 케이스라서 실사용을 해보면 체감하는 성능이 다를 수 있습니다.
- image-finder
이미지 처리 패키지로서, 템플릿 매칭 기능과 텍스트 추출 기능을 제공합니다.
추가로 클릭 좌표를 점으로 그리거나, 특정 범위를 박스로 그려서 디버깅을 용이하게 하는 함수도 제공합니다.
템플릿 매칭 기능은 찾을 위치의 이미지 바이트와 기준점을 설정하여 N % 이상 정확도를 가진 위치 후보 중 첫 번째 위치 좌표를 반환합니다.
텍스트 추출 기능은 좌측 상단 X, Y 좌표와 우측 하단 X, Y 좌표 구간의 내부에 존재하는 영어, 한국어를 인식하여 텍스트를 추출합니다.
- flask-variable-manager
Flask 서버에서 변수를 관리하는 확장 플러그인으로서, 파이썬 빌트인 함수와 속성을 사용할 수 있는 시스템과 사용자 변수를 저장하고 사용할 수 있는 로컬로 분리되어 있습니다.
이러한 기능을 제어하기 위한 변수 입출력과 변수를 템플릿 렌더링 라우터가 존재합니다.
추가로 파이썬 스크립트를 실행하고, 제 3자 패키지를 가져올 수 있는 라우터도 같이 제공합니다.